| From f6fc83791c2b992379c98c7d18449ffc2361a8d9 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Thu, 6 Feb 2025 14:56:38 -0800 |
| Subject: netdevsim: allow normal queue reset while down |
| |
| From: Jakub Kicinski <kuba@kernel.org> |
| |
| [ Upstream commit 285b3f78eabd951e59e98f01f86abaaa6c76cd44 ] |
| |
| 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. |
| |
| Reviewed-by: Mina Almasry <almasrymina@google.com> |
| Link: https://patch.msgid.link/20250206225638.1387810-5-kuba@kernel.org |
| Signed-off-by: Jakub Kicinski <kuba@kernel.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| 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 e4c0d77849b82..a41dc79e9c2e0 100644 |
| --- a/drivers/net/netdevsim/netdev.c |
| +++ b/drivers/net/netdevsim/netdev.c |
| @@ -664,8 +664,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) |
| @@ -773,11 +776,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 93e8cb671c3d9..beaee5e4e2aab 100755 |
| --- a/tools/testing/selftests/net/nl_netdev.py |
| +++ b/tools/testing/selftests/net/nl_netdev.py |
| @@ -35,6 +35,21 @@ def napi_list_check(nf) -> None: |
| 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 @@ def page_pool_check(nf) -> None: |
| |
| 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() |
| |
| -- |
| 2.39.5 |
| |