From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga11.intel.com (mga11.intel.com [192.55.52.93]) by dpdk.org (Postfix) with ESMTP id BA689592B for ; Mon, 13 Jul 2015 03:21:50 +0200 (CEST) Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by fmsmga102.fm.intel.com with ESMTP; 12 Jul 2015 18:21:49 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.15,459,1432623600"; d="scan'208";a="761118477" Received: from shvmail01.sh.intel.com ([10.239.29.42]) by fmsmga002.fm.intel.com with ESMTP; 12 Jul 2015 18:21:49 -0700 Received: from shecgisg004.sh.intel.com (shecgisg004.sh.intel.com [10.239.29.89]) by shvmail01.sh.intel.com with ESMTP id t6D1Ll6p022222; Mon, 13 Jul 2015 09:21:47 +0800 Received: from shecgisg004.sh.intel.com (localhost [127.0.0.1]) by shecgisg004.sh.intel.com (8.13.6/8.13.6/SuSE Linux 0.8) with ESMTP id t6D1LiC0006619; Mon, 13 Jul 2015 09:21:46 +0800 Received: (from wujingji@localhost) by shecgisg004.sh.intel.com (8.13.6/8.13.6/Submit) id t6D1Likm006615; Mon, 13 Jul 2015 09:21:44 +0800 From: Jingjing Wu To: dev@dpdk.org Date: Mon, 13 Jul 2015 09:21:41 +0800 Message-Id: <1436750501-6585-1-git-send-email-jingjing.wu@intel.com> X-Mailer: git-send-email 1.7.4.1 Subject: [dpdk-dev] [PATCH] i40e: fix the VF rss issue when nb_rx_queue is less than nb_tx_queue X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 13 Jul 2015 01:21:51 -0000 From: "jingjing.wu" 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 --- 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