From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from dpdk.org (dpdk.org [92.243.14.124]) by dpdk.space (Postfix) with ESMTP id 5967CA0096 for ; Wed, 8 May 2019 12:15:58 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 5155C34F0; Wed, 8 May 2019 12:15:58 +0200 (CEST) Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by dpdk.org (Postfix) with ESMTP id 9E20A4C77 for ; Wed, 8 May 2019 12:15:56 +0200 (CEST) Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 0FFD3C0601F2; Wed, 8 May 2019 10:15:56 +0000 (UTC) Received: from rh.redhat.com (ovpn-117-210.ams2.redhat.com [10.36.117.210]) by smtp.corp.redhat.com (Postfix) with ESMTP id 327E41A267; Wed, 8 May 2019 10:15:55 +0000 (UTC) From: Kevin Traynor To: Rasesh Mody Cc: dpdk stable Date: Wed, 8 May 2019 11:14:47 +0100 Message-Id: <20190508101534.8984-5-ktraynor@redhat.com> In-Reply-To: <20190508101534.8984-1-ktraynor@redhat.com> References: <20190508101534.8984-1-ktraynor@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Scanned-By: MIMEDefang 2.84 on 10.5.11.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.32]); Wed, 08 May 2019 10:15:56 +0000 (UTC) Subject: [dpdk-stable] patch 'net/bnx2x: fix race for periodic flags' has been queued to LTS release 18.11.2 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: , Errors-To: stable-bounces@dpdk.org Sender: "stable" Hi, FYI, your patch has been queued to LTS release 18.11.2 Note it hasn't been pushed to http://dpdk.org/browse/dpdk-stable yet. It will be pushed if I get no objections before 05/13/19. So please shout if anyone has objections. Also note that after the patch there's a diff of the upstream commit vs the patch applied to the branch. This will indicate if there was any rebasing needed to apply to the stable branch. If there were code changes for rebasing (ie: not only metadata diffs), please double check that the rebase was correctly done. Queued patches are on a temporary branch at: https://github.com/kevintraynor/dpdk-stable-queue This queued commit can be viewed at: https://github.com/kevintraynor/dpdk-stable-queue/commit/c00065cb6d1455933a6d4c1e6362044c9bfa158a Thanks. Kevin Traynor --- >From c00065cb6d1455933a6d4c1e6362044c9bfa158a Mon Sep 17 00:00:00 2001 From: Rasesh Mody Date: Thu, 11 Apr 2019 18:47:41 -0700 Subject: [PATCH] net/bnx2x: fix race for periodic flags [ upstream commit c19eafccb22e1b1ca52439a936908cfd6fd12ff1 ] The periodic callout function and the interrupt handler both modify the periodic flags. There is a possible race condition when an application is going through dev_stop()/dev_start() and an interrupt handler is invoked. We also need to ensure that periodic polling is not invoked in interrupt context. This patch handles such case by using separate variable to check for interrupt context. Also, atomically load and store the periodic flag value. Fixes: 0f6ebeee2402 ("net/bnx2x: fix call to link handling periodic function") Signed-off-by: Rasesh Mody --- drivers/net/bnx2x/bnx2x_ethdev.c | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/drivers/net/bnx2x/bnx2x_ethdev.c b/drivers/net/bnx2x/bnx2x_ethdev.c index fb44a71f2..c628cdc0f 100644 --- a/drivers/net/bnx2x/bnx2x_ethdev.c +++ b/drivers/net/bnx2x/bnx2x_ethdev.c @@ -108,5 +108,5 @@ bnx2x_link_update(struct rte_eth_dev *dev) static void -bnx2x_interrupt_action(struct rte_eth_dev *dev) +bnx2x_interrupt_action(struct rte_eth_dev *dev, int intr_cxt) { struct bnx2x_softc *sc = dev->data->dev_private; @@ -115,5 +115,6 @@ bnx2x_interrupt_action(struct rte_eth_dev *dev) bnx2x_intr_legacy(sc); - if (sc->periodic_flags & PERIODIC_GO) + if ((atomic_load_acq_long(&sc->periodic_flags) == PERIODIC_GO) && + !intr_cxt) bnx2x_periodic_callout(sc); link_status = REG_RD(sc, sc->link_params.shmem_base + @@ -132,7 +133,5 @@ bnx2x_interrupt_handler(void *param) PMD_DEBUG_PERIODIC_LOG(INFO, sc, "Interrupt handled"); - atomic_store_rel_long(&sc->periodic_flags, PERIODIC_STOP); - bnx2x_interrupt_action(dev); - atomic_store_rel_long(&sc->periodic_flags, PERIODIC_GO); + bnx2x_interrupt_action(dev, 1); rte_intr_enable(&sc->pci_dev->intr_handle); } @@ -145,5 +144,5 @@ static void bnx2x_periodic_start(void *param) atomic_store_rel_long(&sc->periodic_flags, PERIODIC_GO); - bnx2x_interrupt_action(dev); + bnx2x_interrupt_action(dev, 0); if (IS_PF(sc)) { ret = rte_eal_alarm_set(BNX2X_SP_TIMER_PERIOD, @@ -165,4 +164,6 @@ void bnx2x_periodic_stop(void *param) rte_eal_alarm_cancel(bnx2x_periodic_start, (void *)dev); + + PMD_DRV_LOG(DEBUG, sc, "Periodic poll stopped"); } @@ -226,6 +227,8 @@ bnx2x_dev_start(struct rte_eth_dev *dev) /* start the periodic callout */ - if (sc->periodic_flags & PERIODIC_STOP) + if (atomic_load_acq_long(&sc->periodic_flags) == PERIODIC_STOP) { bnx2x_periodic_start(dev); + PMD_DRV_LOG(DEBUG, sc, "Periodic poll re-started"); + } ret = bnx2x_init(sc); -- 2.20.1 --- Diff of the applied patch vs upstream commit (please double-check if non-empty: --- --- - 2019-05-08 11:05:06.113850223 +0100 +++ 0005-net-bnx2x-fix-race-for-periodic-flags.patch 2019-05-08 11:05:05.752934373 +0100 @@ -1 +1 @@ -From c19eafccb22e1b1ca52439a936908cfd6fd12ff1 Mon Sep 17 00:00:00 2001 +From c00065cb6d1455933a6d4c1e6362044c9bfa158a Mon Sep 17 00:00:00 2001 @@ -5,0 +6,2 @@ +[ upstream commit c19eafccb22e1b1ca52439a936908cfd6fd12ff1 ] + @@ -17 +18,0 @@ -Cc: stable@dpdk.org @@ -25 +26 @@ -index f85766c68..3063aea64 100644 +index fb44a71f2..c628cdc0f 100644 @@ -28 +29 @@ -@@ -109,5 +109,5 @@ bnx2x_link_update(struct rte_eth_dev *dev) +@@ -108,5 +108,5 @@ bnx2x_link_update(struct rte_eth_dev *dev) @@ -35 +36 @@ -@@ -116,5 +116,6 @@ bnx2x_interrupt_action(struct rte_eth_dev *dev) +@@ -115,5 +115,6 @@ bnx2x_interrupt_action(struct rte_eth_dev *dev) @@ -43 +44 @@ -@@ -133,7 +134,5 @@ bnx2x_interrupt_handler(void *param) +@@ -132,7 +133,5 @@ bnx2x_interrupt_handler(void *param) @@ -52 +53 @@ -@@ -146,5 +145,5 @@ static void bnx2x_periodic_start(void *param) +@@ -145,5 +144,5 @@ static void bnx2x_periodic_start(void *param) @@ -59 +60 @@ -@@ -166,4 +165,6 @@ void bnx2x_periodic_stop(void *param) +@@ -165,4 +164,6 @@ void bnx2x_periodic_stop(void *param) @@ -66 +67 @@ -@@ -227,6 +228,8 @@ bnx2x_dev_start(struct rte_eth_dev *dev) +@@ -226,6 +227,8 @@ bnx2x_dev_start(struct rte_eth_dev *dev)