]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
selftests: drv-net: ncdevmem: restore old channel config
authorJakub Kicinski <kuba@kernel.org>
Mon, 25 Aug 2025 18:04:45 +0000 (11:04 -0700)
committerJakub Kicinski <kuba@kernel.org>
Wed, 27 Aug 2025 00:35:27 +0000 (17:35 -0700)
In case changing channel count with provider bound succeeds
unexpectedly - make sure we return to original settings.

Acked-by: Stanislav Fomichev <sdf@fomichev.me>
Link: https://patch.msgid.link/20250825180447.2252977-4-kuba@kernel.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
tools/testing/selftests/drivers/net/hw/ncdevmem.c

index 8d9d579834b1f8cbd5704e633471c0385133f838..580b4459a8406809e1cbc42417f207db21d0165a 100644 (file)
@@ -469,7 +469,7 @@ static void reset_rss(void)
        run_command("ethtool -X %s default >&2", ifname, start_queue);
 }
 
-static int configure_channels(unsigned int rx, unsigned int tx)
+static int check_changing_channels(unsigned int rx, unsigned int tx)
 {
        struct ethtool_channels_get_req *gchan;
        struct ethtool_channels_set_req *schan;
@@ -525,20 +525,32 @@ static int configure_channels(unsigned int rx, unsigned int tx)
                        ethtool_channels_set_req_set_tx_count(schan, tx - rx);
                }
 
-               ret = ethtool_channels_set(ys, schan);
-               if (ret)
-                       fprintf(stderr, "YNL set channels: %s\n", ys->err.msg);
        } else if (chan->_present.rx_count) {
                ethtool_channels_set_req_set_rx_count(schan, rx);
                ethtool_channels_set_req_set_tx_count(schan, tx);
-
-               ret = ethtool_channels_set(ys, schan);
-               if (ret)
-                       fprintf(stderr, "YNL set channels: %s\n", ys->err.msg);
        } else {
                fprintf(stderr, "Error: device has neither combined nor rx channels\n");
                ret = -1;
+               goto exit_free_schan;
+       }
+
+       ret = ethtool_channels_set(ys, schan);
+       if (ret) {
+               fprintf(stderr, "YNL set channels: %s\n", ys->err.msg);
+       } else {
+               /* We were expecting a failure, go back to previous settings */
+               ethtool_channels_set_req_set_combined_count(schan,
+                                                           chan->combined_count);
+               ethtool_channels_set_req_set_rx_count(schan, chan->rx_count);
+               ethtool_channels_set_req_set_tx_count(schan, chan->tx_count);
+
+               ret = ethtool_channels_set(ys, schan);
+               if (ret)
+                       fprintf(stderr, "YNL un-setting channels: %s\n",
+                               ys->err.msg);
        }
+
+exit_free_schan:
        ethtool_channels_set_req_free(schan);
 exit_free_chan:
        ethtool_channels_get_rsp_free(chan);
@@ -1019,16 +1031,14 @@ int run_devmem_tests(void)
        }
 
        /* Deactivating a bound queue should not be legal */
-       if (!configure_channels(num_queues, num_queues)) {
+       if (!check_changing_channels(num_queues, num_queues)) {
                pr_err("Deactivating a bound queue should be illegal");
-               goto err_reset_channels;
+               goto err_unbind;
        }
 
        err = 0;
        goto err_unbind;
 
-err_reset_channels:
-       /* TODO */
 err_unbind:
        ynl_sock_destroy(ys);
 err_reset_headersplit: