From patchwork Wed Feb 5 19:01:29 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakub Kicinski X-Patchwork-Id: 13961787 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 098101FDA8A for ; Wed, 5 Feb 2025 19:01:51 +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=1738782112; cv=none; b=sGQupcxQm/TaVMieU9DAo5v6PVn0ohUYPIQSJQ90VhQFzl2Wtk9ClBB/V2LrXYVrE8XfyWvfXc5XjgTFfnizthGMWaBz4f7wMXEu9twUCtRzDFWrBuqkPn1j3hR+zEq3wzFqIA21odW2B379ci+XF/p/FzEbapCKsJIQTBznc1g= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738782112; c=relaxed/simple; bh=/B7IRCyXsg7eaxH7DTtqwWtUJl7ouEXyji5+0llCgHE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=G9rz52TxjUlLXPlxUAKT4w+zMI3Pn+O8E+kDkOYb20XYtE0XQTaoJB5mLq+nIVjX0HVloDvoDvEFss7YUFIXtip3kTPpgG8XLE/gCA/9i2kPBnR7/WlsVS0F7I7/cS5m8yTYDaOiBReH5LG+CQjXyZjAU3ZJ3FFJbdqr1qGwjl0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=l5e2/QkX; 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="l5e2/QkX" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 34AC3C4CEDD; Wed, 5 Feb 2025 19:01:51 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1738782111; bh=/B7IRCyXsg7eaxH7DTtqwWtUJl7ouEXyji5+0llCgHE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=l5e2/QkXPz1+JYzWHNMS+Ag46dvQiVVPhK2gsJ6a/j95yM0d1aDze45akwc30qXfG aY9ASn9LC5lsd8JQtC4Pgm5DO2bTPblCmVFAooRs4ftw7zqfparZ4X2EJo5kA/dm/u tiHk33Gp3Yj1Ll3XGeJe8qwJtugAls1pzs/sKnh3Rl2NwXkIrP08GFvtoKS8mgr5dY D2oQnA/r/QH9uwyMaQJe3qoiE/0tO3B2BidGApvBTQNjPBs40lJYEJbY6YjIl/xj3N YzpaPQdluOHbn/MwhkTQ3tRwiDjm9eLgj0Apc8sq0RbecA7gVbluhiBOvQUlMrG8S9 0nsnkReHOK+BA== 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 1/3] net: refactor netdev_rx_queue_restart() to use local qops Date: Wed, 5 Feb 2025 11:01:29 -0800 Message-ID: <20250205190131.564456-2-kuba@kernel.org> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250205190131.564456-1-kuba@kernel.org> References: <20250205190131.564456-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 Wed Feb 5 19:01:30 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakub Kicinski X-Patchwork-Id: 13961788 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 4F80C1FF1BA for ; Wed, 5 Feb 2025 19:01:51 +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=1738782112; cv=none; b=c+eEDX65PSflWInvPbbowI851NR8ov6L49/5YWnl/E7OKabxgYowd9UZyU5JbKWDSh3z9KusrUvtsMYQlYBmsYhdluMnrwQyepuJApehmqaDcM8MGZkUh1FoOycVcHtb1AuZSm0DWnc6B4CrwX7nbGAIq6A/yXKyEsg33TJ64II= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738782112; c=relaxed/simple; bh=nYFnn35OV+y6c7HmVeg/IqZsbDvP2fo/4hfsVxGvARA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=TeKe6dtuyQL17YrMNkgiit+32jWpwQ9BzbM04IbDcY3inv04eJy4Okwv6Ei8eOmvGvDtNT3vLnzk6LHK6ywjQXOqLPiyjdMnQfb1dWfQ/0ppoMMAck2eq9zV09tWbesk2bTgULPpW3h/kavpMn8QDKquYfcrrBCfQzhOpADjz5Q= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=gTWKDSHV; 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="gTWKDSHV" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 95405C4CEE4; Wed, 5 Feb 2025 19:01:51 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1738782111; bh=nYFnn35OV+y6c7HmVeg/IqZsbDvP2fo/4hfsVxGvARA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=gTWKDSHVv2tZ4u4xPUjzb0d8RqDM9bRIHnDhaZGZ4+1G1N7Z/Wuo46KYnxw5G/Pkt ByKP1cm5U/pwlDBO4w0vMmamMcmQDDB8yviNojBQY6mFS4wj+wUt5hV8ZLNfTdyt1c 1ED2JOQtPIyOkXx+qlJF7Y6kHasVndoRMItc2Wuk9RkqXKj9J9do1sPn5W+S+FT8YM F010XyxlBp8WuA69TpPhpvg+2TtV/e2saG/E8vEdIEBt49PQmaswbxYRWB99lmmM9s Lw4SRoBhfdPbS7YOaCRBuadxF2JAU6CA2UV5fUfF/JqFvx+CjNRGaOyv+6nlFJED9R 6NNFooRzUpbbQ== 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 2/3] net: devmem: don't call queue stop / start when the interface is down Date: Wed, 5 Feb 2025 11:01:30 -0800 Message-ID: <20250205190131.564456-3-kuba@kernel.org> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250205190131.564456-1-kuba@kernel.org> References: <20250205190131.564456-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 --- 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 Wed Feb 5 19:01:31 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakub Kicinski X-Patchwork-Id: 13961789 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 BBECE1FF7BF for ; Wed, 5 Feb 2025 19:01: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=1738782112; cv=none; b=R2WrQ6Nu9Sy6iQh9UlD6Zn2ixTbGQ509Im2KdAa7+yQik+ziZGmypM5pze9gREpKmadVVAiV89kC9i+MPA71H7mQ6sNutfMDLNCkhVyA5ugd8rfBIDKP+m8kMb+TfU5DOm8qTbOWMdyUZZcR48nuSBQL5g9OuCoCZ+Aj32926WU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738782112; c=relaxed/simple; bh=xPW8xMnDUWTP59RzW3JJMTzIuMu9MBqeskgG3aTov0s=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=KMObLuEZwDedE7taMSPFqqcayf0NLKRbwQcw9UXReiTVYbhBURo28opp5fTR1rl7f5MMqEqUDKtox35sy8q+d6E7kg47G6T5rJt43TqtZFm95JjUUsd6h+VH3SrxfYs1PxyjbIz0rPHLQKLJ8OpbE/jVv+7ZKGYTI2ijcIZ7Tc0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=CkFkRu1I; 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="CkFkRu1I" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 01822C4CEE2; Wed, 5 Feb 2025 19:01:51 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1738782112; bh=xPW8xMnDUWTP59RzW3JJMTzIuMu9MBqeskgG3aTov0s=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=CkFkRu1I/AIW8syBmGeBT5XRIckQui+MOhI8vVjOi/wAW5JBlzwJvNOqnCJy9kaMt VKzAC/m+LCvKd8PK9cUlVIXBwCV8XVQc6A5EYCAtv254K4TdTSlFPk26uC+87T2KRe TvBaIVYx+6fkdT35MVVAzo/ghIu28Mle3cLCc/Z+O5u4B2zSEciwDhf0grmUizCUTB 9JhDIysOCMMHf+2vAOknsfWiO3J2Yi3YF03caRbMJE9VT3gRjMesEul80Cljh10lAR JKs37bDJbRmU7eSPpUQXUDP05WuM9fRYwmpODIBOsU2SFb4hfC/iZ6CX9GmDQUAiD7 ZIOsuHwMXvWRg== 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 3/3] netdevsim: allow normal queue reset while down Date: Wed, 5 Feb 2025 11:01:31 -0800 Message-ID: <20250205190131.564456-4-kuba@kernel.org> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250205190131.564456-1-kuba@kernel.org> References: <20250205190131.564456-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 --- drivers/net/netdevsim/netdev.c | 8 +++----- tools/testing/selftests/net/nl_netdev.py | 17 ++++++++++++++++- 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/drivers/net/netdevsim/netdev.c b/drivers/net/netdevsim/netdev.c index 42f247cbdcee..d26b2fb1cabc 100644 --- a/drivers/net/netdevsim/netdev.c +++ b/drivers/net/netdevsim/netdev.c @@ -644,6 +644,9 @@ nsim_queue_mem_alloc(struct net_device *dev, void *per_queue_mem, int idx) if (ns->rq_reset_mode > 3) return -EINVAL; + /* Only "mode 0" works when device is down */ + if (!netif_running(ns->netdev) && ns->rq_reset_mode) + return -ENETDOWN; if (ns->rq_reset_mode == 1) return nsim_create_page_pool(&qmem->pp, &ns->rq[idx]->napi); @@ -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..9a03e3fe7e31 100755 --- a/tools/testing/selftests/net/nl_netdev.py +++ b/tools/testing/selftests/net/nl_netdev.py @@ -35,6 +35,20 @@ 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") + nsim.dfs_write("queue_reset", f"1 0") + + def page_pool_check(nf) -> None: with NetdevSimDev() as nsimdev: nsim = nsimdev.nsims[0] @@ -106,7 +120,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()