.../net/ethernet/broadcom/bnxt/bnxt_ethtool.c | 36 +++- include/linux/ethtool.h | 4 + net/ethtool/common.c | 146 ++++++++++++++++ .../selftests/drivers/net/hw/rss_drv.py | 163 +++++++++++++++++- 4 files changed, 338 insertions(+), 11 deletions(-)
Hi!
Some NICs (e.g. bnxt) change their RSS indirection table size based on
the queue count, because the hardware table is a shared resource. The
ethtool core locks ctx->indir_size at context creation, so drivers
have to reject channel changes when RSS contexts exist.
This series adds resize helpers and wires them up in bnxt.
Patch 1 adds core helpers:
ethtool_rxfh_can_resize() - read-only validation
ethtool_rxfh_resize() - fold/unfold a raw table in place
ethtool_rxfh_ctxs_can_resize() - validate all non-default contexts
ethtool_rxfh_ctxs_resize() - resize all non-default contexts,
with locking and RSS_NTF notifications
Patch 2 uses them in bnxt_set_channels(). Validation runs before
bnxt_close_nic(); actual resize is deferred until after. RSS table
size only changes on P5 chips with older firmware.
Patch 3 adds HW tests in rss_drv.py (devices without dynamic table
sizing are skipped):
resize_periodic - fold/unfold with a non-default [3,2,1,0]xN
pattern, verifying exact content preservation (main + ctx)
resize_nonperiodic_reject - non-periodic table blocks channel
reduction, with an extra periodic context to exercise
multi-context validation (main + ctx)
resize_nonperiodic_no_corruption - failed resize leaves table
contents and channel count unchanged (main + ctx)
Running the tests:
# On real hardware
sudo NETIF=eth0 ./rss_drv.py
Changes v1 -> v2:
- Dropped netdevsim support and netdevsim selftest (Jakub)
- Split ethtool_rxfh_contexts_resize_all() into separate validate
(ethtool_rxfh_ctxs_can_resize) and apply (ethtool_rxfh_ctxs_resize)
so drivers can validate before closing the device (Jakub)
- Shortened helper names (Jakub)
- Replaced scoped_guard(mutex) with explicit mutex_lock/unlock
(Jakub)
- Removed defensive zero-size check, bare expressions instead of != 0
comparisons, ! instead of == 0 (Jakub)
- In bnxt, moved bnxt_check_rings() before RSS validation and
deferred actual resize to after bnxt_close_nic() (Jakub, Michael)
- Added comment that RSS table size only changes on P5 chips with
older firmware (Michael)
- Use non-default [3,2,1,0]xN pattern set via netlink to distinguish
correct fold from driver resetting to defaults (Jakub)
- Check exact indirection table pattern, not just set(indir) (Jakub)
- Use ksft_raises() instead of try/except/else (Jakub)
- Removed queue_count=8 from NetDrvEnv (Jakub)
- Added ksft_variants to resize_nonperiodic_reject for ctx coverage
- Added extra periodic context in reject test for multi-context
validation coverage
- Added resize_nonperiodic_no_corruption test
Open items:
- No user-controlled minimum table size yet. The plan is to record
the user-provided indirection table length in the context (e.g.
ctx->user_indir_size) and use it as a floor when folding: reject if
new_size < user_indir_size. This way the user's original table size
serves as an implicit minimum, preventing the driver from shrinking
below what the user intended. Left for a follow-up.
Björn Töpel (3):
ethtool: Add RSS indirection table resize helpers
bnxt_en: Resize RSS contexts on channel count change
selftests: rss_drv: Add RSS indirection table resize tests
.../net/ethernet/broadcom/bnxt/bnxt_ethtool.c | 36 +++-
include/linux/ethtool.h | 4 +
net/ethtool/common.c | 146 ++++++++++++++++
.../selftests/drivers/net/hw/rss_drv.py | 163 +++++++++++++++++-
4 files changed, 338 insertions(+), 11 deletions(-)
base-commit: ed0abfe93fd135dac223e87a3c945017b1fa8bfc
--
2.53.0
On Wed, Mar 4, 2026 at 6:49 PM Björn Töpel <bjorn@kernel.org> wrote: > > Hi! > > Some NICs (e.g. bnxt) change their RSS indirection table size based on > the queue count, because the hardware table is a shared resource. The > ethtool core locks ctx->indir_size at context creation, so drivers > have to reject channel changes when RSS contexts exist. > > This series adds resize helpers and wires them up in bnxt. Tested-by: Pavan Chebbi <pavan.chebbi@broadcom.com> > > Patch 1 adds core helpers: > ethtool_rxfh_can_resize() - read-only validation > ethtool_rxfh_resize() - fold/unfold a raw table in place > ethtool_rxfh_ctxs_can_resize() - validate all non-default contexts > ethtool_rxfh_ctxs_resize() - resize all non-default contexts, > with locking and RSS_NTF notifications > > Patch 2 uses them in bnxt_set_channels(). Validation runs before > bnxt_close_nic(); actual resize is deferred until after. RSS table > size only changes on P5 chips with older firmware. > > Patch 3 adds HW tests in rss_drv.py (devices without dynamic table > sizing are skipped): > resize_periodic - fold/unfold with a non-default [3,2,1,0]xN > pattern, verifying exact content preservation (main + ctx) > resize_nonperiodic_reject - non-periodic table blocks channel > reduction, with an extra periodic context to exercise > multi-context validation (main + ctx) > resize_nonperiodic_no_corruption - failed resize leaves table > contents and channel count unchanged (main + ctx) > > Running the tests: > > # On real hardware > sudo NETIF=eth0 ./rss_drv.py > > Changes v1 -> v2: > > - Dropped netdevsim support and netdevsim selftest (Jakub) > - Split ethtool_rxfh_contexts_resize_all() into separate validate > (ethtool_rxfh_ctxs_can_resize) and apply (ethtool_rxfh_ctxs_resize) > so drivers can validate before closing the device (Jakub) > - Shortened helper names (Jakub) > - Replaced scoped_guard(mutex) with explicit mutex_lock/unlock > (Jakub) > - Removed defensive zero-size check, bare expressions instead of != 0 > comparisons, ! instead of == 0 (Jakub) > - In bnxt, moved bnxt_check_rings() before RSS validation and > deferred actual resize to after bnxt_close_nic() (Jakub, Michael) > - Added comment that RSS table size only changes on P5 chips with > older firmware (Michael) > - Use non-default [3,2,1,0]xN pattern set via netlink to distinguish > correct fold from driver resetting to defaults (Jakub) > - Check exact indirection table pattern, not just set(indir) (Jakub) > - Use ksft_raises() instead of try/except/else (Jakub) > - Removed queue_count=8 from NetDrvEnv (Jakub) > - Added ksft_variants to resize_nonperiodic_reject for ctx coverage > - Added extra periodic context in reject test for multi-context > validation coverage > - Added resize_nonperiodic_no_corruption test > > Open items: > > - No user-controlled minimum table size yet. The plan is to record > the user-provided indirection table length in the context (e.g. > ctx->user_indir_size) and use it as a floor when folding: reject if > new_size < user_indir_size. This way the user's original table size > serves as an implicit minimum, preventing the driver from shrinking > below what the user intended. Left for a follow-up. > > > Björn Töpel (3): > ethtool: Add RSS indirection table resize helpers > bnxt_en: Resize RSS contexts on channel count change > selftests: rss_drv: Add RSS indirection table resize tests > > .../net/ethernet/broadcom/bnxt/bnxt_ethtool.c | 36 +++- > include/linux/ethtool.h | 4 + > net/ethtool/common.c | 146 ++++++++++++++++ > .../selftests/drivers/net/hw/rss_drv.py | 163 +++++++++++++++++- > 4 files changed, 338 insertions(+), 11 deletions(-) > > > base-commit: ed0abfe93fd135dac223e87a3c945017b1fa8bfc > -- > 2.53.0 >
© 2016 - 2026 Red Hat, Inc.