From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 8B5F3A0C47 for ; Mon, 26 Jul 2021 15:56:07 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 8550D40DDA; Mon, 26 Jul 2021 15:56:07 +0200 (CEST) Received: from mail-wr1-f48.google.com (mail-wr1-f48.google.com [209.85.221.48]) by mails.dpdk.org (Postfix) with ESMTP id 5D1B740DDA for ; Mon, 26 Jul 2021 15:56:06 +0200 (CEST) Received: by mail-wr1-f48.google.com with SMTP id l18so3533220wrv.5 for ; Mon, 26 Jul 2021 06:56:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=nXsYwROXW4oLqmBjHgyq0JoCffu+aFkMarqorwnzZiQ=; b=ROCiB6DFTu0+78TVmWp7zToojvOwk0jQyyUmuGOJ51uyIQY8BBeQgzPYa44q3tLvfj EDsWY99Bbyjs1GuuiqRWgxdZf5Mi2zwYHDsNRqzbUEnWSBEnWDndBWgZcrscM+QYA1Nu tgBOtjeREaZE/6118GOwEI62WVJOVz81cpE/zOXxGuf20rQRn+XlTDY18AzCSuvnIepZ etyaC0tTFKgyNck6OdKR45PkNOMkaIgdy957OeRiFFFkaKasBiFkozGjgJoSVrZUW6O3 659zPguiPF3jChixMnbArRWIFAVbxSInAuifTbgTVRfUWPkq0V840q/7Sise2fkwr3vO DRow== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=nXsYwROXW4oLqmBjHgyq0JoCffu+aFkMarqorwnzZiQ=; b=PB2bS668//ThflCJlDpt4gv0Cev/bWQWN5CXDLwlbUkLKHwwYI4z0fB+sOpRoS7V/p d/mC6d9AUWCFGZKbrE31Ldga9Udff7M2rS+e/MpJ0QL/vYmdzRZmfhNiUyOm0fUSdAKk pmCB4J6R/Yu7R9OFZQpOoHji2ceLlPAt+kNuSWMh9ErIWtuJGxOptCWnNwgyl9dvvPSV sSjyhDgp9g03APBO/Kf+3Qh3DTVeyyv5Mqcucv6+QCzcWauxLjrqOGIQaV445BqUpbXq nDuyj7X+ZfaRf/zKxlt/aaOyKAxfZscXpcdigmo+4rV4j4pLQq29fK+JNnUjskY8Igo3 B3hw== X-Gm-Message-State: AOAM532L9dDUHJcAIeDZkY5J+IYIDl/LBBSiZBZ/PzjdAgicQycAFyNu 3Mu5zZLhw90zOMSv1RzVny4= X-Google-Smtp-Source: ABdhPJw80N+PeVntEgnBB/PcB8PGoMc5E1BwPKIjXSaYfZpcVQQERGCzIweG2JlCIZGQLJ2bU20cvA== X-Received: by 2002:a5d:4c52:: with SMTP id n18mr19509213wrt.295.1627307766112; Mon, 26 Jul 2021 06:56:06 -0700 (PDT) Received: from localhost ([137.220.125.106]) by smtp.gmail.com with ESMTPSA id v15sm14308251wmj.39.2021.07.26.06.56.05 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 26 Jul 2021 06:56:05 -0700 (PDT) From: luca.boccassi@gmail.com To: Ivan Ilchenko Cc: Andrew Rybchenko , Andy Moreton , dpdk stable Date: Mon, 26 Jul 2021 14:53:15 +0100 Message-Id: <20210726135322.149850-52-luca.boccassi@gmail.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20210726135322.149850-1-luca.boccassi@gmail.com> References: <20210712130551.2462159-1-luca.boccassi@gmail.com> <20210726135322.149850-1-luca.boccassi@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Subject: [dpdk-stable] patch 'net/sfc: fix reading adapter state without locking' has been queued to stable release 20.11.3 X-BeenThere: stable@dpdk.org X-Mailman-Version: 2.1.29 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 stable release 20.11.3 Note it hasn't been pushed to http://dpdk.org/browse/dpdk-stable yet. It will be pushed if I get no objections before 07/28/21. 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/bluca/dpdk-stable This queued commit can be viewed at: https://github.com/bluca/dpdk-stable/commit/99bcdae014724bf2778be39a94013df99a85698c Thanks. Luca Boccassi --- >From 99bcdae014724bf2778be39a94013df99a85698c Mon Sep 17 00:00:00 2001 From: Ivan Ilchenko Date: Fri, 23 Jul 2021 16:15:06 +0300 Subject: [PATCH] net/sfc: fix reading adapter state without locking [ upstream commit 17b0d7b36777341486efc0959d5ed69cf5af5f26 ] Update MAC stats function reads adapter state with MAC stats locking but without adapter locking. Add adapter locking before calling this function and remove MAC stats locking since there's no point to have it together with adapter locking. The second place MAC stats locking is used is MAC stats reset function. It's called with adapter being already locked so there's no point to use MAC stats locking anymore. Fixes: 1caab2f1e68 ("net/sfc: add basic statistics") Signed-off-by: Ivan Ilchenko Signed-off-by: Andrew Rybchenko Reviewed-by: Andy Moreton --- drivers/net/sfc/sfc.h | 1 - drivers/net/sfc/sfc_ethdev.c | 28 ++++++++++++++++++++-------- drivers/net/sfc/sfc_port.c | 9 +++------ 3 files changed, 23 insertions(+), 15 deletions(-) diff --git a/drivers/net/sfc/sfc.h b/drivers/net/sfc/sfc.h index ed059e142f..0811dd0aff 100644 --- a/drivers/net/sfc/sfc.h +++ b/drivers/net/sfc/sfc.h @@ -128,7 +128,6 @@ struct sfc_port { unsigned int nb_mcast_addrs; uint8_t *mcast_addrs; - rte_spinlock_t mac_stats_lock; uint64_t *mac_stats_buf; unsigned int mac_stats_nb_supported; efsys_mem_t mac_stats_dma_mem; diff --git a/drivers/net/sfc/sfc_ethdev.c b/drivers/net/sfc/sfc_ethdev.c index 529027630e..41dc0bf05d 100644 --- a/drivers/net/sfc/sfc_ethdev.c +++ b/drivers/net/sfc/sfc_ethdev.c @@ -604,7 +604,7 @@ sfc_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats) uint64_t *mac_stats; int ret; - rte_spinlock_lock(&port->mac_stats_lock); + sfc_adapter_lock(sa); ret = sfc_port_update_mac_stats(sa); if (ret != 0) @@ -677,7 +677,7 @@ sfc_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats) } unlock: - rte_spinlock_unlock(&port->mac_stats_lock); + sfc_adapter_unlock(sa); SFC_ASSERT(ret >= 0); return -ret; } @@ -689,12 +689,15 @@ sfc_stats_reset(struct rte_eth_dev *dev) struct sfc_port *port = &sa->port; int rc; + sfc_adapter_lock(sa); + if (sa->state != SFC_ADAPTER_STARTED) { /* * The operation cannot be done if port is not started; it * will be scheduled to be done during the next port start */ port->mac_stats_reset_pending = B_TRUE; + sfc_adapter_unlock(sa); return 0; } @@ -702,6 +705,8 @@ sfc_stats_reset(struct rte_eth_dev *dev) if (rc != 0) sfc_err(sa, "failed to reset statistics (rc = %d)", rc); + sfc_adapter_unlock(sa); + SFC_ASSERT(rc >= 0); return -rc; } @@ -717,7 +722,7 @@ sfc_xstats_get(struct rte_eth_dev *dev, struct rte_eth_xstat *xstats, unsigned int i; int nstats = 0; - rte_spinlock_lock(&port->mac_stats_lock); + sfc_adapter_lock(sa); rc = sfc_port_update_mac_stats(sa); if (rc != 0) { @@ -739,7 +744,7 @@ sfc_xstats_get(struct rte_eth_dev *dev, struct rte_eth_xstat *xstats, } unlock: - rte_spinlock_unlock(&port->mac_stats_lock); + sfc_adapter_unlock(sa); return nstats; } @@ -780,7 +785,7 @@ sfc_xstats_get_by_id(struct rte_eth_dev *dev, const uint64_t *ids, int ret; int rc; - rte_spinlock_lock(&port->mac_stats_lock); + sfc_adapter_lock(sa); if (unlikely(values == NULL) || unlikely(ids == NULL && n < port->mac_stats_nb_supported)) { @@ -810,7 +815,7 @@ sfc_xstats_get_by_id(struct rte_eth_dev *dev, const uint64_t *ids, ret = nb_written; unlock: - rte_spinlock_unlock(&port->mac_stats_lock); + sfc_adapter_unlock(sa); return ret; } @@ -826,9 +831,14 @@ sfc_xstats_get_names_by_id(struct rte_eth_dev *dev, unsigned int nb_written = 0; unsigned int i; + sfc_adapter_lock(sa); + if (unlikely(xstats_names == NULL) || - unlikely((ids == NULL) && (size < port->mac_stats_nb_supported))) - return port->mac_stats_nb_supported; + unlikely((ids == NULL) && (size < port->mac_stats_nb_supported))) { + nb_supported = port->mac_stats_nb_supported; + sfc_adapter_unlock(sa); + return nb_supported; + } for (i = 0; (i < EFX_MAC_NSTATS) && (nb_written < size); ++i) { if (!EFX_MAC_STAT_SUPPORTED(port->mac_stats_mask, i)) @@ -844,6 +854,8 @@ sfc_xstats_get_names_by_id(struct rte_eth_dev *dev, ++nb_supported; } + sfc_adapter_unlock(sa); + return nb_written; } diff --git a/drivers/net/sfc/sfc_port.c b/drivers/net/sfc/sfc_port.c index 4de13267d5..d876996826 100644 --- a/drivers/net/sfc/sfc_port.c +++ b/drivers/net/sfc/sfc_port.c @@ -43,7 +43,7 @@ sfc_port_update_mac_stats(struct sfc_adapter *sa) unsigned int nb_attempts = 0; int rc; - SFC_ASSERT(rte_spinlock_is_locked(&port->mac_stats_lock)); + SFC_ASSERT(sfc_adapter_is_locked(sa)); if (sa->state != SFC_ADAPTER_STARTED) return EINVAL; @@ -103,14 +103,13 @@ sfc_port_reset_sw_stats(struct sfc_adapter *sa) int sfc_port_reset_mac_stats(struct sfc_adapter *sa) { - struct sfc_port *port = &sa->port; int rc; - rte_spinlock_lock(&port->mac_stats_lock); + SFC_ASSERT(sfc_adapter_is_locked(sa)); + rc = efx_mac_stats_clear(sa->nic); if (rc == 0) sfc_port_reset_sw_stats(sa); - rte_spinlock_unlock(&port->mac_stats_lock); return rc; } @@ -416,8 +415,6 @@ sfc_port_attach(struct sfc_adapter *sa) goto fail_mcast_addr_list_buf_alloc; } - rte_spinlock_init(&port->mac_stats_lock); - rc = ENOMEM; port->mac_stats_buf = rte_calloc_socket("mac_stats_buf", EFX_MAC_NSTATS, sizeof(uint64_t), 0, -- 2.30.2 --- Diff of the applied patch vs upstream commit (please double-check if non-empty: --- --- - 2021-07-26 13:53:18.908567553 +0100 +++ 0052-net-sfc-fix-reading-adapter-state-without-locking.patch 2021-07-26 13:53:15.957294893 +0100 @@ -1 +1 @@ -From 17b0d7b36777341486efc0959d5ed69cf5af5f26 Mon Sep 17 00:00:00 2001 +From 99bcdae014724bf2778be39a94013df99a85698c Mon Sep 17 00:00:00 2001 @@ -5,0 +6,2 @@ +[ upstream commit 17b0d7b36777341486efc0959d5ed69cf5af5f26 ] + @@ -14 +15,0 @@ -Cc: stable@dpdk.org @@ -26 +27 @@ -index 546739bd4a..c7b0e5a30d 100644 +index ed059e142f..0811dd0aff 100644 @@ -29 +30 @@ -@@ -130,7 +130,6 @@ struct sfc_port { +@@ -128,7 +128,6 @@ struct sfc_port { @@ -38 +39 @@ -index d4ac61ff76..d5417e5e65 100644 +index 529027630e..41dc0bf05d 100644 @@ -41 +42 @@ -@@ -613,7 +613,7 @@ sfc_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats) +@@ -604,7 +604,7 @@ sfc_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats) @@ -50 +51 @@ -@@ -686,7 +686,7 @@ sfc_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats) +@@ -677,7 +677,7 @@ sfc_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats) @@ -59 +60 @@ -@@ -698,12 +698,15 @@ sfc_stats_reset(struct rte_eth_dev *dev) +@@ -689,12 +689,15 @@ sfc_stats_reset(struct rte_eth_dev *dev) @@ -75 +76 @@ -@@ -711,6 +714,8 @@ sfc_stats_reset(struct rte_eth_dev *dev) +@@ -702,6 +705,8 @@ sfc_stats_reset(struct rte_eth_dev *dev) @@ -84 +85 @@ -@@ -726,7 +731,7 @@ sfc_xstats_get(struct rte_eth_dev *dev, struct rte_eth_xstat *xstats, +@@ -717,7 +722,7 @@ sfc_xstats_get(struct rte_eth_dev *dev, struct rte_eth_xstat *xstats, @@ -93 +94 @@ -@@ -748,7 +753,7 @@ sfc_xstats_get(struct rte_eth_dev *dev, struct rte_eth_xstat *xstats, +@@ -739,7 +744,7 @@ sfc_xstats_get(struct rte_eth_dev *dev, struct rte_eth_xstat *xstats, @@ -102 +103 @@ -@@ -789,7 +794,7 @@ sfc_xstats_get_by_id(struct rte_eth_dev *dev, const uint64_t *ids, +@@ -780,7 +785,7 @@ sfc_xstats_get_by_id(struct rte_eth_dev *dev, const uint64_t *ids, @@ -111 +112 @@ -@@ -819,7 +824,7 @@ sfc_xstats_get_by_id(struct rte_eth_dev *dev, const uint64_t *ids, +@@ -810,7 +815,7 @@ sfc_xstats_get_by_id(struct rte_eth_dev *dev, const uint64_t *ids, @@ -120 +121 @@ -@@ -835,9 +840,14 @@ sfc_xstats_get_names_by_id(struct rte_eth_dev *dev, +@@ -826,9 +831,14 @@ sfc_xstats_get_names_by_id(struct rte_eth_dev *dev, @@ -137 +138 @@ -@@ -853,6 +863,8 @@ sfc_xstats_get_names_by_id(struct rte_eth_dev *dev, +@@ -844,6 +854,8 @@ sfc_xstats_get_names_by_id(struct rte_eth_dev *dev, @@ -147 +148 @@ -index ac117f9c48..cdc0f94f19 100644 +index 4de13267d5..d876996826 100644