xref: /linux/tools/testing/selftests/drivers/net/napi_threaded.py (revision bda053d6445717f8a4cd76f88caea2e39299fe07)
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