DPDK patches and discussions
 help / color / mirror / Atom feed
* [dpdk-dev] [PATCH 1/4] vhost: introduce new API to get the active vring number
@ 2019-09-06  3:20 Andy Pei
  2019-09-06  3:20 ` [dpdk-dev] [PATCH 2/4] net/ifcvf: add multiqueue configuration Andy Pei
                   ` (3 more replies)
  0 siblings, 4 replies; 9+ messages in thread
From: Andy Pei @ 2019-09-06  3:20 UTC (permalink / raw)
  To: dev; +Cc: rosen.xu, xiaolong.ye, tiwei.bie, xiao.w.wang

It's useful for hardware vhost backend (like vDPA devices) to set
multiqueue configuration accordingly.

Signed-off-by: Xiaolong Ye <xiaolong.ye@intel.com>
Signed-off-by: Andy Pei <andy.pei@intel.com>
---
 lib/librte_vhost/rte_vhost.h | 12 ++++++++++++
 lib/librte_vhost/vhost.c     | 19 +++++++++++++++++++
 2 files changed, 31 insertions(+)

diff --git a/lib/librte_vhost/rte_vhost.h b/lib/librte_vhost/rte_vhost.h
index 7fb1729..28811b0 100644
--- a/lib/librte_vhost/rte_vhost.h
+++ b/lib/librte_vhost/rte_vhost.h
@@ -525,6 +525,18 @@ int rte_vhost_driver_callback_register(const char *path,
 uint16_t rte_vhost_get_vring_num(int vid);
 
 /**
+ * Get the number of active vrings of the device.
+ *
+ * @param vid
+ *  vhost device ID
+ *
+ * @return
+ *  The number of active vrings, 0 on failure
+ */
+uint16_t
+rte_vhost_get_active_vring_num(int vid);
+
+/**
  * Get the virtio net device's ifname, which is the vhost-user socket
  * file path.
  *
diff --git a/lib/librte_vhost/vhost.c b/lib/librte_vhost/vhost.c
index 981837b..c714818 100644
--- a/lib/librte_vhost/vhost.c
+++ b/lib/librte_vhost/vhost.c
@@ -674,6 +674,25 @@
 	return dev->nr_vring;
 }
 
+uint16_t
+rte_vhost_get_active_vring_num(int vid)
+{
+	struct virtio_net *dev = get_device(vid);
+	struct vhost_virtqueue *vq;
+	uint16_t qid;
+
+	if (dev == NULL)
+		return 0;
+
+	for (qid = 0; qid < dev->nr_vring; qid++) {
+		vq = dev->virtqueue[qid];
+		if (!vq->enabled)
+			break;
+	}
+
+	return qid;
+}
+
 int
 rte_vhost_get_ifname(int vid, char *buf, size_t len)
 {
-- 
1.8.3.1


^ permalink raw reply	[flat|nested] 9+ messages in thread

* [dpdk-dev] [PATCH 2/4] net/ifcvf: add multiqueue configuration
  2019-09-06  3:20 [dpdk-dev] [PATCH 1/4] vhost: introduce new API to get the active vring number Andy Pei
@ 2019-09-06  3:20 ` Andy Pei
  2019-09-06  3:20 ` [dpdk-dev] [PATCH 3/4] vhost: call vDPA callback at the end of vring enable handler Andy Pei
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 9+ messages in thread
From: Andy Pei @ 2019-09-06  3:20 UTC (permalink / raw)
  To: dev; +Cc: rosen.xu, xiaolong.ye, tiwei.bie, xiao.w.wang

This is in preparation for multiqueue enabling for vDPA devices.

Signed-off-by: Xiaolong Ye <xiaolong.ye@intel.com>
Signed-off-by: Andy Pei <andy.pei@intel.com>
---
 drivers/net/ifc/base/ifcvf.c | 1 +
 drivers/net/ifc/base/ifcvf.h | 2 ++
 2 files changed, 3 insertions(+)

diff --git a/drivers/net/ifc/base/ifcvf.c b/drivers/net/ifc/base/ifcvf.c
index 3c0b2df..6462281 100644
--- a/drivers/net/ifc/base/ifcvf.c
+++ b/drivers/net/ifc/base/ifcvf.c
@@ -82,6 +82,7 @@
 	}
 
 	hw->lm_cfg = hw->mem_resource[4].addr;
+	hw->mq_cfg = hw->mem_resource[4].addr + IFCVF_MQ_OFFSET;
 
 	if (hw->common_cfg == NULL || hw->notify_base == NULL ||
 			hw->isr == NULL || hw->dev_cfg == NULL) {
diff --git a/drivers/net/ifc/base/ifcvf.h b/drivers/net/ifc/base/ifcvf.h
index 9be2770..a4cb1a4 100644
--- a/drivers/net/ifc/base/ifcvf.h
+++ b/drivers/net/ifc/base/ifcvf.h
@@ -38,6 +38,7 @@
 
 #define IFCVF_LM_CFG_SIZE		0x40
 #define IFCVF_LM_RING_STATE_OFFSET	0x20
+#define IFCVF_MQ_OFFSET			0x28
 
 #define IFCVF_LM_LOGGING_CTRL		0x0
 
@@ -127,6 +128,7 @@ struct ifcvf_hw {
 	u16    *notify_base;
 	u16    *notify_addr[IFCVF_MAX_QUEUES * 2];
 	u8     *lm_cfg;
+	u8     *mq_cfg;
 	struct vring_info vring[IFCVF_MAX_QUEUES * 2];
 	u8 nr_vring;
 	struct ifcvf_pci_mem_resource mem_resource[IFCVF_PCI_MAX_RESOURCE];
-- 
1.8.3.1


^ permalink raw reply	[flat|nested] 9+ messages in thread

* [dpdk-dev] [PATCH 3/4] vhost: call vDPA callback at the end of vring enable handler
  2019-09-06  3:20 [dpdk-dev] [PATCH 1/4] vhost: introduce new API to get the active vring number Andy Pei
  2019-09-06  3:20 ` [dpdk-dev] [PATCH 2/4] net/ifcvf: add multiqueue configuration Andy Pei
@ 2019-09-06  3:20 ` Andy Pei
  2019-09-12  7:41   ` Wang, Xiao W
  2019-09-06  3:20 ` [dpdk-dev] [PATCH 4/4] net/ifcvf: enable mutliqueue support Andy Pei
  2019-09-06 13:25 ` [dpdk-dev] [PATCH 1/4] vhost: introduce new API to get the active vring number Aaron Conole
  3 siblings, 1 reply; 9+ messages in thread
From: Andy Pei @ 2019-09-06  3:20 UTC (permalink / raw)
  To: dev; +Cc: rosen.xu, xiaolong.ye, tiwei.bie, xiao.w.wang

vDPA's set_vring_state callback would need to know the virtqueues'
enable status to configure the hardware.

Signed-off-by: Xiaolong Ye <xiaolong.ye@intel.com>
Signed-off-by: Andy Pei <andy.pei@intel.com>
---
 lib/librte_vhost/rte_vdpa.h   | 4 ++--
 lib/librte_vhost/vhost_user.c | 5 +++--
 2 files changed, 5 insertions(+), 4 deletions(-)

diff --git a/lib/librte_vhost/rte_vdpa.h b/lib/librte_vhost/rte_vdpa.h
index 9a3deb3..19cf897 100644
--- a/lib/librte_vhost/rte_vdpa.h
+++ b/lib/librte_vhost/rte_vdpa.h
@@ -54,8 +54,8 @@ struct rte_vdpa_dev_ops {
 	int (*dev_conf)(int vid);
 	int (*dev_close)(int vid);
 
-	/** Enable/disable this vring */
-	int (*set_vring_state)(int vid, int vring, int state);
+	/** Enable/disable vring queue pairs */
+	int (*set_vring_state)(int vid);
 
 	/** Set features when changed */
 	int (*set_features)(int vid);
diff --git a/lib/librte_vhost/vhost_user.c b/lib/librte_vhost/vhost_user.c
index 0b72648..21028cc 100644
--- a/lib/librte_vhost/vhost_user.c
+++ b/lib/librte_vhost/vhost_user.c
@@ -1346,8 +1346,6 @@ static int vhost_user_set_vring_err(struct virtio_net **pdev __rte_unused,
 
 	did = dev->vdpa_dev_id;
 	vdpa_dev = rte_vdpa_get_device(did);
-	if (vdpa_dev && vdpa_dev->ops->set_vring_state)
-		vdpa_dev->ops->set_vring_state(dev->vid, index, enable);
 
 	if (dev->notify_ops->vring_state_changed)
 		dev->notify_ops->vring_state_changed(dev->vid,
@@ -1359,6 +1357,9 @@ static int vhost_user_set_vring_err(struct virtio_net **pdev __rte_unused,
 
 	dev->virtqueue[index]->enabled = enable;
 
+	if (vdpa_dev && vdpa_dev->ops->set_vring_state)
+		vdpa_dev->ops->set_vring_state(dev->vid);
+
 	return RTE_VHOST_MSG_RESULT_OK;
 }
 
-- 
1.8.3.1


^ permalink raw reply	[flat|nested] 9+ messages in thread

* [dpdk-dev] [PATCH 4/4] net/ifcvf: enable mutliqueue support
  2019-09-06  3:20 [dpdk-dev] [PATCH 1/4] vhost: introduce new API to get the active vring number Andy Pei
  2019-09-06  3:20 ` [dpdk-dev] [PATCH 2/4] net/ifcvf: add multiqueue configuration Andy Pei
  2019-09-06  3:20 ` [dpdk-dev] [PATCH 3/4] vhost: call vDPA callback at the end of vring enable handler Andy Pei
@ 2019-09-06  3:20 ` Andy Pei
  2019-09-12  7:41   ` Wang, Xiao W
  2019-09-06 13:25 ` [dpdk-dev] [PATCH 1/4] vhost: introduce new API to get the active vring number Aaron Conole
  3 siblings, 1 reply; 9+ messages in thread
From: Andy Pei @ 2019-09-06  3:20 UTC (permalink / raw)
  To: dev; +Cc: rosen.xu, xiaolong.ye, tiwei.bie, xiao.w.wang

Enable mutliqueue support for ifcvf devices by setting the mutliqueue
configuration space.

Signed-off-by: Xiaolong Ye <xiaolong.ye@intel.com>
Signed-off-by: Andy Pei <andy.pei@intel.com>
---
 drivers/net/ifc/base/ifcvf.c |  8 ++++++++
 drivers/net/ifc/base/ifcvf.h |  5 ++++-
 drivers/net/ifc/ifcvf_vdpa.c | 31 +++++++++++++++++++++++++++++--
 3 files changed, 41 insertions(+), 3 deletions(-)

diff --git a/drivers/net/ifc/base/ifcvf.c b/drivers/net/ifc/base/ifcvf.c
index 6462281..ac09537 100644
--- a/drivers/net/ifc/base/ifcvf.c
+++ b/drivers/net/ifc/base/ifcvf.c
@@ -310,6 +310,14 @@
 	*(u32 *)(lm_cfg + IFCVF_LM_LOGGING_CTRL) = IFCVF_LM_DISABLE;
 }
 
+void ifcvf_enable_multiqueue(struct ifcvf_hw *hw, u16 nr_queue_pair)
+{
+	u8 *mq_cfg;
+
+	mq_cfg = hw->mq_cfg;
+	*(u32 *)mq_cfg = nr_queue_pair;
+}
+
 void
 ifcvf_notify_queue(struct ifcvf_hw *hw, u16 qid)
 {
diff --git a/drivers/net/ifc/base/ifcvf.h b/drivers/net/ifc/base/ifcvf.h
index a4cb1a4..3eb0bf3 100644
--- a/drivers/net/ifc/base/ifcvf.h
+++ b/drivers/net/ifc/base/ifcvf.h
@@ -12,7 +12,7 @@
 #define IFCVF_SUBSYS_VENDOR_ID	0x8086
 #define IFCVF_SUBSYS_DEVICE_ID	0x001A
 
-#define IFCVF_MAX_QUEUES		1
+#define IFCVF_MAX_QUEUES		32
 #define VIRTIO_F_IOMMU_PLATFORM		33
 
 /* Common configuration */
@@ -153,6 +153,9 @@ struct ifcvf_hw {
 ifcvf_disable_logging(struct ifcvf_hw *hw);
 
 void
+ifcvf_enable_multiqueue(struct ifcvf_hw *hw, u16 nr_queue_pair);
+
+void
 ifcvf_notify_queue(struct ifcvf_hw *hw, u16 qid);
 
 u8
diff --git a/drivers/net/ifc/ifcvf_vdpa.c b/drivers/net/ifc/ifcvf_vdpa.c
index 8de9ef1..be71f92 100644
--- a/drivers/net/ifc/ifcvf_vdpa.c
+++ b/drivers/net/ifc/ifcvf_vdpa.c
@@ -994,6 +994,31 @@ struct internal_list {
 }
 
 static int
+ifcvf_set_vring_state(int vid)
+{
+	int did, nr_active_vring, nr_queue_pair;
+	struct internal_list *list;
+
+	nr_active_vring = rte_vhost_get_active_vring_num(vid);
+	if (nr_active_vring == 0) {
+		DRV_LOG(ERR, "No enabled vring");
+		return -1;
+	}
+	nr_queue_pair = (nr_active_vring + 1) / 2;
+
+	did = rte_vhost_get_vdpa_device_id(vid);
+	list = find_internal_resource_by_did(did);
+	if (list == NULL) {
+		DRV_LOG(ERR, "Invalid device id: %d", did);
+		return -1;
+	}
+
+	ifcvf_enable_multiqueue(&list->internal->hw, nr_queue_pair);
+
+	return 0;
+}
+
+static int
 ifcvf_get_notify_area(int vid, int qid, uint64_t *offset, uint64_t *size)
 {
 	int did;
@@ -1062,7 +1087,9 @@ struct internal_list {
 		 1ULL << VHOST_USER_PROTOCOL_F_SLAVE_REQ | \
 		 1ULL << VHOST_USER_PROTOCOL_F_SLAVE_SEND_FD | \
 		 1ULL << VHOST_USER_PROTOCOL_F_HOST_NOTIFIER | \
-		 1ULL << VHOST_USER_PROTOCOL_F_LOG_SHMFD)
+		 1ULL << VHOST_USER_PROTOCOL_F_LOG_SHMFD | \
+		 1ULL << VHOST_USER_PROTOCOL_F_MQ)
+
 static int
 ifcvf_get_protocol_features(int did __rte_unused, uint64_t *features)
 {
@@ -1076,7 +1103,7 @@ struct internal_list {
 	.get_protocol_features = ifcvf_get_protocol_features,
 	.dev_conf = ifcvf_dev_config,
 	.dev_close = ifcvf_dev_close,
-	.set_vring_state = NULL,
+	.set_vring_state = ifcvf_set_vring_state,
 	.set_features = ifcvf_set_features,
 	.migration_done = NULL,
 	.get_vfio_group_fd = ifcvf_get_vfio_group_fd,
-- 
1.8.3.1


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [dpdk-dev] [PATCH 1/4] vhost: introduce new API to get the active vring number
  2019-09-06  3:20 [dpdk-dev] [PATCH 1/4] vhost: introduce new API to get the active vring number Andy Pei
                   ` (2 preceding siblings ...)
  2019-09-06  3:20 ` [dpdk-dev] [PATCH 4/4] net/ifcvf: enable mutliqueue support Andy Pei
@ 2019-09-06 13:25 ` Aaron Conole
  2019-09-17  9:25   ` Pei, Andy
  3 siblings, 1 reply; 9+ messages in thread
From: Aaron Conole @ 2019-09-06 13:25 UTC (permalink / raw)
  To: Andy Pei; +Cc: dev, rosen.xu, xiaolong.ye, tiwei.bie, xiao.w.wang

Andy Pei <andy.pei@intel.com> writes:

> It's useful for hardware vhost backend (like vDPA devices) to set
> multiqueue configuration accordingly.
>
> Signed-off-by: Xiaolong Ye <xiaolong.ye@intel.com>
> Signed-off-by: Andy Pei <andy.pei@intel.com>
> ---

I think there's something wrong with this patch - I see the following
error after all the patches are applied:

   drivers/a715181@@tmp_rte_pmd_ifc@sta/net_ifc_ifcvf_vdpa.c.o: In function `ifcvf_set_vring_state':
   ifcvf_vdpa.c:(.text+0x1157): undefined reference to `rte_vhost_get_active_vring_num'

Looking at the linker line, I see that librte_vhost is being included.

Is it possible that you need to make an export for this?

Travis build:

   https://travis-ci.com/ovsrobot/dpdk/jobs/231687745

Possibly, this is because the robot needs to call the right script to
apply to a -next tree.  I'd be a little surprised, though.

>  lib/librte_vhost/rte_vhost.h | 12 ++++++++++++
>  lib/librte_vhost/vhost.c     | 19 +++++++++++++++++++
>  2 files changed, 31 insertions(+)
>
> diff --git a/lib/librte_vhost/rte_vhost.h b/lib/librte_vhost/rte_vhost.h
> index 7fb1729..28811b0 100644
> --- a/lib/librte_vhost/rte_vhost.h
> +++ b/lib/librte_vhost/rte_vhost.h
> @@ -525,6 +525,18 @@ int rte_vhost_driver_callback_register(const char *path,
>  uint16_t rte_vhost_get_vring_num(int vid);
>  
>  /**
> + * Get the number of active vrings of the device.
> + *
> + * @param vid
> + *  vhost device ID
> + *
> + * @return
> + *  The number of active vrings, 0 on failure
> + */
> +uint16_t
> +rte_vhost_get_active_vring_num(int vid);
> +
> +/**
>   * Get the virtio net device's ifname, which is the vhost-user socket
>   * file path.
>   *
> diff --git a/lib/librte_vhost/vhost.c b/lib/librte_vhost/vhost.c
> index 981837b..c714818 100644
> --- a/lib/librte_vhost/vhost.c
> +++ b/lib/librte_vhost/vhost.c
> @@ -674,6 +674,25 @@
>  	return dev->nr_vring;
>  }
>  
> +uint16_t
> +rte_vhost_get_active_vring_num(int vid)
> +{
> +	struct virtio_net *dev = get_device(vid);
> +	struct vhost_virtqueue *vq;
> +	uint16_t qid;
> +
> +	if (dev == NULL)
> +		return 0;
> +
> +	for (qid = 0; qid < dev->nr_vring; qid++) {
> +		vq = dev->virtqueue[qid];
> +		if (!vq->enabled)
> +			break;
> +	}
> +
> +	return qid;
> +}
> +
>  int
>  rte_vhost_get_ifname(int vid, char *buf, size_t len)
>  {

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [dpdk-dev] [PATCH 4/4] net/ifcvf: enable mutliqueue support
  2019-09-06  3:20 ` [dpdk-dev] [PATCH 4/4] net/ifcvf: enable mutliqueue support Andy Pei
@ 2019-09-12  7:41   ` Wang, Xiao W
  0 siblings, 0 replies; 9+ messages in thread
From: Wang, Xiao W @ 2019-09-12  7:41 UTC (permalink / raw)
  To: Pei, Andy, dev; +Cc: Xu, Rosen, Ye, Xiaolong, Bie, Tiwei, Liang, Cunming

Hi Andy,

> -----Original Message-----
> From: Pei, Andy
> Sent: Friday, September 6, 2019 11:21 AM
> To: dev@dpdk.org
> Cc: Xu, Rosen <rosen.xu@intel.com>; Ye, Xiaolong <xiaolong.ye@intel.com>;
> Bie, Tiwei <tiwei.bie@intel.com>; Wang, Xiao W <xiao.w.wang@intel.com>
> Subject: [PATCH 4/4] net/ifcvf: enable mutliqueue support
> 
> Enable mutliqueue support for ifcvf devices by setting the mutliqueue
> configuration space.
> 
> Signed-off-by: Xiaolong Ye <xiaolong.ye@intel.com>
> Signed-off-by: Andy Pei <andy.pei@intel.com>
> ---
>  drivers/net/ifc/base/ifcvf.c |  8 ++++++++
>  drivers/net/ifc/base/ifcvf.h |  5 ++++-
>  drivers/net/ifc/ifcvf_vdpa.c | 31 +++++++++++++++++++++++++++++--
>  3 files changed, 41 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/net/ifc/base/ifcvf.c b/drivers/net/ifc/base/ifcvf.c
> index 6462281..ac09537 100644
> --- a/drivers/net/ifc/base/ifcvf.c
> +++ b/drivers/net/ifc/base/ifcvf.c
> @@ -310,6 +310,14 @@
>  	*(u32 *)(lm_cfg + IFCVF_LM_LOGGING_CTRL) = IFCVF_LM_DISABLE;
>  }
> 
> +void ifcvf_enable_multiqueue(struct ifcvf_hw *hw, u16 nr_queue_pair)
> +{
> +	u8 *mq_cfg;
> +
> +	mq_cfg = hw->mq_cfg;
> +	*(u32 *)mq_cfg = nr_queue_pair;
> +}
> +
>  void
>  ifcvf_notify_queue(struct ifcvf_hw *hw, u16 qid)
>  {
> diff --git a/drivers/net/ifc/base/ifcvf.h b/drivers/net/ifc/base/ifcvf.h
> index a4cb1a4..3eb0bf3 100644
> --- a/drivers/net/ifc/base/ifcvf.h
> +++ b/drivers/net/ifc/base/ifcvf.h
> @@ -12,7 +12,7 @@
>  #define IFCVF_SUBSYS_VENDOR_ID	0x8086
>  #define IFCVF_SUBSYS_DEVICE_ID	0x001A
> 
> -#define IFCVF_MAX_QUEUES		1
> +#define IFCVF_MAX_QUEUES		32

The IFC supports flexible queue resource allocation among VFs, a VF may have
at most 32 queue pair allocated, but the actual number depends on user's
allocation policy. You can just get this number from a register in virtio device
config capability.

BRs,
Xiao

>  #define VIRTIO_F_IOMMU_PLATFORM		33
> 
>  /* Common configuration */
> @@ -153,6 +153,9 @@ struct ifcvf_hw {
>  ifcvf_disable_logging(struct ifcvf_hw *hw);
> 
>  void
> +ifcvf_enable_multiqueue(struct ifcvf_hw *hw, u16 nr_queue_pair);
> +
> +void
>  ifcvf_notify_queue(struct ifcvf_hw *hw, u16 qid);
> 
>  u8
> diff --git a/drivers/net/ifc/ifcvf_vdpa.c b/drivers/net/ifc/ifcvf_vdpa.c
> index 8de9ef1..be71f92 100644
> --- a/drivers/net/ifc/ifcvf_vdpa.c
> +++ b/drivers/net/ifc/ifcvf_vdpa.c
> @@ -994,6 +994,31 @@ struct internal_list {
>  }
> 
>  static int
> +ifcvf_set_vring_state(int vid)
> +{
> +	int did, nr_active_vring, nr_queue_pair;
> +	struct internal_list *list;
> +
> +	nr_active_vring = rte_vhost_get_active_vring_num(vid);
> +	if (nr_active_vring == 0) {
> +		DRV_LOG(ERR, "No enabled vring");
> +		return -1;
> +	}
> +	nr_queue_pair = (nr_active_vring + 1) / 2;
> +
> +	did = rte_vhost_get_vdpa_device_id(vid);
> +	list = find_internal_resource_by_did(did);
> +	if (list == NULL) {
> +		DRV_LOG(ERR, "Invalid device id: %d", did);
> +		return -1;
> +	}
> +
> +	ifcvf_enable_multiqueue(&list->internal->hw, nr_queue_pair);
> +
> +	return 0;
> +}
> +
> +static int
>  ifcvf_get_notify_area(int vid, int qid, uint64_t *offset, uint64_t *size)
>  {
>  	int did;
> @@ -1062,7 +1087,9 @@ struct internal_list {
>  		 1ULL << VHOST_USER_PROTOCOL_F_SLAVE_REQ | \
>  		 1ULL << VHOST_USER_PROTOCOL_F_SLAVE_SEND_FD | \
>  		 1ULL << VHOST_USER_PROTOCOL_F_HOST_NOTIFIER | \
> -		 1ULL << VHOST_USER_PROTOCOL_F_LOG_SHMFD)
> +		 1ULL << VHOST_USER_PROTOCOL_F_LOG_SHMFD | \
> +		 1ULL << VHOST_USER_PROTOCOL_F_MQ)
> +
>  static int
>  ifcvf_get_protocol_features(int did __rte_unused, uint64_t *features)
>  {
> @@ -1076,7 +1103,7 @@ struct internal_list {
>  	.get_protocol_features = ifcvf_get_protocol_features,
>  	.dev_conf = ifcvf_dev_config,
>  	.dev_close = ifcvf_dev_close,
> -	.set_vring_state = NULL,
> +	.set_vring_state = ifcvf_set_vring_state,
>  	.set_features = ifcvf_set_features,
>  	.migration_done = NULL,
>  	.get_vfio_group_fd = ifcvf_get_vfio_group_fd,
> --
> 1.8.3.1


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [dpdk-dev] [PATCH 3/4] vhost: call vDPA callback at the end of vring enable handler
  2019-09-06  3:20 ` [dpdk-dev] [PATCH 3/4] vhost: call vDPA callback at the end of vring enable handler Andy Pei
@ 2019-09-12  7:41   ` Wang, Xiao W
  2019-09-17  7:29     ` Pei, Andy
  0 siblings, 1 reply; 9+ messages in thread
From: Wang, Xiao W @ 2019-09-12  7:41 UTC (permalink / raw)
  To: Pei, Andy, dev; +Cc: Xu, Rosen, Ye, Xiaolong, Bie, Tiwei, Liang, Cunming

Hi Andy,

> -----Original Message-----
> From: Pei, Andy
> Sent: Friday, September 6, 2019 11:21 AM
> To: dev@dpdk.org
> Cc: Xu, Rosen <rosen.xu@intel.com>; Ye, Xiaolong <xiaolong.ye@intel.com>;
> Bie, Tiwei <tiwei.bie@intel.com>; Wang, Xiao W <xiao.w.wang@intel.com>
> Subject: [PATCH 3/4] vhost: call vDPA callback at the end of vring enable
> handler
> 
> vDPA's set_vring_state callback would need to know the virtqueues'
> enable status to configure the hardware.
> 
> Signed-off-by: Xiaolong Ye <xiaolong.ye@intel.com>
> Signed-off-by: Andy Pei <andy.pei@intel.com>
> ---
>  lib/librte_vhost/rte_vdpa.h   | 4 ++--
>  lib/librte_vhost/vhost_user.c | 5 +++--
>  2 files changed, 5 insertions(+), 4 deletions(-)
> 
> diff --git a/lib/librte_vhost/rte_vdpa.h b/lib/librte_vhost/rte_vdpa.h
> index 9a3deb3..19cf897 100644
> --- a/lib/librte_vhost/rte_vdpa.h
> +++ b/lib/librte_vhost/rte_vdpa.h
> @@ -54,8 +54,8 @@ struct rte_vdpa_dev_ops {
>  	int (*dev_conf)(int vid);
>  	int (*dev_close)(int vid);
> 
> -	/** Enable/disable this vring */
> -	int (*set_vring_state)(int vid, int vring, int state);
> +	/** Enable/disable vring queue pairs */
> +	int (*set_vring_state)(int vid);

If rte_vhost_get_active_vring_num() always needs be called inside set_vring_state callback,
inorder to get the active queue pair number, then why not pass the active queue pair number
directly as a parameter to set_vring_state() ? This could help to avoid exposing new API.

BRs,
Xiao

> 
>  	/** Set features when changed */
>  	int (*set_features)(int vid);
> diff --git a/lib/librte_vhost/vhost_user.c b/lib/librte_vhost/vhost_user.c
> index 0b72648..21028cc 100644
> --- a/lib/librte_vhost/vhost_user.c
> +++ b/lib/librte_vhost/vhost_user.c
> @@ -1346,8 +1346,6 @@ static int vhost_user_set_vring_err(struct virtio_net
> **pdev __rte_unused,
> 
>  	did = dev->vdpa_dev_id;
>  	vdpa_dev = rte_vdpa_get_device(did);
> -	if (vdpa_dev && vdpa_dev->ops->set_vring_state)
> -		vdpa_dev->ops->set_vring_state(dev->vid, index, enable);
> 
>  	if (dev->notify_ops->vring_state_changed)
>  		dev->notify_ops->vring_state_changed(dev->vid,
> @@ -1359,6 +1357,9 @@ static int vhost_user_set_vring_err(struct virtio_net
> **pdev __rte_unused,
> 
>  	dev->virtqueue[index]->enabled = enable;
> 
> +	if (vdpa_dev && vdpa_dev->ops->set_vring_state)
> +		vdpa_dev->ops->set_vring_state(dev->vid);
> +
>  	return RTE_VHOST_MSG_RESULT_OK;
>  }
> 
> --
> 1.8.3.1


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [dpdk-dev] [PATCH 3/4] vhost: call vDPA callback at the end of vring enable handler
  2019-09-12  7:41   ` Wang, Xiao W
@ 2019-09-17  7:29     ` Pei, Andy
  0 siblings, 0 replies; 9+ messages in thread
From: Pei, Andy @ 2019-09-17  7:29 UTC (permalink / raw)
  To: Wang, Xiao W, dev; +Cc: Xu, Rosen, Ye, Xiaolong, Bie, Tiwei, Liang, Cunming

Yes, I will do this way in v2.

-----Original Message-----
From: Wang, Xiao W 
Sent: Thursday, September 12, 2019 3:42 PM
To: Pei, Andy <andy.pei@intel.com>; dev@dpdk.org
Cc: Xu, Rosen <rosen.xu@intel.com>; Ye, Xiaolong <xiaolong.ye@intel.com>; Bie, Tiwei <tiwei.bie@intel.com>; Liang, Cunming <cunming.liang@intel.com>
Subject: RE: [PATCH 3/4] vhost: call vDPA callback at the end of vring enable handler

Hi Andy,

> -----Original Message-----
> From: Pei, Andy
> Sent: Friday, September 6, 2019 11:21 AM
> To: dev@dpdk.org
> Cc: Xu, Rosen <rosen.xu@intel.com>; Ye, Xiaolong 
> <xiaolong.ye@intel.com>; Bie, Tiwei <tiwei.bie@intel.com>; Wang, Xiao 
> W <xiao.w.wang@intel.com>
> Subject: [PATCH 3/4] vhost: call vDPA callback at the end of vring 
> enable handler
> 
> vDPA's set_vring_state callback would need to know the virtqueues'
> enable status to configure the hardware.
> 
> Signed-off-by: Xiaolong Ye <xiaolong.ye@intel.com>
> Signed-off-by: Andy Pei <andy.pei@intel.com>
> ---
>  lib/librte_vhost/rte_vdpa.h   | 4 ++--
>  lib/librte_vhost/vhost_user.c | 5 +++--
>  2 files changed, 5 insertions(+), 4 deletions(-)
> 
> diff --git a/lib/librte_vhost/rte_vdpa.h b/lib/librte_vhost/rte_vdpa.h 
> index 9a3deb3..19cf897 100644
> --- a/lib/librte_vhost/rte_vdpa.h
> +++ b/lib/librte_vhost/rte_vdpa.h
> @@ -54,8 +54,8 @@ struct rte_vdpa_dev_ops {
>  	int (*dev_conf)(int vid);
>  	int (*dev_close)(int vid);
> 
> -	/** Enable/disable this vring */
> -	int (*set_vring_state)(int vid, int vring, int state);
> +	/** Enable/disable vring queue pairs */
> +	int (*set_vring_state)(int vid);

If rte_vhost_get_active_vring_num() always needs be called inside set_vring_state callback, inorder to get the active queue pair number, then why not pass the active queue pair number directly as a parameter to set_vring_state() ? This could help to avoid exposing new API.

BRs,
Xiao

> 
>  	/** Set features when changed */
>  	int (*set_features)(int vid);
> diff --git a/lib/librte_vhost/vhost_user.c 
> b/lib/librte_vhost/vhost_user.c index 0b72648..21028cc 100644
> --- a/lib/librte_vhost/vhost_user.c
> +++ b/lib/librte_vhost/vhost_user.c
> @@ -1346,8 +1346,6 @@ static int vhost_user_set_vring_err(struct 
> virtio_net **pdev __rte_unused,
> 
>  	did = dev->vdpa_dev_id;
>  	vdpa_dev = rte_vdpa_get_device(did);
> -	if (vdpa_dev && vdpa_dev->ops->set_vring_state)
> -		vdpa_dev->ops->set_vring_state(dev->vid, index, enable);
> 
>  	if (dev->notify_ops->vring_state_changed)
>  		dev->notify_ops->vring_state_changed(dev->vid,
> @@ -1359,6 +1357,9 @@ static int vhost_user_set_vring_err(struct 
> virtio_net **pdev __rte_unused,
> 
>  	dev->virtqueue[index]->enabled = enable;
> 
> +	if (vdpa_dev && vdpa_dev->ops->set_vring_state)
> +		vdpa_dev->ops->set_vring_state(dev->vid);
> +
>  	return RTE_VHOST_MSG_RESULT_OK;
>  }
> 
> --
> 1.8.3.1


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [dpdk-dev] [PATCH 1/4] vhost: introduce new API to get the active vring number
  2019-09-06 13:25 ` [dpdk-dev] [PATCH 1/4] vhost: introduce new API to get the active vring number Aaron Conole
@ 2019-09-17  9:25   ` Pei, Andy
  0 siblings, 0 replies; 9+ messages in thread
From: Pei, Andy @ 2019-09-17  9:25 UTC (permalink / raw)
  To: Aaron Conole; +Cc: dev, Xu, Rosen, Ye, Xiaolong, Bie, Tiwei, Wang, Xiao W

Hi Aaron,

I try to solve this by avoiding exposing this new API.
Hope this works.

BRs,

-----Original Message-----
From: Aaron Conole [mailto:aconole@redhat.com] 
Sent: Friday, September 6, 2019 9:26 PM
To: Pei, Andy <andy.pei@intel.com>
Cc: dev@dpdk.org; Xu, Rosen <rosen.xu@intel.com>; Ye, Xiaolong <xiaolong.ye@intel.com>; Bie, Tiwei <tiwei.bie@intel.com>; Wang, Xiao W <xiao.w.wang@intel.com>
Subject: Re: [dpdk-dev] [PATCH 1/4] vhost: introduce new API to get the active vring number

Andy Pei <andy.pei@intel.com> writes:

> It's useful for hardware vhost backend (like vDPA devices) to set 
> multiqueue configuration accordingly.
>
> Signed-off-by: Xiaolong Ye <xiaolong.ye@intel.com>
> Signed-off-by: Andy Pei <andy.pei@intel.com>
> ---

I think there's something wrong with this patch - I see the following error after all the patches are applied:

   drivers/a715181@@tmp_rte_pmd_ifc@sta/net_ifc_ifcvf_vdpa.c.o: In function `ifcvf_set_vring_state':
   ifcvf_vdpa.c:(.text+0x1157): undefined reference to `rte_vhost_get_active_vring_num'

Looking at the linker line, I see that librte_vhost is being included.

Is it possible that you need to make an export for this?

Travis build:

   https://travis-ci.com/ovsrobot/dpdk/jobs/231687745

Possibly, this is because the robot needs to call the right script to apply to a -next tree.  I'd be a little surprised, though.

>  lib/librte_vhost/rte_vhost.h | 12 ++++++++++++
>  lib/librte_vhost/vhost.c     | 19 +++++++++++++++++++
>  2 files changed, 31 insertions(+)
>
> diff --git a/lib/librte_vhost/rte_vhost.h 
> b/lib/librte_vhost/rte_vhost.h index 7fb1729..28811b0 100644
> --- a/lib/librte_vhost/rte_vhost.h
> +++ b/lib/librte_vhost/rte_vhost.h
> @@ -525,6 +525,18 @@ int rte_vhost_driver_callback_register(const char 
> *path,  uint16_t rte_vhost_get_vring_num(int vid);
>  
>  /**
> + * Get the number of active vrings of the device.
> + *
> + * @param vid
> + *  vhost device ID
> + *
> + * @return
> + *  The number of active vrings, 0 on failure  */ uint16_t 
> +rte_vhost_get_active_vring_num(int vid);
> +
> +/**
>   * Get the virtio net device's ifname, which is the vhost-user socket
>   * file path.
>   *
> diff --git a/lib/librte_vhost/vhost.c b/lib/librte_vhost/vhost.c index 
> 981837b..c714818 100644
> --- a/lib/librte_vhost/vhost.c
> +++ b/lib/librte_vhost/vhost.c
> @@ -674,6 +674,25 @@
>  	return dev->nr_vring;
>  }
>  
> +uint16_t
> +rte_vhost_get_active_vring_num(int vid) {
> +	struct virtio_net *dev = get_device(vid);
> +	struct vhost_virtqueue *vq;
> +	uint16_t qid;
> +
> +	if (dev == NULL)
> +		return 0;
> +
> +	for (qid = 0; qid < dev->nr_vring; qid++) {
> +		vq = dev->virtqueue[qid];
> +		if (!vq->enabled)
> +			break;
> +	}
> +
> +	return qid;
> +}
> +
>  int
>  rte_vhost_get_ifname(int vid, char *buf, size_t len)  {

^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2019-09-17  9:25 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-09-06  3:20 [dpdk-dev] [PATCH 1/4] vhost: introduce new API to get the active vring number Andy Pei
2019-09-06  3:20 ` [dpdk-dev] [PATCH 2/4] net/ifcvf: add multiqueue configuration Andy Pei
2019-09-06  3:20 ` [dpdk-dev] [PATCH 3/4] vhost: call vDPA callback at the end of vring enable handler Andy Pei
2019-09-12  7:41   ` Wang, Xiao W
2019-09-17  7:29     ` Pei, Andy
2019-09-06  3:20 ` [dpdk-dev] [PATCH 4/4] net/ifcvf: enable mutliqueue support Andy Pei
2019-09-12  7:41   ` Wang, Xiao W
2019-09-06 13:25 ` [dpdk-dev] [PATCH 1/4] vhost: introduce new API to get the active vring number Aaron Conole
2019-09-17  9:25   ` Pei, Andy

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).