From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mellanox.co.il (mail-il-dmz.mellanox.com [193.47.165.129]) by dpdk.org (Postfix) with ESMTP id 1F831A3 for ; Fri, 8 Mar 2019 18:48:53 +0100 (CET) Received: from Internal Mail-Server by MTLPINE1 (envelope-from yskoh@mellanox.com) with ESMTPS (AES256-SHA encrypted); 8 Mar 2019 19:48:47 +0200 Received: from scfae-sc-2.mti.labs.mlnx (scfae-sc-2.mti.labs.mlnx [10.101.0.96]) by labmailer.mlnx (8.13.8/8.13.8) with ESMTP id x28HloAn002625; Fri, 8 Mar 2019 19:48:46 +0200 From: Yongseok Koh To: Wei Zhao Cc: Qi Zhang , dpdk stable Date: Fri, 8 Mar 2019 09:47:11 -0800 Message-Id: <20190308174749.30771-33-yskoh@mellanox.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20190308174749.30771-1-yskoh@mellanox.com> References: <20190308174749.30771-1-yskoh@mellanox.com> Subject: [dpdk-stable] patch 'net/ixgbe: fix over using multicast table for VF' has been queued to LTS release 17.11.6 X-BeenThere: stable@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches for DPDK stable branches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 08 Mar 2019 17:48:53 -0000 Hi, FYI, your patch has been queued to LTS release 17.11.6 Note it hasn't been pushed to http://dpdk.org/browse/dpdk-stable yet. It will be pushed if I get no objection by 03/13/19. So please shout if anyone has objection. Also note that after the patch there's a diff of the upstream commit vs the patch applied to the branch. If the code is different (ie: not only metadata diffs), due for example to a change in context or macro names, please double check it. Thanks. Yongseok --- >>From 477a4fffb3473619dfccdab357244e514bcfd884 Mon Sep 17 00:00:00 2001 From: Wei Zhao Date: Mon, 7 Jan 2019 15:22:56 +0800 Subject: [PATCH] net/ixgbe: fix over using multicast table for VF [ upstream commit dc5a6e74224094ae702fa971c4ce039b4a2e3560 ] According to the current implementation, all VFs will set bit IXGBE_VMOLR_ROMPE during initialization, this cause any VF will accept packets that match the MTA table. Since the MTA table is shared by all VFs which means if one VF update MTA table in function ixgbe_vf_set_multicast, then all other VFs will receive multicast packets which cause unnecessary performance overhead. So it's better to set VF's ROPE bit of register VMOLR only if multicast address filter is required on that VF. Also, the ROPE bit should be reset when multicast address filter is requested to clean. This patch also aligns to the related fix on ixgbe kernel driver 5.3.7. Fixes: 00e30184daa0 ("ixgbe: add PF support") Signed-off-by: Wei Zhao Acked-by: Qi Zhang --- drivers/net/ixgbe/ixgbe_pf.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/drivers/net/ixgbe/ixgbe_pf.c b/drivers/net/ixgbe/ixgbe_pf.c index 011469417..22ecbad01 100644 --- a/drivers/net/ixgbe/ixgbe_pf.c +++ b/drivers/net/ixgbe/ixgbe_pf.c @@ -374,7 +374,7 @@ ixgbe_vf_reset_event(struct rte_eth_dev *dev, uint16_t vf) int rar_entry = hw->mac.num_rar_entries - (vf + 1); uint32_t vmolr = IXGBE_READ_REG(hw, IXGBE_VMOLR(vf)); - vmolr |= (IXGBE_VMOLR_ROPE | IXGBE_VMOLR_ROMPE | + vmolr |= (IXGBE_VMOLR_ROPE | IXGBE_VMOLR_BAM | IXGBE_VMOLR_AUPE); IXGBE_WRITE_REG(hw, IXGBE_VMOLR(vf), vmolr); @@ -526,6 +526,7 @@ ixgbe_vf_set_multicast(struct rte_eth_dev *dev, uint32_t vf, uint32_t *msgbuf) const uint32_t IXGBE_MTA_BIT_MASK = (0x1 << IXGBE_MTA_BIT_SHIFT) - 1; uint32_t reg_val; int i; + u32 vmolr = IXGBE_READ_REG(hw, IXGBE_VMOLR(vf)); /* Disable multicast promiscuous first */ ixgbe_disable_vf_mc_promisc(dev, vf); @@ -539,6 +540,12 @@ ixgbe_vf_set_multicast(struct rte_eth_dev *dev, uint32_t vf, uint32_t *msgbuf) vfinfo->vf_mc_hashes[i] = hash_list[i]; } + if (nb_entries == 0) { + vmolr &= ~IXGBE_VMOLR_ROMPE; + IXGBE_WRITE_REG(hw, IXGBE_VMOLR(vf), vmolr); + return 0; + } + for (i = 0; i < vfinfo->num_vf_mc_hashes; i++) { mta_idx = (vfinfo->vf_mc_hashes[i] >> IXGBE_MTA_BIT_SHIFT) & IXGBE_MTA_INDEX_MASK; @@ -548,6 +555,9 @@ ixgbe_vf_set_multicast(struct rte_eth_dev *dev, uint32_t vf, uint32_t *msgbuf) IXGBE_WRITE_REG(hw, IXGBE_MTA(mta_idx), reg_val); } + vmolr |= IXGBE_VMOLR_ROMPE; + IXGBE_WRITE_REG(hw, IXGBE_VMOLR(vf), vmolr); + return 0; } -- 2.11.0 --- Diff of the applied patch vs upstream commit (please double-check if non-empty: --- --- - 2019-03-08 09:46:41.935063961 -0800 +++ 0033-net-ixgbe-fix-over-using-multicast-table-for-VF.patch 2019-03-08 09:46:40.148405000 -0800 @@ -1,8 +1,10 @@ -From dc5a6e74224094ae702fa971c4ce039b4a2e3560 Mon Sep 17 00:00:00 2001 +From 477a4fffb3473619dfccdab357244e514bcfd884 Mon Sep 17 00:00:00 2001 From: Wei Zhao Date: Mon, 7 Jan 2019 15:22:56 +0800 Subject: [PATCH] net/ixgbe: fix over using multicast table for VF +[ upstream commit dc5a6e74224094ae702fa971c4ce039b4a2e3560 ] + According to the current implementation, all VFs will set bit IXGBE_VMOLR_ROMPE during initialization, this cause any VF will accept packets that match the MTA table. Since the MTA @@ -20,7 +22,6 @@ kernel driver 5.3.7. Fixes: 00e30184daa0 ("ixgbe: add PF support") -Cc: stable@dpdk.org Signed-off-by: Wei Zhao Acked-by: Qi Zhang @@ -29,10 +30,10 @@ 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/drivers/net/ixgbe/ixgbe_pf.c b/drivers/net/ixgbe/ixgbe_pf.c -index 4b833ffab..be0c0768c 100644 +index 011469417..22ecbad01 100644 --- a/drivers/net/ixgbe/ixgbe_pf.c +++ b/drivers/net/ixgbe/ixgbe_pf.c -@@ -351,7 +351,7 @@ ixgbe_vf_reset_event(struct rte_eth_dev *dev, uint16_t vf) +@@ -374,7 +374,7 @@ ixgbe_vf_reset_event(struct rte_eth_dev *dev, uint16_t vf) int rar_entry = hw->mac.num_rar_entries - (vf + 1); uint32_t vmolr = IXGBE_READ_REG(hw, IXGBE_VMOLR(vf)); @@ -41,7 +42,7 @@ IXGBE_VMOLR_BAM | IXGBE_VMOLR_AUPE); IXGBE_WRITE_REG(hw, IXGBE_VMOLR(vf), vmolr); -@@ -503,6 +503,7 @@ ixgbe_vf_set_multicast(struct rte_eth_dev *dev, uint32_t vf, uint32_t *msgbuf) +@@ -526,6 +526,7 @@ ixgbe_vf_set_multicast(struct rte_eth_dev *dev, uint32_t vf, uint32_t *msgbuf) const uint32_t IXGBE_MTA_BIT_MASK = (0x1 << IXGBE_MTA_BIT_SHIFT) - 1; uint32_t reg_val; int i; @@ -49,7 +50,7 @@ /* Disable multicast promiscuous first */ ixgbe_disable_vf_mc_promisc(dev, vf); -@@ -516,6 +517,12 @@ ixgbe_vf_set_multicast(struct rte_eth_dev *dev, uint32_t vf, uint32_t *msgbuf) +@@ -539,6 +540,12 @@ ixgbe_vf_set_multicast(struct rte_eth_dev *dev, uint32_t vf, uint32_t *msgbuf) vfinfo->vf_mc_hashes[i] = hash_list[i]; } @@ -62,7 +63,7 @@ for (i = 0; i < vfinfo->num_vf_mc_hashes; i++) { mta_idx = (vfinfo->vf_mc_hashes[i] >> IXGBE_MTA_BIT_SHIFT) & IXGBE_MTA_INDEX_MASK; -@@ -525,6 +532,9 @@ ixgbe_vf_set_multicast(struct rte_eth_dev *dev, uint32_t vf, uint32_t *msgbuf) +@@ -548,6 +555,9 @@ ixgbe_vf_set_multicast(struct rte_eth_dev *dev, uint32_t vf, uint32_t *msgbuf) IXGBE_WRITE_REG(hw, IXGBE_MTA(mta_idx), reg_val); }