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