From: Changchun Ouyang <changchun.ouy...@intel.com> The new API rte_vhost_core_id_set() is to bind a virtq to a specific core, while the another API rte_vhost_core_id_get() is for getting the bind core for a virtq.
The usage, which will be introduced soon, could be find at examles/vhost/main.c. Signed-off-by: Changchun Ouyang <changchun.ouyang at intel.com> Signed-off-by: Yuanhan Liu <yuanhan.liu at linux.intel.com> --- lib/librte_vhost/rte_vhost_version.map | 7 +++++++ lib/librte_vhost/rte_virtio_net.h | 25 +++++++++++++++++++++++++ lib/librte_vhost/virtio-net.c | 25 +++++++++++++++++++++++++ 3 files changed, 57 insertions(+) diff --git a/lib/librte_vhost/rte_vhost_version.map b/lib/librte_vhost/rte_vhost_version.map index 3d8709e..2ce141c 100644 --- a/lib/librte_vhost/rte_vhost_version.map +++ b/lib/librte_vhost/rte_vhost_version.map @@ -18,5 +18,12 @@ DPDK_2.1 { global: rte_vhost_driver_unregister; +} DPDK_2.0; + + +DPDK_2.2 { + global: + rte_vhost_core_id_get; + rte_vhost_core_id_set; } DPDK_2.0; diff --git a/lib/librte_vhost/rte_virtio_net.h b/lib/librte_vhost/rte_virtio_net.h index fd87f01..3b75d18 100644 --- a/lib/librte_vhost/rte_virtio_net.h +++ b/lib/librte_vhost/rte_virtio_net.h @@ -90,6 +90,7 @@ struct vhost_virtqueue { int callfd; /**< Used to notify the guest (trigger interrupt). */ int kickfd; /**< Currently unused as polling mode is enabled. */ int enabled; + uint32_t core_id; /**< Data core that the vq is attached to */ struct buf_vector buf_vec[BUF_VECTOR_MAX]; /**< for scatter RX. */ } __rte_cache_aligned; @@ -244,4 +245,28 @@ uint16_t rte_vhost_enqueue_burst(struct virtio_net *dev, uint16_t queue_id, uint16_t rte_vhost_dequeue_burst(struct virtio_net *dev, uint16_t queue_id, struct rte_mempool *mbuf_pool, struct rte_mbuf **pkts, uint16_t count); +/** + * This function get the data core id for queue pair in one vhost device. + * @param dev + * virtio-net device + * @param queue_id + * virtio queue index in mq case + * @return + * core id of queue pair of specified virtio device. + */ +uint16_t rte_vhost_core_id_get(volatile struct virtio_net *dev, + uint16_t queue_id); + +/** + * This function set the data core id for queue pair in one vhost device. + * @param dev + * virtio-net device + * @param queue_id + * virtio queue index in mq case + * @param core_id + * data core id for virtio queue pair in mq case + */ +void rte_vhost_core_id_set(struct virtio_net *dev, uint16_t queue_id, + uint16_t core_id); + #endif /* _VIRTIO_NET_H_ */ diff --git a/lib/librte_vhost/virtio-net.c b/lib/librte_vhost/virtio-net.c index b11fd61..d304ee6 100644 --- a/lib/librte_vhost/virtio-net.c +++ b/lib/librte_vhost/virtio-net.c @@ -868,6 +868,31 @@ int rte_vhost_feature_enable(uint64_t feature_mask) return -1; } +uint16_t +rte_vhost_core_id_get(volatile struct virtio_net *dev, uint16_t queue_id) +{ + if (dev == NULL) + return 0; + + if (dev->virtqueue == NULL || dev->virtqueue[queue_id] == NULL) + return 0; + + return dev->virtqueue[queue_id]->core_id; +} + +void +rte_vhost_core_id_set(struct virtio_net *dev, uint16_t queue_id, + uint16_t core_id) +{ + if (dev == NULL) + return; + + if (dev->virtqueue == NULL || dev->virtqueue[queue_id] == NULL) + return; + + dev->virtqueue[queue_id]->core_id = core_id; +} + /* * Register ops so that we can add/remove device to data core. */ -- 1.9.0