[PATCH net-next v2 0/3] ethtool: Dynamic RSS context indirection table resizing

Björn Töpel posted 3 patches 1 month, 1 week ago
There is a newer version of this series
.../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(-)
[PATCH net-next v2 0/3] ethtool: Dynamic RSS context indirection table resizing
Posted by Björn Töpel 1 month, 1 week ago
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

Re: [PATCH net-next v2 0/3] ethtool: Dynamic RSS context indirection table resizing
Posted by Pavan Chebbi 1 month, 1 week ago
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
>