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