* Re: [dpdk-dev] [PATCH] i40e: fix the VF rss issue when nb_rx_queue is less than nb_tx_queue
2015-07-13 1:21 [dpdk-dev] [PATCH] i40e: fix the VF rss issue when nb_rx_queue is less than nb_tx_queue Jingjing Wu
@ 2015-07-14 18:08 ` Zhang, Helin
2015-07-19 23:04 ` Thomas Monjalon
2015-07-17 9:07 ` Xu, Qian Q
1 sibling, 1 reply; 4+ messages in thread
From: Zhang, Helin @ 2015-07-14 18:08 UTC (permalink / raw)
To: Wu, Jingjing, dev
> -----Original Message-----
> From: Wu, Jingjing
> Sent: Sunday, July 12, 2015 6:22 PM
> To: dev@dpdk.org
> Cc: Wu, Jingjing; Xu, Qian Q; Zhang, Helin
> Subject: [PATCH] i40e: fix the VF rss issue when nb_rx_queue is less than
> nb_tx_queue
>
> From: "jingjing.wu" <jingjing.wu@intel.com>
>
> I40e VF driver uses the num_queue_pairs in vf structure to construct queue
> index look up table. When the nb_rx_queue is less than nb_tx_queue,
> num_queue_pairs is equal to nb_tx_queue. It will make the table use invalid
> queue index, then application cannot poll packets on these queues.
>
> This patch also moves the inline function i40e_align_floor from i40e_ethdev.c to
> i40e_ethdev.h.
>
> Signed-off-by: jingjing.wu <jingjing.wu@intel.com>
Acked-by: Helin Zhang <helin.zhang@intel.com>
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [dpdk-dev] [PATCH] i40e: fix the VF rss issue when nb_rx_queue is less than nb_tx_queue
2015-07-13 1:21 [dpdk-dev] [PATCH] i40e: fix the VF rss issue when nb_rx_queue is less than nb_tx_queue Jingjing Wu
2015-07-14 18:08 ` Zhang, Helin
@ 2015-07-17 9:07 ` Xu, Qian Q
1 sibling, 0 replies; 4+ messages in thread
From: Xu, Qian Q @ 2015-07-17 9:07 UTC (permalink / raw)
To: Wu, Jingjing, dev
Tested-by: Qian Xu <qian.q.xu@intel.com>
- Test Commit: 58d3da9eddad28012c16523aa0b5f63dae791bcb
- OS: Fedora 21
- GCC: gcc (GCC) 4.9.2 20141101 (Red Hat 4.9.2-1)
- CPU: Intel(R) Xeon(R) CPU E5-2699 v3 @ 2.30GHz
- NIC: Intel Corporation Ethernet Controller XL710 for 40G bE QSFP+
- Target: x86_64-native-linuxapp-gcc
- Guest: Fedora 20/ 3.11 kernel
- Total 1 cases, 1 passed, 0 failed.
Test case: L3FWD-VF on VM
1. Fortville PF generate 2VFs.
2. assign the VF to VM and launch the VM:
taskset -c 4-9 qemu-system-x86_64 \
-object memory-backend-file,id=mem,size=2048M,mem-path=/mnt/huge -mem-prealloc \
-enable-kvm -m 2048 -smp cores=6,sockets=1 -cpu host -name dpdk1-vm1 \
-drive file=/home/img/fc21-vm1.img \
-device pci-assign,host=03:02.0 \
-device pci-assign,host=03:02.1 \
-device pci-assign,host=05:02.0 \
-device pci-assign,host=05:02.1 \
-netdev tap,id=ipvm1,ifname=tap3,script=/etc/qemu-ifup -device rtl8139,netdev=ipvm1,id=net0,mac=00:00:00:00:00:01 \
-localtime -nographic
3. keep pf in dpdk driver, run testpmd but not start
4. run l3fwd in the VM, and send packets to VFs, no packet drops.
Thanks
Qian
-----Original Message-----
From: Wu, Jingjing
Sent: Monday, July 13, 2015 9:22 AM
To: dev@dpdk.org
Cc: Wu, Jingjing; Xu, Qian Q; Zhang, Helin
Subject: [PATCH] i40e: fix the VF rss issue when nb_rx_queue is less than nb_tx_queue
From: "jingjing.wu" <jingjing.wu@intel.com>
I40e VF driver uses the num_queue_pairs in vf structure to construct queue index look up table. When the nb_rx_queue is less than nb_tx_queue, num_queue_pairs is equal to nb_tx_queue. It will make the table use invalid queue index, then application cannot poll packets on these queues.
This patch also moves the inline function i40e_align_floor from i40e_ethdev.c to i40e_ethdev.h.
Signed-off-by: jingjing.wu <jingjing.wu@intel.com>
---
drivers/net/i40e/i40e_ethdev.c | 8 --------
drivers/net/i40e/i40e_ethdev.h | 8 ++++++++
drivers/net/i40e/i40e_ethdev_vf.c | 6 +++++-
3 files changed, 13 insertions(+), 9 deletions(-)
diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c index 5fb6b4c..051fd02 100644
--- a/drivers/net/i40e/i40e_ethdev.c
+++ b/drivers/net/i40e/i40e_ethdev.c
@@ -282,14 +282,6 @@ static struct eth_driver rte_i40e_pmd = { };
static inline int
-i40e_align_floor(int n)
-{
- if (n == 0)
- return 0;
- return (1 << (sizeof(n) * CHAR_BIT - 1 - __builtin_clz(n)));
-}
-
-static inline int
rte_i40e_dev_atomic_read_link_status(struct rte_eth_dev *dev,
struct rte_eth_link *link)
{
diff --git a/drivers/net/i40e/i40e_ethdev.h b/drivers/net/i40e/i40e_ethdev.h index 883ee06..6185657 100644
--- a/drivers/net/i40e/i40e_ethdev.h
+++ b/drivers/net/i40e/i40e_ethdev.h
@@ -563,6 +563,14 @@ i40e_init_adminq_parameter(struct i40e_hw *hw)
hw->aq.asq_buf_size = I40E_AQ_BUF_SZ;
}
+static inline int
+i40e_align_floor(int n)
+{
+ if (n == 0)
+ return 0;
+ return 1 << (sizeof(n) * CHAR_BIT - 1 - __builtin_clz(n)); }
+
#define I40E_VALID_FLOW(flow_type) \
((flow_type) == RTE_ETH_FLOW_FRAG_IPV4 || \
(flow_type) == RTE_ETH_FLOW_NONFRAG_IPV4_TCP || \ diff --git a/drivers/net/i40e/i40e_ethdev_vf.c b/drivers/net/i40e/i40e_ethdev_vf.c
index b150b62..c4ce2cf 100644
--- a/drivers/net/i40e/i40e_ethdev_vf.c
+++ b/drivers/net/i40e/i40e_ethdev_vf.c
@@ -1481,6 +1481,8 @@ i40evf_rx_init(struct rte_eth_dev *dev)
i40evf_config_rss(vf);
for (i = 0; i < dev->data->nb_rx_queues; i++) {
+ if (!rxq[i] || !rxq[i]->q_set)
+ continue;
if (i40evf_rxq_init(dev, rxq[i]) < 0)
return -EFAULT;
}
@@ -1857,6 +1859,7 @@ i40evf_config_rss(struct i40e_vf *vf)
struct i40e_hw *hw = I40E_VF_TO_HW(vf);
struct rte_eth_rss_conf rss_conf;
uint32_t i, j, lut = 0, nb_q = (I40E_VFQF_HLUT_MAX_INDEX + 1) * 4;
+ uint16_t num;
if (vf->dev_data->dev_conf.rxmode.mq_mode != ETH_MQ_RX_RSS) {
i40evf_disable_rss(vf);
@@ -1864,9 +1867,10 @@ i40evf_config_rss(struct i40e_vf *vf)
return 0;
}
+ num = i40e_align_floor(vf->dev_data->nb_rx_queues);
/* Fill out the look up table */
for (i = 0, j = 0; i < nb_q; i++, j++) {
- if (j >= vf->num_queue_pairs)
+ if (j >= num)
j = 0;
lut = (lut << 8) | j;
if ((i & 3) == 3)
--
2.4.0
^ permalink raw reply [flat|nested] 4+ messages in thread