mirror of
https://github.com/torvalds/linux.git
synced 2024-11-10 14:11:52 +00:00
selftests: drv-net: rss_ctx: test dumping RSS contexts
Add a test for dumping RSS contexts. Make sure indir table and key are sane when contexts are created with various combination of inputs. Test the dump filtering by ifname and start-context. Reviewed-by: Petr Machata <petrm@nvidia.com> Reviewed-by: Edward Cree <ecree.xilinx@gmail.com> Signed-off-by: Jakub Kicinski <kuba@kernel.org> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
8ad3be1352
commit
c1ad8ef804
@ -3,7 +3,7 @@
|
||||
|
||||
import datetime
|
||||
import random
|
||||
from lib.py import ksft_run, ksft_pr, ksft_exit, ksft_eq, ksft_ge, ksft_lt
|
||||
from lib.py import ksft_run, ksft_pr, ksft_exit, ksft_eq, ksft_ne, ksft_ge, ksft_lt
|
||||
from lib.py import NetDrvEpEnv
|
||||
from lib.py import EthtoolFamily, NetdevFamily
|
||||
from lib.py import KsftSkipEx
|
||||
@ -302,6 +302,78 @@ def test_hitless_key_update(cfg):
|
||||
ksft_eq(carrier1 - carrier0, 0)
|
||||
|
||||
|
||||
def test_rss_context_dump(cfg):
|
||||
"""
|
||||
Test dumping RSS contexts. This tests mostly exercises the kernel APIs.
|
||||
"""
|
||||
|
||||
# Get a random key of the right size
|
||||
data = get_rss(cfg)
|
||||
if 'rss-hash-key' in data:
|
||||
key_data = _rss_key_rand(len(data['rss-hash-key']))
|
||||
key = _rss_key_str(key_data)
|
||||
else:
|
||||
key_data = []
|
||||
key = "ba:ad"
|
||||
|
||||
ids = []
|
||||
try:
|
||||
ids.append(ethtool_create(cfg, "-X", f"context new"))
|
||||
defer(ethtool, f"-X {cfg.ifname} context {ids[-1]} delete")
|
||||
|
||||
ids.append(ethtool_create(cfg, "-X", f"context new weight 1 1"))
|
||||
defer(ethtool, f"-X {cfg.ifname} context {ids[-1]} delete")
|
||||
|
||||
ids.append(ethtool_create(cfg, "-X", f"context new hkey {key}"))
|
||||
defer(ethtool, f"-X {cfg.ifname} context {ids[-1]} delete")
|
||||
except CmdExitFailure:
|
||||
if not ids:
|
||||
raise KsftSkipEx("Unable to add any contexts")
|
||||
ksft_pr(f"Added only {len(ids)} out of 3 contexts")
|
||||
|
||||
expect_tuples = set([(cfg.ifname, -1)] + [(cfg.ifname, ctx_id) for ctx_id in ids])
|
||||
|
||||
# Dump all
|
||||
ctxs = cfg.ethnl.rss_get({}, dump=True)
|
||||
tuples = [(c['header']['dev-name'], c.get('context', -1)) for c in ctxs]
|
||||
ksft_eq(len(tuples), len(set(tuples)), "duplicates in context dump")
|
||||
ctx_tuples = set([ctx for ctx in tuples if ctx[0] == cfg.ifname])
|
||||
ksft_eq(expect_tuples, ctx_tuples)
|
||||
|
||||
# Sanity-check the results
|
||||
for data in ctxs:
|
||||
ksft_ne(set(data['indir']), {0}, "indir table is all zero")
|
||||
ksft_ne(set(data.get('hkey', [1])), {0}, "key is all zero")
|
||||
|
||||
# More specific checks
|
||||
if len(ids) > 1 and data.get('context') == ids[1]:
|
||||
ksft_eq(set(data['indir']), {0, 1},
|
||||
"ctx1 - indir table mismatch")
|
||||
if len(ids) > 2 and data.get('context') == ids[2]:
|
||||
ksft_eq(data['hkey'], bytes(key_data), "ctx2 - key mismatch")
|
||||
|
||||
# Ifindex filter
|
||||
ctxs = cfg.ethnl.rss_get({'header': {'dev-name': cfg.ifname}}, dump=True)
|
||||
tuples = [(c['header']['dev-name'], c.get('context', -1)) for c in ctxs]
|
||||
ctx_tuples = set(tuples)
|
||||
ksft_eq(len(tuples), len(ctx_tuples), "duplicates in context dump")
|
||||
ksft_eq(expect_tuples, ctx_tuples)
|
||||
|
||||
# Skip ctx 0
|
||||
expect_tuples.remove((cfg.ifname, -1))
|
||||
|
||||
ctxs = cfg.ethnl.rss_get({'start-context': 1}, dump=True)
|
||||
tuples = [(c['header']['dev-name'], c.get('context', -1)) for c in ctxs]
|
||||
ksft_eq(len(tuples), len(set(tuples)), "duplicates in context dump")
|
||||
ctx_tuples = set([ctx for ctx in tuples if ctx[0] == cfg.ifname])
|
||||
ksft_eq(expect_tuples, ctx_tuples)
|
||||
|
||||
# And finally both with ifindex and skip main
|
||||
ctxs = cfg.ethnl.rss_get({'header': {'dev-name': cfg.ifname}, 'start-context': 1}, dump=True)
|
||||
ctx_tuples = set([(c['header']['dev-name'], c.get('context', -1)) for c in ctxs])
|
||||
ksft_eq(expect_tuples, ctx_tuples)
|
||||
|
||||
|
||||
def test_rss_context(cfg, ctx_cnt=1, create_with_cfg=None):
|
||||
"""
|
||||
Test separating traffic into RSS contexts.
|
||||
@ -542,7 +614,7 @@ def main() -> None:
|
||||
ksft_run([test_rss_key_indir, test_rss_queue_reconfigure,
|
||||
test_rss_resize, test_hitless_key_update,
|
||||
test_rss_context, test_rss_context4, test_rss_context32,
|
||||
test_rss_context_queue_reconfigure,
|
||||
test_rss_context_dump, test_rss_context_queue_reconfigure,
|
||||
test_rss_context_overlap, test_rss_context_overlap2,
|
||||
test_rss_context_out_of_order, test_rss_context4_create_with_cfg],
|
||||
args=(cfg, ))
|
||||
|
@ -55,6 +55,12 @@ def ksft_eq(a, b, comment=""):
|
||||
_fail("Check failed", a, "!=", b, comment)
|
||||
|
||||
|
||||
def ksft_ne(a, b, comment=""):
|
||||
global KSFT_RESULT
|
||||
if a == b:
|
||||
_fail("Check failed", a, "==", b, comment)
|
||||
|
||||
|
||||
def ksft_true(a, comment=""):
|
||||
if not a:
|
||||
_fail("Check failed", a, "does not eval to True", comment)
|
||||
|
Loading…
Reference in New Issue
Block a user