[PATCH 0/2] vDPA/ifcvf: enable multiqueue and control vq

STALE1837d

8 messages, 2 authors, 2021-08-19 · open the first message on its own page

[PATCH 0/2] vDPA/ifcvf: enable multiqueue and control vq

From: Zhu Lingshan <hidden>
Date: 2021-08-18 10:03:53

This series enables multi-queue and control vq features
for ifcvf.

These patches are based on my previous vDPA/ifcvf management link
implementation series:
https://lore.kernel.org/kvm/20210812032454.24486-2-lingshan.zhu@intel.com/T/

Thanks!

Zhu Lingshan (2):
  vDPA/ifcvf: detect and use the onboard number of queues directly
  vDPA/ifcvf: enable multiqueue and control vq

 drivers/vdpa/ifcvf/ifcvf_base.c |  8 +++++---
 drivers/vdpa/ifcvf/ifcvf_base.h | 19 ++++---------------
 drivers/vdpa/ifcvf/ifcvf_main.c | 32 +++++++++++++++-----------------
 3 files changed, 24 insertions(+), 35 deletions(-)

-- 
2.27.0

[PATCH 1/2] vDPA/ifcvf: detect and use the onboard number of queues directly

From: Zhu Lingshan <hidden>
Date: 2021-08-18 10:05:33

To enable this multi-queue feature for ifcvf, this commit
intends to detect and use the onboard number of queues
directly than IFCVF_MAX_QUEUE_PAIRS = 1 (removed)

Signed-off-by: Zhu Lingshan <redacted>
---
 drivers/vdpa/ifcvf/ifcvf_base.c |  8 +++++---
 drivers/vdpa/ifcvf/ifcvf_base.h | 10 ++++------
 drivers/vdpa/ifcvf/ifcvf_main.c | 21 ++++++++++++---------
 3 files changed, 21 insertions(+), 18 deletions(-)
diff --git a/drivers/vdpa/ifcvf/ifcvf_base.c b/drivers/vdpa/ifcvf/ifcvf_base.c
index 6e197fe0fcf9..2808f1ba9f7b 100644
--- a/drivers/vdpa/ifcvf/ifcvf_base.c
+++ b/drivers/vdpa/ifcvf/ifcvf_base.c
@@ -158,7 +158,9 @@ int ifcvf_init_hw(struct ifcvf_hw *hw, struct pci_dev *pdev)
 		return -EIO;
 	}
 
-	for (i = 0; i < IFCVF_MAX_QUEUE_PAIRS * 2; i++) {
+	hw->nr_vring = ifc_ioread16(&hw->common_cfg->num_queues);
+
+	for (i = 0; i < hw->nr_vring; i++) {
 		ifc_iowrite16(i, &hw->common_cfg->queue_select);
 		notify_off = ifc_ioread16(&hw->common_cfg->queue_notify_off);
 		hw->vring[i].notify_addr = hw->notify_base +
@@ -304,7 +306,7 @@ u16 ifcvf_get_vq_state(struct ifcvf_hw *hw, u16 qid)
 	u32 q_pair_id;
 
 	ifcvf_lm = (struct ifcvf_lm_cfg __iomem *)hw->lm_cfg;
-	q_pair_id = qid / (IFCVF_MAX_QUEUE_PAIRS * 2);
+	q_pair_id = qid / hw->nr_vring;
 	avail_idx_addr = &ifcvf_lm->vring_lm_cfg[q_pair_id].idx_addr[qid % 2];
 	last_avail_idx = ifc_ioread16(avail_idx_addr);
 
@@ -318,7 +320,7 @@ int ifcvf_set_vq_state(struct ifcvf_hw *hw, u16 qid, u16 num)
 	u32 q_pair_id;
 
 	ifcvf_lm = (struct ifcvf_lm_cfg __iomem *)hw->lm_cfg;
-	q_pair_id = qid / (IFCVF_MAX_QUEUE_PAIRS * 2);
+	q_pair_id = qid / hw->nr_vring;
 	avail_idx_addr = &ifcvf_lm->vring_lm_cfg[q_pair_id].idx_addr[qid % 2];
 	hw->vring[qid].last_avail_idx = num;
 	ifc_iowrite16(num, avail_idx_addr);
diff --git a/drivers/vdpa/ifcvf/ifcvf_base.h b/drivers/vdpa/ifcvf/ifcvf_base.h
index 1601e87870da..97d9019a3ec0 100644
--- a/drivers/vdpa/ifcvf/ifcvf_base.h
+++ b/drivers/vdpa/ifcvf/ifcvf_base.h
@@ -31,8 +31,8 @@
 		 (1ULL << VIRTIO_F_ACCESS_PLATFORM)		| \
 		 (1ULL << VIRTIO_NET_F_MRG_RXBUF))
 
-/* Only one queue pair for now. */
-#define IFCVF_MAX_QUEUE_PAIRS	1
+/* Max 8 data queue pairs(16 queues) and one control vq for now. */
+#define IFCVF_MAX_QUEUES	17
 
 #define IFCVF_QUEUE_ALIGNMENT	PAGE_SIZE
 #define IFCVF_QUEUE_MAX		32768
@@ -51,8 +51,6 @@
 #define ifcvf_private_to_vf(adapter) \
 	(&((struct ifcvf_adapter *)adapter)->vf)
 
-#define IFCVF_MAX_INTR (IFCVF_MAX_QUEUE_PAIRS * 2 + 1)
-
 struct vring_info {
 	u64 desc;
 	u64 avail;
@@ -83,7 +81,7 @@ struct ifcvf_hw {
 	u32 dev_type;
 	struct virtio_pci_common_cfg __iomem *common_cfg;
 	void __iomem *net_cfg;
-	struct vring_info vring[IFCVF_MAX_QUEUE_PAIRS * 2];
+	struct vring_info vring[IFCVF_MAX_QUEUES];
 	void __iomem * const *base;
 	char config_msix_name[256];
 	struct vdpa_callback config_cb;
@@ -103,7 +101,7 @@ struct ifcvf_vring_lm_cfg {
 
 struct ifcvf_lm_cfg {
 	u8 reserved[IFCVF_LM_RING_STATE_OFFSET];
-	struct ifcvf_vring_lm_cfg vring_lm_cfg[IFCVF_MAX_QUEUE_PAIRS];
+	struct ifcvf_vring_lm_cfg vring_lm_cfg[IFCVF_MAX_QUEUES];
 };
 
 struct ifcvf_vdpa_mgmt_dev {
diff --git a/drivers/vdpa/ifcvf/ifcvf_main.c b/drivers/vdpa/ifcvf/ifcvf_main.c
index 4b623253f460..e34c2ec2b69b 100644
--- a/drivers/vdpa/ifcvf/ifcvf_main.c
+++ b/drivers/vdpa/ifcvf/ifcvf_main.c
@@ -63,9 +63,13 @@ static int ifcvf_request_irq(struct ifcvf_adapter *adapter)
 	struct pci_dev *pdev = adapter->pdev;
 	struct ifcvf_hw *vf = &adapter->vf;
 	int vector, i, ret, irq;
+	u16 max_intr;
 
-	ret = pci_alloc_irq_vectors(pdev, IFCVF_MAX_INTR,
-				    IFCVF_MAX_INTR, PCI_IRQ_MSIX);
+	/* all queues and config interrupt  */
+	max_intr = vf->nr_vring + 1;
+
+	ret = pci_alloc_irq_vectors(pdev, max_intr,
+				    max_intr, PCI_IRQ_MSIX);
 	if (ret < 0) {
 		IFCVF_ERR(pdev, "Failed to alloc IRQ vectors\n");
 		return ret;
@@ -83,7 +87,7 @@ static int ifcvf_request_irq(struct ifcvf_adapter *adapter)
 		return ret;
 	}
 
-	for (i = 0; i < IFCVF_MAX_QUEUE_PAIRS * 2; i++) {
+	for (i = 0; i < vf->nr_vring; i++) {
 		snprintf(vf->vring[i].msix_name, 256, "ifcvf[%s]-%d\n",
 			 pci_name(pdev), i);
 		vector = i + IFCVF_MSI_QUEUE_OFF;
@@ -112,7 +116,6 @@ static int ifcvf_start_datapath(void *private)
 	u8 status;
 	int ret;
 
-	vf->nr_vring = IFCVF_MAX_QUEUE_PAIRS * 2;
 	ret = ifcvf_start_hw(vf);
 	if (ret < 0) {
 		status = ifcvf_get_status(vf);
@@ -128,7 +131,7 @@ static int ifcvf_stop_datapath(void *private)
 	struct ifcvf_hw *vf = ifcvf_private_to_vf(private);
 	int i;
 
-	for (i = 0; i < IFCVF_MAX_QUEUE_PAIRS * 2; i++)
+	for (i = 0; i < vf->nr_vring; i++)
 		vf->vring[i].cb.callback = NULL;
 
 	ifcvf_stop_hw(vf);
@@ -141,7 +144,7 @@ static void ifcvf_reset_vring(struct ifcvf_adapter *adapter)
 	struct ifcvf_hw *vf = ifcvf_private_to_vf(adapter);
 	int i;
 
-	for (i = 0; i < IFCVF_MAX_QUEUE_PAIRS * 2; i++) {
+	for (i = 0; i < vf->nr_vring; i++) {
 		vf->vring[i].last_avail_idx = 0;
 		vf->vring[i].desc = 0;
 		vf->vring[i].avail = 0;
@@ -227,7 +230,7 @@ static void ifcvf_vdpa_set_status(struct vdpa_device *vdpa_dev, u8 status)
 	if ((status_old & VIRTIO_CONFIG_S_DRIVER_OK) &&
 	    !(status & VIRTIO_CONFIG_S_DRIVER_OK)) {
 		ifcvf_stop_datapath(adapter);
-		ifcvf_free_irq(adapter, IFCVF_MAX_QUEUE_PAIRS * 2);
+		ifcvf_free_irq(adapter, vf->nr_vring);
 	}
 
 	if (status == 0) {
@@ -526,13 +529,13 @@ static int ifcvf_vdpa_dev_add(struct vdpa_mgmt_dev *mdev, const char *name)
 		goto err;
 	}
 
-	for (i = 0; i < IFCVF_MAX_QUEUE_PAIRS * 2; i++)
+	for (i = 0; i < vf->nr_vring; i++)
 		vf->vring[i].irq = -EINVAL;
 
 	vf->hw_features = ifcvf_get_hw_features(vf);
 
 	adapter->vdpa.mdev = &ifcvf_mgmt_dev->mdev;
-	ret = _vdpa_register_device(&adapter->vdpa, IFCVF_MAX_QUEUE_PAIRS * 2);
+	ret = _vdpa_register_device(&adapter->vdpa, vf->nr_vring);
 	if (ret) {
 		IFCVF_ERR(pdev, "Failed to register to vDPA bus");
 		goto err;
-- 
2.27.0

[PATCH 2/2] vDPA/ifcvf: enable multiqueue and control vq

From: Zhu Lingshan <hidden>
Date: 2021-08-18 10:05:33

This commit enbales multi-queue and control vq
features for ifcvf

Signed-off-by: Zhu Lingshan <redacted>
---
 drivers/vdpa/ifcvf/ifcvf_base.h |  9 ---------
 drivers/vdpa/ifcvf/ifcvf_main.c | 11 +++--------
 2 files changed, 3 insertions(+), 17 deletions(-)
diff --git a/drivers/vdpa/ifcvf/ifcvf_base.h b/drivers/vdpa/ifcvf/ifcvf_base.h
index 97d9019a3ec0..09918af3ecf8 100644
--- a/drivers/vdpa/ifcvf/ifcvf_base.h
+++ b/drivers/vdpa/ifcvf/ifcvf_base.h
@@ -22,15 +22,6 @@
 #define N3000_DEVICE_ID		0x1041
 #define N3000_SUBSYS_DEVICE_ID	0x001A
 
-#define IFCVF_NET_SUPPORTED_FEATURES \
-		((1ULL << VIRTIO_NET_F_MAC)			| \
-		 (1ULL << VIRTIO_F_ANY_LAYOUT)			| \
-		 (1ULL << VIRTIO_F_VERSION_1)			| \
-		 (1ULL << VIRTIO_NET_F_STATUS)			| \
-		 (1ULL << VIRTIO_F_ORDER_PLATFORM)		| \
-		 (1ULL << VIRTIO_F_ACCESS_PLATFORM)		| \
-		 (1ULL << VIRTIO_NET_F_MRG_RXBUF))
-
 /* Max 8 data queue pairs(16 queues) and one control vq for now. */
 #define IFCVF_MAX_QUEUES	17
 
diff --git a/drivers/vdpa/ifcvf/ifcvf_main.c b/drivers/vdpa/ifcvf/ifcvf_main.c
index e34c2ec2b69b..b99283a98177 100644
--- a/drivers/vdpa/ifcvf/ifcvf_main.c
+++ b/drivers/vdpa/ifcvf/ifcvf_main.c
@@ -174,17 +174,12 @@ static u64 ifcvf_vdpa_get_features(struct vdpa_device *vdpa_dev)
 	struct ifcvf_adapter *adapter = vdpa_to_adapter(vdpa_dev);
 	struct ifcvf_hw *vf = vdpa_to_vf(vdpa_dev);
 	struct pci_dev *pdev = adapter->pdev;
-
+	u32 type = vf->dev_type;
 	u64 features;
 
-	switch (vf->dev_type) {
-	case VIRTIO_ID_NET:
-		features = ifcvf_get_features(vf) & IFCVF_NET_SUPPORTED_FEATURES;
-		break;
-	case VIRTIO_ID_BLOCK:
+	if (type == VIRTIO_ID_NET || type == VIRTIO_ID_BLOCK)
 		features = ifcvf_get_features(vf);
-		break;
-	default:
+	else {
 		features = 0;
 		IFCVF_ERR(pdev, "VIRTIO ID %u not supported\n", vf->dev_type);
 	}
-- 
2.27.0

Re: [PATCH 1/2] vDPA/ifcvf: detect and use the onboard number of queues directly

From: Jason Wang <hidden>
Date: 2021-08-19 04:09:41

在 2021/8/18 下午5:57, Zhu Lingshan 写道:
quoted hunk
To enable this multi-queue feature for ifcvf, this commit
intends to detect and use the onboard number of queues
directly than IFCVF_MAX_QUEUE_PAIRS = 1 (removed)

Signed-off-by: Zhu Lingshan <redacted>
---
  drivers/vdpa/ifcvf/ifcvf_base.c |  8 +++++---
  drivers/vdpa/ifcvf/ifcvf_base.h | 10 ++++------
  drivers/vdpa/ifcvf/ifcvf_main.c | 21 ++++++++++++---------
  3 files changed, 21 insertions(+), 18 deletions(-)
diff --git a/drivers/vdpa/ifcvf/ifcvf_base.c b/drivers/vdpa/ifcvf/ifcvf_base.c
index 6e197fe0fcf9..2808f1ba9f7b 100644
--- a/drivers/vdpa/ifcvf/ifcvf_base.c
+++ b/drivers/vdpa/ifcvf/ifcvf_base.c
@@ -158,7 +158,9 @@ int ifcvf_init_hw(struct ifcvf_hw *hw, struct pci_dev *pdev)
  		return -EIO;
  	}
  
-	for (i = 0; i < IFCVF_MAX_QUEUE_PAIRS * 2; i++) {
+	hw->nr_vring = ifc_ioread16(&hw->common_cfg->num_queues);
+
+	for (i = 0; i < hw->nr_vring; i++) {
  		ifc_iowrite16(i, &hw->common_cfg->queue_select);
  		notify_off = ifc_ioread16(&hw->common_cfg->queue_notify_off);
  		hw->vring[i].notify_addr = hw->notify_base +
@@ -304,7 +306,7 @@ u16 ifcvf_get_vq_state(struct ifcvf_hw *hw, u16 qid)
  	u32 q_pair_id;
  
  	ifcvf_lm = (struct ifcvf_lm_cfg __iomem *)hw->lm_cfg;
-	q_pair_id = qid / (IFCVF_MAX_QUEUE_PAIRS * 2);
+	q_pair_id = qid / hw->nr_vring;
  	avail_idx_addr = &ifcvf_lm->vring_lm_cfg[q_pair_id].idx_addr[qid % 2];
  	last_avail_idx = ifc_ioread16(avail_idx_addr);
  
@@ -318,7 +320,7 @@ int ifcvf_set_vq_state(struct ifcvf_hw *hw, u16 qid, u16 num)
  	u32 q_pair_id;
  
  	ifcvf_lm = (struct ifcvf_lm_cfg __iomem *)hw->lm_cfg;
-	q_pair_id = qid / (IFCVF_MAX_QUEUE_PAIRS * 2);
+	q_pair_id = qid / hw->nr_vring;
  	avail_idx_addr = &ifcvf_lm->vring_lm_cfg[q_pair_id].idx_addr[qid % 2];
  	hw->vring[qid].last_avail_idx = num;
  	ifc_iowrite16(num, avail_idx_addr);
diff --git a/drivers/vdpa/ifcvf/ifcvf_base.h b/drivers/vdpa/ifcvf/ifcvf_base.h
index 1601e87870da..97d9019a3ec0 100644
--- a/drivers/vdpa/ifcvf/ifcvf_base.h
+++ b/drivers/vdpa/ifcvf/ifcvf_base.h
@@ -31,8 +31,8 @@
  		 (1ULL << VIRTIO_F_ACCESS_PLATFORM)		| \
  		 (1ULL << VIRTIO_NET_F_MRG_RXBUF))
  
-/* Only one queue pair for now. */
-#define IFCVF_MAX_QUEUE_PAIRS	1
+/* Max 8 data queue pairs(16 queues) and one control vq for now. */
+#define IFCVF_MAX_QUEUES	17

While at it, I wonder if we can get rid of this.

Other than this,

Acked-by: Jason Wang <redacted>

quoted hunk
  
  #define IFCVF_QUEUE_ALIGNMENT	PAGE_SIZE
  #define IFCVF_QUEUE_MAX		32768
@@ -51,8 +51,6 @@
  #define ifcvf_private_to_vf(adapter) \
  	(&((struct ifcvf_adapter *)adapter)->vf)
  
-#define IFCVF_MAX_INTR (IFCVF_MAX_QUEUE_PAIRS * 2 + 1)
-
  struct vring_info {
  	u64 desc;
  	u64 avail;
@@ -83,7 +81,7 @@ struct ifcvf_hw {
  	u32 dev_type;
  	struct virtio_pci_common_cfg __iomem *common_cfg;
  	void __iomem *net_cfg;
-	struct vring_info vring[IFCVF_MAX_QUEUE_PAIRS * 2];
+	struct vring_info vring[IFCVF_MAX_QUEUES];
  	void __iomem * const *base;
  	char config_msix_name[256];
  	struct vdpa_callback config_cb;
@@ -103,7 +101,7 @@ struct ifcvf_vring_lm_cfg {
  
  struct ifcvf_lm_cfg {
  	u8 reserved[IFCVF_LM_RING_STATE_OFFSET];
-	struct ifcvf_vring_lm_cfg vring_lm_cfg[IFCVF_MAX_QUEUE_PAIRS];
+	struct ifcvf_vring_lm_cfg vring_lm_cfg[IFCVF_MAX_QUEUES];
  };
  
  struct ifcvf_vdpa_mgmt_dev {
diff --git a/drivers/vdpa/ifcvf/ifcvf_main.c b/drivers/vdpa/ifcvf/ifcvf_main.c
index 4b623253f460..e34c2ec2b69b 100644
--- a/drivers/vdpa/ifcvf/ifcvf_main.c
+++ b/drivers/vdpa/ifcvf/ifcvf_main.c
@@ -63,9 +63,13 @@ static int ifcvf_request_irq(struct ifcvf_adapter *adapter)
  	struct pci_dev *pdev = adapter->pdev;
  	struct ifcvf_hw *vf = &adapter->vf;
  	int vector, i, ret, irq;
+	u16 max_intr;
  
-	ret = pci_alloc_irq_vectors(pdev, IFCVF_MAX_INTR,
-				    IFCVF_MAX_INTR, PCI_IRQ_MSIX);
+	/* all queues and config interrupt  */
+	max_intr = vf->nr_vring + 1;
+
+	ret = pci_alloc_irq_vectors(pdev, max_intr,
+				    max_intr, PCI_IRQ_MSIX);
  	if (ret < 0) {
  		IFCVF_ERR(pdev, "Failed to alloc IRQ vectors\n");
  		return ret;
@@ -83,7 +87,7 @@ static int ifcvf_request_irq(struct ifcvf_adapter *adapter)
  		return ret;
  	}
  
-	for (i = 0; i < IFCVF_MAX_QUEUE_PAIRS * 2; i++) {
+	for (i = 0; i < vf->nr_vring; i++) {
  		snprintf(vf->vring[i].msix_name, 256, "ifcvf[%s]-%d\n",
  			 pci_name(pdev), i);
  		vector = i + IFCVF_MSI_QUEUE_OFF;
@@ -112,7 +116,6 @@ static int ifcvf_start_datapath(void *private)
  	u8 status;
  	int ret;
  
-	vf->nr_vring = IFCVF_MAX_QUEUE_PAIRS * 2;
  	ret = ifcvf_start_hw(vf);
  	if (ret < 0) {
  		status = ifcvf_get_status(vf);
@@ -128,7 +131,7 @@ static int ifcvf_stop_datapath(void *private)
  	struct ifcvf_hw *vf = ifcvf_private_to_vf(private);
  	int i;
  
-	for (i = 0; i < IFCVF_MAX_QUEUE_PAIRS * 2; i++)
+	for (i = 0; i < vf->nr_vring; i++)
  		vf->vring[i].cb.callback = NULL;
  
  	ifcvf_stop_hw(vf);
@@ -141,7 +144,7 @@ static void ifcvf_reset_vring(struct ifcvf_adapter *adapter)
  	struct ifcvf_hw *vf = ifcvf_private_to_vf(adapter);
  	int i;
  
-	for (i = 0; i < IFCVF_MAX_QUEUE_PAIRS * 2; i++) {
+	for (i = 0; i < vf->nr_vring; i++) {
  		vf->vring[i].last_avail_idx = 0;
  		vf->vring[i].desc = 0;
  		vf->vring[i].avail = 0;
@@ -227,7 +230,7 @@ static void ifcvf_vdpa_set_status(struct vdpa_device *vdpa_dev, u8 status)
  	if ((status_old & VIRTIO_CONFIG_S_DRIVER_OK) &&
  	    !(status & VIRTIO_CONFIG_S_DRIVER_OK)) {
  		ifcvf_stop_datapath(adapter);
-		ifcvf_free_irq(adapter, IFCVF_MAX_QUEUE_PAIRS * 2);
+		ifcvf_free_irq(adapter, vf->nr_vring);
  	}
  
  	if (status == 0) {
@@ -526,13 +529,13 @@ static int ifcvf_vdpa_dev_add(struct vdpa_mgmt_dev *mdev, const char *name)
  		goto err;
  	}
  
-	for (i = 0; i < IFCVF_MAX_QUEUE_PAIRS * 2; i++)
+	for (i = 0; i < vf->nr_vring; i++)
  		vf->vring[i].irq = -EINVAL;
  
  	vf->hw_features = ifcvf_get_hw_features(vf);
  
  	adapter->vdpa.mdev = &ifcvf_mgmt_dev->mdev;
-	ret = _vdpa_register_device(&adapter->vdpa, IFCVF_MAX_QUEUE_PAIRS * 2);
+	ret = _vdpa_register_device(&adapter->vdpa, vf->nr_vring);
  	if (ret) {
  		IFCVF_ERR(pdev, "Failed to register to vDPA bus");
  		goto err;

Re: [PATCH 2/2] vDPA/ifcvf: enable multiqueue and control vq

From: Jason Wang <hidden>
Date: 2021-08-19 04:10:06

在 2021/8/18 下午5:57, Zhu Lingshan 写道:
This commit enbales multi-queue and control vq
features for ifcvf

Signed-off-by: Zhu Lingshan <redacted>

Acked-by: Jason Wang <redacted>

quoted hunk
---
  drivers/vdpa/ifcvf/ifcvf_base.h |  9 ---------
  drivers/vdpa/ifcvf/ifcvf_main.c | 11 +++--------
  2 files changed, 3 insertions(+), 17 deletions(-)
diff --git a/drivers/vdpa/ifcvf/ifcvf_base.h b/drivers/vdpa/ifcvf/ifcvf_base.h
index 97d9019a3ec0..09918af3ecf8 100644
--- a/drivers/vdpa/ifcvf/ifcvf_base.h
+++ b/drivers/vdpa/ifcvf/ifcvf_base.h
@@ -22,15 +22,6 @@
  #define N3000_DEVICE_ID		0x1041
  #define N3000_SUBSYS_DEVICE_ID	0x001A
  
-#define IFCVF_NET_SUPPORTED_FEATURES \
-		((1ULL << VIRTIO_NET_F_MAC)			| \
-		 (1ULL << VIRTIO_F_ANY_LAYOUT)			| \
-		 (1ULL << VIRTIO_F_VERSION_1)			| \
-		 (1ULL << VIRTIO_NET_F_STATUS)			| \
-		 (1ULL << VIRTIO_F_ORDER_PLATFORM)		| \
-		 (1ULL << VIRTIO_F_ACCESS_PLATFORM)		| \
-		 (1ULL << VIRTIO_NET_F_MRG_RXBUF))
-
  /* Max 8 data queue pairs(16 queues) and one control vq for now. */
  #define IFCVF_MAX_QUEUES	17
  
diff --git a/drivers/vdpa/ifcvf/ifcvf_main.c b/drivers/vdpa/ifcvf/ifcvf_main.c
index e34c2ec2b69b..b99283a98177 100644
--- a/drivers/vdpa/ifcvf/ifcvf_main.c
+++ b/drivers/vdpa/ifcvf/ifcvf_main.c
@@ -174,17 +174,12 @@ static u64 ifcvf_vdpa_get_features(struct vdpa_device *vdpa_dev)
  	struct ifcvf_adapter *adapter = vdpa_to_adapter(vdpa_dev);
  	struct ifcvf_hw *vf = vdpa_to_vf(vdpa_dev);
  	struct pci_dev *pdev = adapter->pdev;
-
+	u32 type = vf->dev_type;
  	u64 features;
  
-	switch (vf->dev_type) {
-	case VIRTIO_ID_NET:
-		features = ifcvf_get_features(vf) & IFCVF_NET_SUPPORTED_FEATURES;
-		break;
-	case VIRTIO_ID_BLOCK:
+	if (type == VIRTIO_ID_NET || type == VIRTIO_ID_BLOCK)
  		features = ifcvf_get_features(vf);
-		break;
-	default:
+	else {
  		features = 0;
  		IFCVF_ERR(pdev, "VIRTIO ID %u not supported\n", vf->dev_type);
  	}

Re: [PATCH 0/2] vDPA/ifcvf: enable multiqueue and control vq

From: Jason Wang <hidden>
Date: 2021-08-19 04:11:19

在 2021/8/18 下午5:57, Zhu Lingshan 写道:
This series enables multi-queue and control vq features
for ifcvf.

These patches are based on my previous vDPA/ifcvf management link
implementation series:
https://lore.kernel.org/kvm/20210812032454.24486-2-lingshan.zhu@intel.com/T/

Thanks!

Zhu Lingshan (2):
   vDPA/ifcvf: detect and use the onboard number of queues directly
   vDPA/ifcvf: enable multiqueue and control vq

  drivers/vdpa/ifcvf/ifcvf_base.c |  8 +++++---
  drivers/vdpa/ifcvf/ifcvf_base.h | 19 ++++---------------
  drivers/vdpa/ifcvf/ifcvf_main.c | 32 +++++++++++++++-----------------
  3 files changed, 24 insertions(+), 35 deletions(-)
Patch looks good.

I wonder the compatibility. E.g does it work on the qemu master without 
cvq support? (mq=off or not specified)

Thanks

Re: [PATCH 0/2] vDPA/ifcvf: enable multiqueue and control vq

From: Zhu, Lingshan <hidden>
Date: 2021-08-19 06:50:01


On 8/19/2021 12:11 PM, Jason Wang wrote:
在 2021/8/18 下午5:57, Zhu Lingshan 写道:
quoted
This series enables multi-queue and control vq features
for ifcvf.

These patches are based on my previous vDPA/ifcvf management link
implementation series:
https://lore.kernel.org/kvm/20210812032454.24486-2-lingshan.zhu@intel.com/T/ 


Thanks!

Zhu Lingshan (2):
   vDPA/ifcvf: detect and use the onboard number of queues directly
   vDPA/ifcvf: enable multiqueue and control vq

  drivers/vdpa/ifcvf/ifcvf_base.c |  8 +++++---
  drivers/vdpa/ifcvf/ifcvf_base.h | 19 ++++---------------
  drivers/vdpa/ifcvf/ifcvf_main.c | 32 +++++++++++++++-----------------
  3 files changed, 24 insertions(+), 35 deletions(-)
Patch looks good.

I wonder the compatibility. E.g does it work on the qemu master 
without cvq support? (mq=off or not specified)
Hi Jason,

Yes, it works with qemu master. When no cvq/mq support, only one queue 
pair shown.

Thanks,
Zhu Lingshan
Thanks

Re: [PATCH 0/2] vDPA/ifcvf: enable multiqueue and control vq

From: Jason Wang <hidden>
Date: 2021-08-19 07:16:07

On Thu, Aug 19, 2021 at 2:50 PM Zhu, Lingshan [off-list ref] wrote:


On 8/19/2021 12:11 PM, Jason Wang wrote:
quoted
在 2021/8/18 下午5:57, Zhu Lingshan 写道:
quoted
This series enables multi-queue and control vq features
for ifcvf.

These patches are based on my previous vDPA/ifcvf management link
implementation series:
https://lore.kernel.org/kvm/20210812032454.24486-2-lingshan.zhu@intel.com/T/


Thanks!

Zhu Lingshan (2):
   vDPA/ifcvf: detect and use the onboard number of queues directly
   vDPA/ifcvf: enable multiqueue and control vq

  drivers/vdpa/ifcvf/ifcvf_base.c |  8 +++++---
  drivers/vdpa/ifcvf/ifcvf_base.h | 19 ++++---------------
  drivers/vdpa/ifcvf/ifcvf_main.c | 32 +++++++++++++++-----------------
  3 files changed, 24 insertions(+), 35 deletions(-)
Patch looks good.

I wonder the compatibility. E.g does it work on the qemu master
without cvq support? (mq=off or not specified)
Hi Jason,

Yes, it works with qemu master. When no cvq/mq support, only one queue
pair shown.
Good to know this.

Thanks
Thanks,
Zhu Lingshan
quoted
Thanks

Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help