From: Jakub Kicinski Date: Mon, 25 Aug 2025 18:04:45 +0000 (-0700) Subject: selftests: drv-net: ncdevmem: restore old channel config X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=b9f4f952982877bed19176798c6c5ca455f19b33;p=thirdparty%2Fkernel%2Fstable.git selftests: drv-net: ncdevmem: restore old channel config In case changing channel count with provider bound succeeds unexpectedly - make sure we return to original settings. Acked-by: Stanislav Fomichev Link: https://patch.msgid.link/20250825180447.2252977-4-kuba@kernel.org Signed-off-by: Jakub Kicinski --- diff --git a/tools/testing/selftests/drivers/net/hw/ncdevmem.c b/tools/testing/selftests/drivers/net/hw/ncdevmem.c index 8d9d579834b1f..580b4459a8406 100644 --- a/tools/testing/selftests/drivers/net/hw/ncdevmem.c +++ b/tools/testing/selftests/drivers/net/hw/ncdevmem.c @@ -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: