From patchwork Thu Feb 6 22:56:35 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakub Kicinski X-Patchwork-Id: 13964038 X-Patchwork-Delegate: kuba@kernel.org Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 1D5FB2417D5 for ; Thu, 6 Feb 2025 22:56:52 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738882614; cv=none; b=D9zZvSAp30hjddgIVUKZDmCQLIdh/Crgj0qDY3SHmYxi43y0i3WGPTEXzu0v8oYcuEr4ocSFTp1q8UBHF8MgvXDm+p8Y9Hxwccf43M7Hz/514GN5qHGmTXNjoSAivQHq8ldUxuKyEH5smKjIVsZkReELQKb3dg4lX1cBqMvUEd4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738882614; c=relaxed/simple; bh=/B7IRCyXsg7eaxH7DTtqwWtUJl7ouEXyji5+0llCgHE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=GBdkIt5XOnZjoNqUuOz3l3au1imJYVJpXzfBsoLNrg9PcstvE9of1EG4VWTtXU86OLMgUxW+jhbxcxuwC433unTGffJb91DrhLhaFi7u1oSnKZQcMr9O6Av7F6ODefmnQusJHfrG3PUrR25Oyfe7rIUgzxvWck1ygcB/NEkINEs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=MRV+ZXnq; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="MRV+ZXnq" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 390D5C4CEDF; Thu, 6 Feb 2025 22:56:52 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1738882612; bh=/B7IRCyXsg7eaxH7DTtqwWtUJl7ouEXyji5+0llCgHE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=MRV+ZXnq4S46vf4TL3jPO1BH4sWJHlM5hb6EWwdvKsGh9zqoW4IZ7TWhG/dltttFt TY0gtc+Vlh+LbfqgtScerACULILgb0AsfkBsBkSkezDzqMw9Nh4N4IvHEG+fOK3oaj CqgneawAu8n+13AhgGL43LEYBE7OvRYD3/2umSnU/p9LSDrIvcFm06Q66y14yRrdF4 UV9pyPpwoP4IScLN/vGIbPGn59VgUT63xr/D/j/xmTY/iD0yxOKzoBpWnKZKMSUWUx OODJOx5/5hrzTev7OB0koyl/DYize1L17+rVxv1yV1X6iUkCwtM5B19xJ09qcSn6oD RTXl9KoVntkow== From: Jakub Kicinski To: davem@davemloft.net Cc: netdev@vger.kernel.org, edumazet@google.com, pabeni@redhat.com, andrew+netdev@lunn.ch, horms@kernel.org, almasrymina@google.com, Jakub Kicinski Subject: [PATCH net-next v2 1/4] net: refactor netdev_rx_queue_restart() to use local qops Date: Thu, 6 Feb 2025 14:56:35 -0800 Message-ID: <20250206225638.1387810-2-kuba@kernel.org> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250206225638.1387810-1-kuba@kernel.org> References: <20250206225638.1387810-1-kuba@kernel.org> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Patchwork-Delegate: kuba@kernel.org Shorten the lines by storing dev->queue_mgmt_ops in a temp variable. Signed-off-by: Jakub Kicinski Reviewed-by: Mina Almasry --- net/core/netdev_rx_queue.c | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/net/core/netdev_rx_queue.c b/net/core/netdev_rx_queue.c index db82786fa0c4..a5813d50e058 100644 --- a/net/core/netdev_rx_queue.c +++ b/net/core/netdev_rx_queue.c @@ -9,28 +9,27 @@ int netdev_rx_queue_restart(struct net_device *dev, unsigned int rxq_idx) { struct netdev_rx_queue *rxq = __netif_get_rx_queue(dev, rxq_idx); + const struct netdev_queue_mgmt_ops *qops = dev->queue_mgmt_ops; void *new_mem, *old_mem; int err; - if (!dev->queue_mgmt_ops || !dev->queue_mgmt_ops->ndo_queue_stop || - !dev->queue_mgmt_ops->ndo_queue_mem_free || - !dev->queue_mgmt_ops->ndo_queue_mem_alloc || - !dev->queue_mgmt_ops->ndo_queue_start) + if (!qops || !qops->ndo_queue_stop || !qops->ndo_queue_mem_free || + !qops->ndo_queue_mem_alloc || !qops->ndo_queue_start) return -EOPNOTSUPP; ASSERT_RTNL(); - new_mem = kvzalloc(dev->queue_mgmt_ops->ndo_queue_mem_size, GFP_KERNEL); + new_mem = kvzalloc(qops->ndo_queue_mem_size, GFP_KERNEL); if (!new_mem) return -ENOMEM; - old_mem = kvzalloc(dev->queue_mgmt_ops->ndo_queue_mem_size, GFP_KERNEL); + old_mem = kvzalloc(qops->ndo_queue_mem_size, GFP_KERNEL); if (!old_mem) { err = -ENOMEM; goto err_free_new_mem; } - err = dev->queue_mgmt_ops->ndo_queue_mem_alloc(dev, new_mem, rxq_idx); + err = qops->ndo_queue_mem_alloc(dev, new_mem, rxq_idx); if (err) goto err_free_old_mem; @@ -38,15 +37,15 @@ int netdev_rx_queue_restart(struct net_device *dev, unsigned int rxq_idx) if (err) goto err_free_new_queue_mem; - err = dev->queue_mgmt_ops->ndo_queue_stop(dev, old_mem, rxq_idx); + err = qops->ndo_queue_stop(dev, old_mem, rxq_idx); if (err) goto err_free_new_queue_mem; - err = dev->queue_mgmt_ops->ndo_queue_start(dev, new_mem, rxq_idx); + err = qops->ndo_queue_start(dev, new_mem, rxq_idx); if (err) goto err_start_queue; - dev->queue_mgmt_ops->ndo_queue_mem_free(dev, old_mem); + qops->ndo_queue_mem_free(dev, old_mem); kvfree(old_mem); kvfree(new_mem); @@ -61,15 +60,15 @@ int netdev_rx_queue_restart(struct net_device *dev, unsigned int rxq_idx) * WARN if we fail to recover the old rx queue, and at least free * old_mem so we don't also leak that. */ - if (dev->queue_mgmt_ops->ndo_queue_start(dev, old_mem, rxq_idx)) { + if (qops->ndo_queue_start(dev, old_mem, rxq_idx)) { WARN(1, "Failed to restart old queue in error path. RX queue %d may be unhealthy.", rxq_idx); - dev->queue_mgmt_ops->ndo_queue_mem_free(dev, old_mem); + qops->ndo_queue_mem_free(dev, old_mem); } err_free_new_queue_mem: - dev->queue_mgmt_ops->ndo_queue_mem_free(dev, new_mem); + qops->ndo_queue_mem_free(dev, new_mem); err_free_old_mem: kvfree(old_mem); From patchwork Thu Feb 6 22:56:36 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakub Kicinski X-Patchwork-Id: 13964039 X-Patchwork-Delegate: kuba@kernel.org Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B2F0D22FF5C for ; Thu, 6 Feb 2025 22:56:53 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738882614; cv=none; b=OCazwX7iYfxIceLax/lGaOO2N4GmUbdoVL5ny2FOde1e9fT6ZHvSid++S8e6KzAbDirWgI3pBxdzca39gideHzb/StHQPpbxVvrTVTEAC7IvbW7i4DBOmVZjn8P7eqxd9AsAzdywfefs2RtUIUyDqrEHCrnmDWTorlr+pjwj8dY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738882614; c=relaxed/simple; bh=nYFnn35OV+y6c7HmVeg/IqZsbDvP2fo/4hfsVxGvARA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=oWhDtZbZgczNeAFZ03Q9KWtVMqwJEL5N2oHdAUhx66tLJNPPDYGSirFtBZhJg9qC8L6toIGmlrDmN+O0XYg8dnAfgy1RxHg/c28fuMA74qDcUzAummDekCW79/ihfqvHPrlr2SHdwhbu6YNzhYjp3FrF9aAf2TRMpwKB8wrQ4VY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=axr29uOb; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="axr29uOb" Received: by smtp.kernel.org (Postfix) with ESMTPSA id C4AB4C4CEE0; Thu, 6 Feb 2025 22:56:52 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1738882613; bh=nYFnn35OV+y6c7HmVeg/IqZsbDvP2fo/4hfsVxGvARA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=axr29uObO5S9D/0AuEHD22qoSC3T6cBXCdMNS/CXjFF7Sq1GA72frfzknbat7F0m0 qScbsNLCA0IlnvK5FJLAB1BiO38Ilvpnuom/8ZtqWR+SL1p/gH/EPEH3QhM/7K2LD+ ZrOWTaRRcnoLmp7ED//CGAxUK2KxLEzR6R/MUPFSQ7I/rluKeMjB8FkOzTafeAwtFN GShaRPLbHz8Lu+WXqf2ifjG6W/T22CY4ZGq/uekeX6iB9tFHi886nPL6fknUcVq8OH uSSa61xiXk8S+R0VMrVZrFR4MkN4elAYgWKNDvCZEWfwVvnTRjgGitXVh4R2JqO6dK UdKjPtGCc0h4g== From: Jakub Kicinski To: davem@davemloft.net Cc: netdev@vger.kernel.org, edumazet@google.com, pabeni@redhat.com, andrew+netdev@lunn.ch, horms@kernel.org, almasrymina@google.com, Jakub Kicinski Subject: [PATCH net-next v2 2/4] net: devmem: don't call queue stop / start when the interface is down Date: Thu, 6 Feb 2025 14:56:36 -0800 Message-ID: <20250206225638.1387810-3-kuba@kernel.org> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250206225638.1387810-1-kuba@kernel.org> References: <20250206225638.1387810-1-kuba@kernel.org> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Patchwork-Delegate: kuba@kernel.org We seem to be missing a netif_running() check from the devmem installation path. Starting a queue on a stopped device makes no sense. We still want to be able to allocate the memory, just to test that the device is indeed setting up the page pools in a memory provider compatible way. This is not a bug fix, because existing drivers check if the interface is down as part of the ops. But new drivers shouldn't have to do this, as long as they can correctly alloc/free while down. Signed-off-by: Jakub Kicinski Reviewed-by: Mina Almasry --- include/net/netdev_queues.h | 4 ++++ net/core/netdev_rx_queue.c | 16 ++++++++++------ 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/include/net/netdev_queues.h b/include/net/netdev_queues.h index b02bb9f109d5..73d3401261a6 100644 --- a/include/net/netdev_queues.h +++ b/include/net/netdev_queues.h @@ -117,6 +117,10 @@ struct netdev_stat_ops { * * @ndo_queue_stop: Stop the RX queue at the specified index. The stopped * queue's memory is written at the specified address. + * + * Note that @ndo_queue_mem_alloc and @ndo_queue_mem_free may be called while + * the interface is closed. @ndo_queue_start and @ndo_queue_stop will only + * be called for an interface which is open. */ struct netdev_queue_mgmt_ops { size_t ndo_queue_mem_size; diff --git a/net/core/netdev_rx_queue.c b/net/core/netdev_rx_queue.c index a5813d50e058..5352e0c1f37e 100644 --- a/net/core/netdev_rx_queue.c +++ b/net/core/netdev_rx_queue.c @@ -37,13 +37,17 @@ int netdev_rx_queue_restart(struct net_device *dev, unsigned int rxq_idx) if (err) goto err_free_new_queue_mem; - err = qops->ndo_queue_stop(dev, old_mem, rxq_idx); - if (err) - goto err_free_new_queue_mem; + if (netif_running(dev)) { + err = qops->ndo_queue_stop(dev, old_mem, rxq_idx); + if (err) + goto err_free_new_queue_mem; - err = qops->ndo_queue_start(dev, new_mem, rxq_idx); - if (err) - goto err_start_queue; + err = qops->ndo_queue_start(dev, new_mem, rxq_idx); + if (err) + goto err_start_queue; + } else { + swap(new_mem, old_mem); + } qops->ndo_queue_mem_free(dev, old_mem); From patchwork Thu Feb 6 22:56:37 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakub Kicinski X-Patchwork-Id: 13964037 X-Patchwork-Delegate: kuba@kernel.org Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id F27442417C2 for ; Thu, 6 Feb 2025 22:56:53 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738882614; cv=none; b=TFblzc5LHssNuCjgOcPCPBsqFFuqXj1NObZL8fsQBtpl8+hLqh+0+WpWK0FkNXxDsZezp6MVp0/psBoc0GPjRW4aaB/1DAh3D/U0Cf4AdGM1t9e+Vn8TgifVXqs0jLLs7m0r4KhHkv0aMSfNYnSH7G6BSn1sGQmSfPficq0nAEs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738882614; c=relaxed/simple; bh=aQVqifDDLfTy/kPKJCug5LsaEptcu23/8jOmA6Y0OEM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Z3YKi6yM9MMErMv+hDNXPN5v+fFA6Zhl/UWLQC0GVF6bHSFsQ5GNrEIoKNfCfb9p3+fI4hpUGWIl1eqkPvZdZpL4KVLZ+8iw4RKBlAGNRl4jpDbdT6a6EZkSTRRi2aU+3toew1KUQK0ukZOKC/wvOzaoS6u/V3cNI0995PtA3Yk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Pult3Q98; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="Pult3Q98" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 5A3AAC4CEE5; Thu, 6 Feb 2025 22:56:53 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1738882613; bh=aQVqifDDLfTy/kPKJCug5LsaEptcu23/8jOmA6Y0OEM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Pult3Q98ham6osDvltJXTyTugY4tf6B/BmhxvtzGSqndex0FQzbHrwTiqgjIOQESP 1bgSaFBIcRCGP/zM/tmV70Jqr51JQ0/tYiHCh8E+txtA+Yr5+pxSNvNE+ONvvSMJI3 6mxU1PCmm9Yai5HPvwY4SJoDDtE1PJuj7g6jfBhv19sx9Ijej5KxPlShZn/dPnhLve 5nRn/D3/OJMlkMUdSooDf32wLGgWKscdD1vAGmn6mhL3Pqx+S8d1jxSYZkedi+3igO sAN/mCGCtCfe16TKHCBnZ6Ep/rJP8u8Wv3VK+gzj3wazt9Tr8uj+9qyJyK0v+XkB7h DjuYMe8T/HgVg== From: Jakub Kicinski To: davem@davemloft.net Cc: netdev@vger.kernel.org, edumazet@google.com, pabeni@redhat.com, andrew+netdev@lunn.ch, horms@kernel.org, almasrymina@google.com, Jakub Kicinski , hawk@kernel.org, ilias.apalodimas@linaro.org, jdamato@fastly.com Subject: [PATCH net-next v2 3/4] net: page_pool: avoid false positive warning if NAPI was never added Date: Thu, 6 Feb 2025 14:56:37 -0800 Message-ID: <20250206225638.1387810-4-kuba@kernel.org> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250206225638.1387810-1-kuba@kernel.org> References: <20250206225638.1387810-1-kuba@kernel.org> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Patchwork-Delegate: kuba@kernel.org We expect NAPI to be in disabled state when page pool is torn down. But it is also legal if the NAPI is completely uninitialized. Signed-off-by: Jakub Kicinski Reviewed-by: Mina Almasry --- v2: new patch v1: https://lore.kernel.org/20250205190131.564456-1-kuba@kernel.org CC: hawk@kernel.org CC: ilias.apalodimas@linaro.org CC: jdamato@fastly.com --- net/core/dev.h | 12 ++++++++++++ net/core/page_pool.c | 7 ++----- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/net/core/dev.h b/net/core/dev.h index a5b166bbd169..caa13e431a6b 100644 --- a/net/core/dev.h +++ b/net/core/dev.h @@ -299,6 +299,18 @@ void xdp_do_check_flushed(struct napi_struct *napi); static inline void xdp_do_check_flushed(struct napi_struct *napi) { } #endif +/* Best effort check that NAPI is not idle (can't be scheduled to run) */ +static inline void napi_assert_will_not_race(const struct napi_struct *napi) +{ + /* uninitialized instance, can't race */ + if (!napi->poll_list.next) + return; + + /* SCHED bit is set on disabled instances */ + WARN_ON(!test_bit(NAPI_STATE_SCHED, &napi->state)); + WARN_ON(READ_ONCE(napi->list_owner) != -1); +} + void kick_defer_list_purge(struct softnet_data *sd, unsigned int cpu); #define XMIT_RECURSION_LIMIT 8 diff --git a/net/core/page_pool.c b/net/core/page_pool.c index f5e908c9e7ad..b940c40ea2f2 100644 --- a/net/core/page_pool.c +++ b/net/core/page_pool.c @@ -25,6 +25,7 @@ #include +#include "dev.h" #include "mp_dmabuf_devmem.h" #include "netmem_priv.h" #include "page_pool_priv.h" @@ -1140,11 +1141,7 @@ void page_pool_disable_direct_recycling(struct page_pool *pool) if (!pool->p.napi) return; - /* To avoid races with recycling and additional barriers make sure - * pool and NAPI are unlinked when NAPI is disabled. - */ - WARN_ON(!test_bit(NAPI_STATE_SCHED, &pool->p.napi->state)); - WARN_ON(READ_ONCE(pool->p.napi->list_owner) != -1); + napi_assert_will_not_race(pool->p.napi); mutex_lock(&page_pools_lock); WRITE_ONCE(pool->p.napi, NULL); From patchwork Thu Feb 6 22:56:38 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakub Kicinski X-Patchwork-Id: 13964040 X-Patchwork-Delegate: kuba@kernel.org Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id CD0C9236A75 for ; Thu, 6 Feb 2025 22:56:54 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738882614; cv=none; b=ff06aqWKzNQhbI/Aa+V/gx18jPA/TxJJAnWtqff/4ck66sKCy0YTCx1NrqpOBE8q/MSGC/pN2XPvOkcTc/RAFZNvEG+gdYEE4KkIKY7E6OeJwEP7I2++LY5KMDLZ5aumbKxkdcDOfMlY64KIYmb2dbZMkv8RU7yv0adNoAr/RmM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738882614; c=relaxed/simple; bh=+Ef4SdvDzFGRaBV9KVjIzCrBZL4MsQlSYgAunRL+QRI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ON9PGp7XNlGdzjn8Zghj5J9gqerPc31Dg/vvrDvnkvfOu1WDeapXe5dtT9Yed0ZzJrljNAMQFCsU+dpcEQTDEkYRwYWC8g8c1krC65sRyjY8OO9sZEaNGhKq4nkPZC6rXxIVM0bAkFSRGaQwQPW1fGwRsU8HwwQIrIo69qH58sA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Qp8S6dpK; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="Qp8S6dpK" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 06A51C4CEE2; Thu, 6 Feb 2025 22:56:53 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1738882614; bh=+Ef4SdvDzFGRaBV9KVjIzCrBZL4MsQlSYgAunRL+QRI=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Qp8S6dpKIInoAHR9e2W6mQJ8iD64gicyua+8U/c265wwP0omNl1f2KXH7j2U/Sh+M dd/j3VuwDCCpMjkMNTF6OAd1IY816cjxGXZoqXm5jhiqBJIhxPAEfsEqP4zQdoHWdu R38/857ZGUE/tg9Ld3u4JX4/sPOgtIGjuSfzW0+5R/s/0r7rwmxmnvKzU/LIUBKMQr 5HKMwqwW4HQEy14vv9aelfYk+QBgTNFxIWPrHPseB6UqD5EA24hP9Dz+G0gLDddtNr M/E1JSS/fa4Z5t7WRf6b06/iMXRP29GZImrPSw8VDGJkWMAMNjFkq4LWdC0NvCDrt2 OSNKMyUR23q5w== From: Jakub Kicinski To: davem@davemloft.net Cc: netdev@vger.kernel.org, edumazet@google.com, pabeni@redhat.com, andrew+netdev@lunn.ch, horms@kernel.org, almasrymina@google.com, Jakub Kicinski Subject: [PATCH net-next v2 4/4] netdevsim: allow normal queue reset while down Date: Thu, 6 Feb 2025 14:56:38 -0800 Message-ID: <20250206225638.1387810-5-kuba@kernel.org> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250206225638.1387810-1-kuba@kernel.org> References: <20250206225638.1387810-1-kuba@kernel.org> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Patchwork-Delegate: kuba@kernel.org Resetting queues while the device is down should be legal. Allow it, test it. Ideally we'd test this with a real device supporting devmem but I don't have access to such devices. Signed-off-by: Jakub Kicinski Reviewed-by: Mina Almasry --- drivers/net/netdevsim/netdev.c | 10 ++++------ tools/testing/selftests/net/nl_netdev.py | 18 +++++++++++++++++- 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/drivers/net/netdevsim/netdev.c b/drivers/net/netdevsim/netdev.c index 42f247cbdcee..9b394ddc5206 100644 --- a/drivers/net/netdevsim/netdev.c +++ b/drivers/net/netdevsim/netdev.c @@ -645,8 +645,11 @@ nsim_queue_mem_alloc(struct net_device *dev, void *per_queue_mem, int idx) if (ns->rq_reset_mode > 3) return -EINVAL; - if (ns->rq_reset_mode == 1) + if (ns->rq_reset_mode == 1) { + if (!netif_running(ns->netdev)) + return -ENETDOWN; return nsim_create_page_pool(&qmem->pp, &ns->rq[idx]->napi); + } qmem->rq = nsim_queue_alloc(); if (!qmem->rq) @@ -754,11 +757,6 @@ nsim_qreset_write(struct file *file, const char __user *data, return -EINVAL; rtnl_lock(); - if (!netif_running(ns->netdev)) { - ret = -ENETDOWN; - goto exit_unlock; - } - if (queue >= ns->netdev->real_num_rx_queues) { ret = -EINVAL; goto exit_unlock; diff --git a/tools/testing/selftests/net/nl_netdev.py b/tools/testing/selftests/net/nl_netdev.py index 93e8cb671c3d..beaee5e4e2aa 100755 --- a/tools/testing/selftests/net/nl_netdev.py +++ b/tools/testing/selftests/net/nl_netdev.py @@ -35,6 +35,21 @@ from lib.py import NetdevFamily, NetdevSimDev, ip comment=f"queue count after reset queue {q} mode {i}") +def nsim_rxq_reset_down(nf) -> None: + """ + Test that the queue API supports resetting a queue + while the interface is down. We should convert this + test to testing real HW once more devices support + queue API. + """ + with NetdevSimDev(queue_count=4) as nsimdev: + nsim = nsimdev.nsims[0] + + ip(f"link set dev {nsim.ifname} down") + for i in [0, 2, 3]: + nsim.dfs_write("queue_reset", f"1 {i}") + + def page_pool_check(nf) -> None: with NetdevSimDev() as nsimdev: nsim = nsimdev.nsims[0] @@ -106,7 +121,8 @@ from lib.py import NetdevFamily, NetdevSimDev, ip def main() -> None: nf = NetdevFamily() - ksft_run([empty_check, lo_check, page_pool_check, napi_list_check], + ksft_run([empty_check, lo_check, page_pool_check, napi_list_check, + nsim_rxq_reset_down], args=(nf, )) ksft_exit()