[dpdk-dev,v6,09/13] vhost: add API bind a virtq to a specific core
Commit Message
From: Changchun Ouyang <changchun.ouyang@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@intel.com>
Signed-off-by: Yuanhan Liu <yuanhan.liu@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(+)
Comments
On 10/9/2015 1:46 PM, Yuanhan Liu wrote:
> From: Changchun Ouyang <changchun.ouyang@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.
Where is the absolute necessity to put switching/application logic into
vhost virt queue structure?
Besides, suggest seperate vhost example patchset and vhost library
patchset so that if we have issue with one, it doesn't stop another
being merged.
>
> The usage, which will be introduced soon, could be find at examles/vhost/main.c.
>
> Signed-off-by: Changchun Ouyang <changchun.ouyang@intel.com>
> Signed-off-by: Yuanhan Liu <yuanhan.liu@linux.intel.com>
> ---
On Tue, Oct 20, 2015 at 06:16:23AM +0000, Xie, Huawei wrote:
> On 10/9/2015 1:46 PM, Yuanhan Liu wrote:
> > From: Changchun Ouyang <changchun.ouyang@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.
> Where is the absolute necessity to put switching/application logic into
> vhost virt queue structure?
I don't think it's a must, and we can drop it.
> Besides, suggest seperate vhost example patchset and vhost library
> patchset so that if we have issue with one, it doesn't stop another
> being merged.
That's what I've done: patch 1-8 are for enabling vhost-user mq, while
other patches are for vhost-switch example. Maybe I should send out 2
patch sets, one for each.
But, anyway, please help focus on reviewing path 1-8.
--yliu
> >
> > The usage, which will be introduced soon, could be find at examles/vhost/main.c.
> >
> > Signed-off-by: Changchun Ouyang <changchun.ouyang@intel.com>
> > Signed-off-by: Yuanhan Liu <yuanhan.liu@linux.intel.com>
> > ---
>
2015-10-20 14:25, Yuanhan Liu:
> On Tue, Oct 20, 2015 at 06:16:23AM +0000, Xie, Huawei wrote:
> > On 10/9/2015 1:46 PM, Yuanhan Liu wrote:
> > > From: Changchun Ouyang <changchun.ouyang@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.
> > Where is the absolute necessity to put switching/application logic into
> > vhost virt queue structure?
>
> I don't think it's a must, and we can drop it.
Yes please, it looks to be a layer violation. Holy rule ;)
@@ -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;
@@ -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_ */
@@ -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.
*/