1#!/usr/bin/env python3 2# SPDX-License-Identifier: GPL-2.0 3 4from lib.py import ksft_run, ksft_exit, ksft_eq, KsftSkipEx 5from lib.py import EthtoolFamily, NetdevFamily 6from lib.py import NetDrvEnv 7from lib.py import cmd 8import glob 9 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 None 21 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 - 1 49 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_queues 54 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