On Mon, Dec 07, 2015 at 12:07:28AM +0100, Thomas Monjalon wrote:
> 2015-12-02 15:53, Panu Matilainen:
> > This (and other changes in patch 2 breaks the librte_vhost ABI again, so 
> > you'd need to at least add a deprecation note to 2.2 to be able to do it 
> > in 2.3 at all according to the ABI policy.
> > 
> > Perhaps a better option would be adding some padding to the structs now 
> > for 2.2 since the vhost ABI is broken there anyway. That would at least 
> > give a chance to keep it compatible from 2.2 to 2.3.
> 
> Please could you point where the vhost ABI is broken in 2.2?

Thomas, here are the changes to rte_virtio_net.h:


$ git diff 
381316f6a225139d22d39b5ab8d50c40607924ca..19d4d7ef2a216b5418d8edb5b004d1a58bba3cc1
 \
      -- lib/librte_vhost/rte_virtio_net.h >
diff --git a/lib/librte_vhost/rte_virtio_net.h 
b/lib/librte_vhost/rte_virtio_net.h
index e3a21e5..426a70d 100644
--- a/lib/librte_vhost/rte_virtio_net.h
+++ b/lib/librte_vhost/rte_virtio_net.h
@@ -89,6 +89,7 @@ struct vhost_virtqueue {
        volatile uint16_t       last_used_idx_res;      /**< Used for multiple 
devices reserving buffers. */
        int                     callfd;                 /**< Used to notify the 
guest (trigger interrupt). */
        int                     kickfd;                 /**< Currently unused 
as polling mode is enabled. */
+       int                     enabled;
        struct buf_vector       buf_vec[BUF_VECTOR_MAX];        /**< for 
scatter RX. */
 } __rte_cache_aligned;

@@ -96,7 +97,6 @@ struct vhost_virtqueue {
  * Device structure contains all configuration information relating to the 
device.
  */
 struct virtio_net {
-       struct vhost_virtqueue  *virtqueue[VIRTIO_QNUM];        /**< Contains 
all virtqueue information. */
        struct virtio_memory    *mem;           /**< QEMU memory and memory 
region information. */
        uint64_t                features;       /**< Negotiated feature set. */
        uint64_t                protocol_features;      /**< Negotiated 
protocol feature set. */
@@ -104,7 +104,9 @@ struct virtio_net {
        uint32_t                flags;          /**< Device flags. Only used to 
check if device is running on data core. */
 #define IF_NAME_SZ (PATH_MAX > IFNAMSIZ ? PATH_MAX : IFNAMSIZ)
        char                    ifname[IF_NAME_SZ];     /**< Name of the tap 
device or socket path. */
+       uint32_t                virt_qp_nb;     /**< number of queue pair we 
have allocated */
        void                    *priv;          /**< private context */
+       struct vhost_virtqueue  *virtqueue[VIRTIO_NET_CTRL_MQ_VQ_PAIRS_MAX];    
/**< Contains all virtqueue information. */
 } __rte_cache_aligned;

 /**
@@ -131,7 +133,7 @@ struct virtio_memory {
 };

 /**
- * Device operations to add/remove device.
+ * Device and vring operations.
  *
  * Make sure to set VIRTIO_DEV_RUNNING to the device flags in new_device and
  * remove it in destroy_device.
@@ -140,12 +142,18 @@ struct virtio_memory {
 struct virtio_net_device_ops {
        int (*new_device)(struct virtio_net *); /**< Add device. */
        void (*destroy_device)(volatile struct virtio_net *);   /**< Remove 
device. */
+
+       int (*vring_state_changed)(struct virtio_net *dev, uint16_t queue_id, 
int enable);      /**< triggered when a vring is enabled or disabled */
 };

 static inline uint16_t __attribute__((always_inline))
 rte_vring_available_entries(struct virtio_net *dev, uint16_t queue_id)
 {
        struct vhost_virtqueue *vq = dev->virtqueue[queue_id];
+
+       if (!vq->enabled)
+               return 0;
+
        return *(volatile uint16_t *)&vq->avail->idx - vq->last_used_idx_res;
 }


        --yliu 

Reply via email to