From: Jakub Kicinski <kuba@kernel.org>
To: "Björn Töpel" <bjorn@kernel.org>
Cc: Michael Chan <michael.chan@broadcom.com>,
Pavan Chebbi <pavan.chebbi@broadcom.com>,
Andrew Lunn <andrew+netdev@lunn.ch>,
"David S. Miller" <davem@davemloft.net>,
Eric Dumazet <edumazet@google.com>,
Paolo Abeni <pabeni@redhat.com>, Simon Horman <horms@kernel.org>,
linux-kernel@vger.kernel.org, netdev@vger.kernel.org,
linux-kselftest@vger.kernel.org,
Willem de Bruijn <willemb@google.com>
Subject: Re: [PATCH net-next 5/5] selftests: rss_drv: Add RSS indirection table resize tests
Date: Tue, 3 Mar 2026 16:16:08 -0800 [thread overview]
Message-ID: <20260303161608.647d4c4b@kernel.org> (raw)
In-Reply-To: <20260303181535.2671734-6-bjorn@kernel.org>
On Tue, 3 Mar 2026 19:15:33 +0100 Björn Töpel wrote:
> +def _require_dynamic_indir_size(cfg, ch_max):
> + """Skip if the device does not dynamically size its indirection table."""
> + ethtool(f"-X {cfg.ifname} default")
> + ethtool(f"-L {cfg.ifname} combined 2")
> + small = len(_get_rss(cfg)['rss-indirection-table'])
> + ethtool(f"-L {cfg.ifname} combined {ch_max}")
> + large = len(_get_rss(cfg)['rss-indirection-table'])
> +
> + if small == large:
> + raise KsftSkipEx("Device does not dynamically size indirection table")
> +
> +
> @ksft_variants([
> KsftNamedVariant("main", False),
> KsftNamedVariant("ctx", True),
> @@ -76,11 +88,90 @@ def indir_size_4x(cfg, create_context):
> _test_rss_indir_size(cfg, test_max, context=ctx_id)
>
>
> +@ksft_variants([
> + KsftNamedVariant("main", False),
> + KsftNamedVariant("ctx", True),
> +])
> +def resize_periodic(cfg, create_context):
> + """Test that a periodic indirection table survives channel changes.
> +
> + Set a periodic table (equal 2), reduce channels to trigger a
> + fold, then increase to trigger an unfold. Verify the table pattern
> + is preserved and the size tracks the channel count.
> + """
> + channels = cfg.ethnl.channels_get({'header': {'dev-index': cfg.ifindex}})
> + ch_max = channels.get('combined-max', 0)
> + qcnt = channels['combined-count']
> +
> + if ch_max < 4:
> + raise KsftSkipEx(f"Not enough queues for the test: max={ch_max}")
> +
> + defer(ethtool, f"-L {cfg.ifname} combined {qcnt}")
> + ethtool(f"-L {cfg.ifname} combined {ch_max}")
> +
> + _require_dynamic_indir_size(cfg, ch_max)
> +
> + ctx_id = _maybe_create_context(cfg, create_context)
> + ctx_ref = f"context {ctx_id}" if ctx_id else ""
> +
> + ethtool(f"-X {cfg.ifname} {ctx_ref} equal 2")
> + if not create_context:
> + defer(ethtool, f"-X {cfg.ifname} default")
> +
> + orig_size = len(_get_rss(cfg, context=ctx_id)['rss-indirection-table'])
> +
> + # Shrink — should fold
> + ethtool(f"-L {cfg.ifname} combined 2")
I wonder if we may miss some cases because we init the table to [0, 1]
and also only enable only 2 queues. Let's set it to 4 queues here to
potentially catch the driver resetting the table? 2 vs 4 are both tiny
values.
Alternatively we could use netlink to set the inidir table as
[1, 0] x N
rather than
[0, 1] x N
and..
> + rss = _get_rss(cfg, context=ctx_id)
> + indir = rss['rss-indirection-table']
> +
> + ksft_ge(orig_size, len(indir), "Table did not shrink")
> + ksft_eq(set(indir), {0, 1}, "Folded table has wrong queues")
here actually check
ksft_eq(indir, [1, 0] * (len / 2), "Folded table has wrong queues")
> + # Grow back — should unfold
> + ethtool(f"-L {cfg.ifname} combined {ch_max}")
> + rss = _get_rss(cfg, context=ctx_id)
> + indir = rss['rss-indirection-table']
> +
> + ksft_eq(len(indir), orig_size, "Table size not restored")
> + ksft_eq(set(indir), {0, 1}, "Unfolded table has wrong queues")
> +
> +
> +def resize_nonperiodic_reject(cfg):
> + """Test that a non-periodic table blocks channel reduction.
> +
> + Set equal weight across all queues so the table is not periodic
> + at any smaller size, then verify channel reduction is rejected.
> + """
> + channels = cfg.ethnl.channels_get({'header': {'dev-index': cfg.ifindex}})
> + ch_max = channels.get('combined-max', 0)
> + qcnt = channels['combined-count']
> +
> + if ch_max < 4:
> + raise KsftSkipEx(f"Not enough queues for the test: max={ch_max}")
> +
> + defer(ethtool, f"-L {cfg.ifname} combined {qcnt}")
> + ethtool(f"-L {cfg.ifname} combined {ch_max}")
> +
> + _require_dynamic_indir_size(cfg, ch_max)
> +
> + ethtool(f"-X {cfg.ifname} equal {ch_max}")
> + defer(ethtool, f"-X {cfg.ifname} default")
> +
> + try:
> + ethtool(f"-L {cfg.ifname} combined 2")
> + except CmdExitFailure:
> + pass
> + else:
> + raise KsftFailEx("Channel reduction should fail with non-periodic table")
grep for ksft_raises()
> def main() -> None:
> """ Ksft boiler plate main """
> - with NetDrvEnv(__file__) as cfg:
> + with NetDrvEnv(__file__, queue_count=8) as cfg:
the queue_count=8 presumably only applies to netdevsim so it should go
> cfg.ethnl = EthtoolFamily()
> - ksft_run([indir_size_4x], args=(cfg, ))
> + ksft_run([indir_size_4x, resize_periodic,
> + resize_nonperiodic_reject], args=(cfg, ))
> ksft_exit()
>
>
next prev parent reply other threads:[~2026-03-04 0:16 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-03-03 18:15 [PATCH net-next 0/5] ethtool: Dynamic RSS context indirection table resizing Björn Töpel
2026-03-03 18:15 ` [PATCH net-next 1/5] ethtool: Add RSS indirection table resize helpers Björn Töpel
2026-03-04 0:03 ` Jakub Kicinski
2026-03-04 11:37 ` Björn Töpel
2026-03-04 17:09 ` Jakub Kicinski
2026-03-03 18:15 ` [PATCH net-next 2/5] bnxt_en: Resize RSS contexts on channel count change Björn Töpel
2026-03-03 19:20 ` Michael Chan
2026-03-04 11:38 ` Björn Töpel
2026-03-04 0:05 ` Jakub Kicinski
2026-03-04 11:39 ` Björn Töpel
2026-03-03 18:15 ` [PATCH net-next 3/5] netdevsim: Add RSS context support with dynamic table sizing Björn Töpel
2026-03-04 0:07 ` Jakub Kicinski
2026-03-04 11:40 ` Björn Töpel
2026-03-03 18:15 ` [PATCH net-next 4/5] selftests: netdevsim: Add RSS indirection table resize test Björn Töpel
2026-03-04 0:07 ` Jakub Kicinski
2026-03-03 18:15 ` [PATCH net-next 5/5] selftests: rss_drv: Add RSS indirection table resize tests Björn Töpel
2026-03-04 0:16 ` Jakub Kicinski [this message]
2026-03-04 8:23 ` [PATCH net-next 0/5] ethtool: Dynamic RSS context indirection table resizing Pavan Chebbi
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260303161608.647d4c4b@kernel.org \
--to=kuba@kernel.org \
--cc=andrew+netdev@lunn.ch \
--cc=bjorn@kernel.org \
--cc=davem@davemloft.net \
--cc=edumazet@google.com \
--cc=horms@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-kselftest@vger.kernel.org \
--cc=michael.chan@broadcom.com \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
--cc=pavan.chebbi@broadcom.com \
--cc=willemb@google.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.