67 lines · python
1#!/usr/bin/env python32# SPDX-License-Identifier: GPL-2.03 4from lib.py import ksft_run, ksft_exit, ksft_eq, KsftSkipEx5from lib.py import EthtoolFamily, NetdevFamily6from lib.py import NetDrvEnv7from lib.py import cmd8import glob9 10 11def sys_get_queues(ifname) -> int:12 folders = glob.glob(f'/sys/class/net/{ifname}/queues/rx-*')13 return len(folders)14 15 16def nl_get_queues(cfg, nl):17 queues = nl.queue_get({'ifindex': cfg.ifindex}, dump=True)18 if queues:19 return len([q for q in queues if q['type'] == 'rx'])20 return None21 22 23def get_queues(cfg, nl) -> None:24 queues = nl_get_queues(cfg, nl)25 if not queues:26 raise KsftSkipEx('queue-get not supported by device')27 28 expected = sys_get_queues(cfg.dev['ifname'])29 ksft_eq(queues, expected)30 31 32def addremove_queues(cfg, nl) -> None:33 queues = nl_get_queues(cfg, nl)34 if not queues:35 raise KsftSkipEx('queue-get not supported by device')36 37 curr_queues = sys_get_queues(cfg.dev['ifname'])38 if curr_queues == 1:39 raise KsftSkipEx('cannot decrement queue: already at 1')40 41 netnl = EthtoolFamily()42 channels = netnl.channels_get({'header': {'dev-index': cfg.ifindex}})43 if channels['combined-count'] == 0:44 rx_type = 'rx'45 else:46 rx_type = 'combined'47 48 expected = curr_queues - 149 cmd(f"ethtool -L {cfg.dev['ifname']} {rx_type} {expected}", timeout=10)50 queues = nl_get_queues(cfg, nl)51 ksft_eq(queues, expected)52 53 expected = curr_queues54 cmd(f"ethtool -L {cfg.dev['ifname']} {rx_type} {expected}", timeout=10)55 queues = nl_get_queues(cfg, nl)56 ksft_eq(queues, expected)57 58 59def main() -> None:60 with NetDrvEnv(__file__, queue_count=3) as cfg:61 ksft_run([get_queues, addremove_queues], args=(cfg, NetdevFamily()))62 ksft_exit()63 64 65if __name__ == "__main__":66 main()67