1e6d76268SSamiullah Khawaja#!/usr/bin/env python3 2e6d76268SSamiullah Khawaja# SPDX-License-Identifier: GPL-2.0 3e6d76268SSamiullah Khawaja 4e6d76268SSamiullah Khawaja""" 5e6d76268SSamiullah KhawajaTest napi threaded states. 6e6d76268SSamiullah Khawaja""" 7e6d76268SSamiullah Khawaja 8e6d76268SSamiullah Khawajafrom lib.py import ksft_run, ksft_exit 9e6d76268SSamiullah Khawajafrom lib.py import ksft_eq, ksft_ne, ksft_ge 10e6d76268SSamiullah Khawajafrom lib.py import NetDrvEnv, NetdevFamily 11e6d76268SSamiullah Khawajafrom lib.py import cmd, defer, ethtool 12e6d76268SSamiullah Khawaja 13e6d76268SSamiullah Khawaja 14e6d76268SSamiullah Khawajadef _assert_napi_threaded_enabled(nl, napi_id) -> None: 15e6d76268SSamiullah Khawaja napi = nl.napi_get({'id': napi_id}) 16e6d76268SSamiullah Khawaja ksft_eq(napi['threaded'], 'enabled') 17e6d76268SSamiullah Khawaja ksft_ne(napi.get('pid'), None) 18e6d76268SSamiullah Khawaja 19e6d76268SSamiullah Khawaja 20e6d76268SSamiullah Khawajadef _assert_napi_threaded_disabled(nl, napi_id) -> None: 21e6d76268SSamiullah Khawaja napi = nl.napi_get({'id': napi_id}) 22e6d76268SSamiullah Khawaja ksft_eq(napi['threaded'], 'disabled') 23e6d76268SSamiullah Khawaja ksft_eq(napi.get('pid'), None) 24e6d76268SSamiullah Khawaja 25e6d76268SSamiullah Khawaja 26e6d76268SSamiullah Khawajadef _set_threaded_state(cfg, threaded) -> None: 27e6d76268SSamiullah Khawaja cmd(f"echo {threaded} > /sys/class/net/{cfg.ifname}/threaded") 28e6d76268SSamiullah Khawaja 29e6d76268SSamiullah Khawaja 30e6d76268SSamiullah Khawajadef _setup_deferred_cleanup(cfg) -> None: 31e6d76268SSamiullah Khawaja combined = ethtool(f"-l {cfg.ifname}", json=True)[0].get("combined", 0) 32e6d76268SSamiullah Khawaja ksft_ge(combined, 2) 33e6d76268SSamiullah Khawaja defer(ethtool, f"-L {cfg.ifname} combined {combined}") 34e6d76268SSamiullah Khawaja 35e6d76268SSamiullah Khawaja threaded = cmd(f"cat /sys/class/net/{cfg.ifname}/threaded").stdout 36e6d76268SSamiullah Khawaja defer(_set_threaded_state, cfg, threaded) 37e6d76268SSamiullah Khawaja 38*bda053d6SJakub Kicinski return combined 39*bda053d6SJakub Kicinski 40e6d76268SSamiullah Khawaja 41e6d76268SSamiullah Khawajadef enable_dev_threaded_disable_napi_threaded(cfg, nl) -> None: 42e6d76268SSamiullah Khawaja """ 43e6d76268SSamiullah Khawaja Test that when napi threaded is enabled at device level and 44e6d76268SSamiullah Khawaja then disabled at napi level for one napi, the threaded state 45e6d76268SSamiullah Khawaja of all napis is preserved after a change in number of queues. 46e6d76268SSamiullah Khawaja """ 47e6d76268SSamiullah Khawaja 48e6d76268SSamiullah Khawaja napis = nl.napi_get({'ifindex': cfg.ifindex}, dump=True) 49e6d76268SSamiullah Khawaja ksft_ge(len(napis), 2) 50e6d76268SSamiullah Khawaja 51e6d76268SSamiullah Khawaja napi0_id = napis[0]['id'] 52e6d76268SSamiullah Khawaja napi1_id = napis[1]['id'] 53e6d76268SSamiullah Khawaja 54*bda053d6SJakub Kicinski qcnt = _setup_deferred_cleanup(cfg) 55e6d76268SSamiullah Khawaja 56e6d76268SSamiullah Khawaja # set threaded 57e6d76268SSamiullah Khawaja _set_threaded_state(cfg, 1) 58e6d76268SSamiullah Khawaja 59e6d76268SSamiullah Khawaja # check napi threaded is set for both napis 60e6d76268SSamiullah Khawaja _assert_napi_threaded_enabled(nl, napi0_id) 61e6d76268SSamiullah Khawaja _assert_napi_threaded_enabled(nl, napi1_id) 62e6d76268SSamiullah Khawaja 63e6d76268SSamiullah Khawaja # disable threaded for napi1 64e6d76268SSamiullah Khawaja nl.napi_set({'id': napi1_id, 'threaded': 'disabled'}) 65e6d76268SSamiullah Khawaja 66e6d76268SSamiullah Khawaja cmd(f"ethtool -L {cfg.ifname} combined 1") 67*bda053d6SJakub Kicinski cmd(f"ethtool -L {cfg.ifname} combined {qcnt}") 68e6d76268SSamiullah Khawaja _assert_napi_threaded_enabled(nl, napi0_id) 69e6d76268SSamiullah Khawaja _assert_napi_threaded_disabled(nl, napi1_id) 70e6d76268SSamiullah Khawaja 71e6d76268SSamiullah Khawaja 72e6d76268SSamiullah Khawajadef change_num_queues(cfg, nl) -> None: 73e6d76268SSamiullah Khawaja """ 74e6d76268SSamiullah Khawaja Test that when napi threaded is enabled at device level, 75e6d76268SSamiullah Khawaja the napi threaded state is preserved after a change in 76e6d76268SSamiullah Khawaja number of queues. 77e6d76268SSamiullah Khawaja """ 78e6d76268SSamiullah Khawaja 79e6d76268SSamiullah Khawaja napis = nl.napi_get({'ifindex': cfg.ifindex}, dump=True) 80e6d76268SSamiullah Khawaja ksft_ge(len(napis), 2) 81e6d76268SSamiullah Khawaja 82e6d76268SSamiullah Khawaja napi0_id = napis[0]['id'] 83e6d76268SSamiullah Khawaja napi1_id = napis[1]['id'] 84e6d76268SSamiullah Khawaja 85*bda053d6SJakub Kicinski qcnt = _setup_deferred_cleanup(cfg) 86e6d76268SSamiullah Khawaja 87e6d76268SSamiullah Khawaja # set threaded 88e6d76268SSamiullah Khawaja _set_threaded_state(cfg, 1) 89e6d76268SSamiullah Khawaja 90e6d76268SSamiullah Khawaja # check napi threaded is set for both napis 91e6d76268SSamiullah Khawaja _assert_napi_threaded_enabled(nl, napi0_id) 92e6d76268SSamiullah Khawaja _assert_napi_threaded_enabled(nl, napi1_id) 93e6d76268SSamiullah Khawaja 94e6d76268SSamiullah Khawaja cmd(f"ethtool -L {cfg.ifname} combined 1") 95*bda053d6SJakub Kicinski cmd(f"ethtool -L {cfg.ifname} combined {qcnt}") 96e6d76268SSamiullah Khawaja 97e6d76268SSamiullah Khawaja # check napi threaded is set for both napis 98e6d76268SSamiullah Khawaja _assert_napi_threaded_enabled(nl, napi0_id) 99e6d76268SSamiullah Khawaja _assert_napi_threaded_enabled(nl, napi1_id) 100e6d76268SSamiullah Khawaja 101e6d76268SSamiullah Khawaja 102e6d76268SSamiullah Khawajadef main() -> None: 103e6d76268SSamiullah Khawaja """ Ksft boiler plate main """ 104e6d76268SSamiullah Khawaja 105e6d76268SSamiullah Khawaja with NetDrvEnv(__file__, queue_count=2) as cfg: 106e6d76268SSamiullah Khawaja ksft_run([change_num_queues, 107e6d76268SSamiullah Khawaja enable_dev_threaded_disable_napi_threaded], 108e6d76268SSamiullah Khawaja args=(cfg, NetdevFamily())) 109e6d76268SSamiullah Khawaja ksft_exit() 110e6d76268SSamiullah Khawaja 111e6d76268SSamiullah Khawaja 112e6d76268SSamiullah Khawajaif __name__ == "__main__": 113e6d76268SSamiullah Khawaja main() 114