[dpdk-dev,v6,09/13] vhost: add API bind a virtq to a specific core

Message ID 1444369572-1157-10-git-send-email-yuanhan.liu@linux.intel.com (mailing list archive)
State Superseded, archived
Headers

Commit Message

Yuanhan Liu Oct. 9, 2015, 5:46 a.m. UTC
  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

Huawei Xie Oct. 20, 2015, 6:16 a.m. UTC | #1
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>
> ---
  
Yuanhan Liu Oct. 20, 2015, 6:25 a.m. UTC | #2
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>
> > ---
>
  
Thomas Monjalon Oct. 20, 2015, 7:17 a.m. UTC | #3
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 ;)
  

Patch

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.
  */