> -----Original Message-----
> From: Kitszel, Przemyslaw <[email protected]>
> Sent: Friday, May 8, 2026 2:42 PM
> To: [email protected]; Schmidt, Michal
> <[email protected]>; Jakub Kicinski <[email protected]>; Jiri Pirko
> <[email protected]>
> Cc: [email protected]; Simon Horman <[email protected]>; Nguyen,
> Anthony L <[email protected]>; Michal Swiatkowski
> <[email protected]>; Richardson, Bruce
> <[email protected]>; Medvedkin, Vladimir
> <[email protected]>; Connolly, Padraig J
> <[email protected]>; S, Ananth <[email protected]>;
> Miskell, Timothy <[email protected]>; Keller, Jacob E
> <[email protected]>; Czapnik, Lukasz
> <[email protected]>; Loktionov, Aleksandr
> <[email protected]>; Andrew Lunn <[email protected]>;
> David S. Miller <[email protected]>; Eric Dumazet
> <[email protected]>; Paolo Abeni <[email protected]>; Saeed Mahameed
> <[email protected]>; Leon Romanovsky <[email protected]>; Tariq Toukan
> <[email protected]>; Mark Bloch <[email protected]>; Kitszel,
> Przemyslaw <[email protected]>
> Subject: [PATCH iwl-next v1 14/15] ice: represent RSS LUTs as devlink
> resources
>
> E800 family offers three kinds of RSS LUTs: VSI LUT (sized 64), GLOBAL
> LUT (sized 256), and PF LUT (sized 2048). Until now the GLOBAL kind
> was not used at all. There are two possible usages for it, subsequent
> commit will give VF option to acquire it, and this one enables PF to
> switch between PF LUT and GLOBAL LUT - switching to smaller one is,
> again, to make it possible for VF to then acquire the former one.
>
> Devlink resources are used to let user show current usage and change
> the allocation, see examples below.
>
> Default state on 8-port card, asking for aggregate "whole device"
> usage, note that there are as many PF LUTs as there is PFs, and, for
> e810, there are 16 GLOBAL LUTs:
> $ devlink resource show devlink_index/11
> devlink_index/11:
> name rss size 8 unit entry size_min 0 size_max 24 size_gran 1
> dpipe_tables none
> resources:
> name lut_512 size 0 unit entry size_min 0 size_max 16 size_gran
> 1 dpipe_tables none
> name lut_2048 size 8 unit entry size_min 0 size_max 8 size_gran
> 1 dpipe_tables none
>
> Now let's add GLOBAL LUT for a single PF (on one-port NIC):
> $ sudo devlink resource set pci/0000:18:00.0 path rss/lut_512 size 1
> And show it's resources after that:
> $ devlink resource show pci/0000:18:00.0
> pci/0000:18:00.0:
> name rss size 2 unit entry size_min 0 size_max 2 size_gran 1
> dpipe_tables none
> resources:
> name lut_512 size 1 unit entry size_min 0 size_max 1 size_gran 1
> dpipe_tables none
> name lut_2048 size 1 unit entry size_min 0 size_max 1 size_gran
> 1 dpipe_tables none Let's take the PF LUT out of that PF afterwards:
> $ sudo devlink resource set pci/0000:18:00.0 path rss/lut_2048 size 0
> now `ethtool -x $ifacename` will report smaller RSS table.
>
> Signed-off-by: Przemek Kitszel <[email protected]>
> ---
> drivers/net/ethernet/intel/ice/Makefile | 1 +
> .../net/ethernet/intel/ice/devlink/resource.h | 19 +
> drivers/net/ethernet/intel/ice/ice_adapter.h | 40 ++
> drivers/net/ethernet/intel/ice/ice_common.h | 1 +
> .../net/ethernet/intel/ice/devlink/resource.c | 469
> ++++++++++++++++++ drivers/net/ethernet/intel/ice/ice_adapter.c |
> 12 +-
> drivers/net/ethernet/intel/ice/ice_common.c | 2 +-
> drivers/net/ethernet/intel/ice/ice_lib.c | 23 +-
> drivers/net/ethernet/intel/ice/ice_main.c | 14 +-
> 9 files changed, 573 insertions(+), 8 deletions(-) create mode
> 100644 drivers/net/ethernet/intel/ice/devlink/resource.h
> create mode 100644 drivers/net/ethernet/intel/ice/devlink/resource.c
>
> diff --git a/drivers/net/ethernet/intel/ice/Makefile
> b/drivers/net/ethernet/intel/ice/Makefile
> index 7f06d9bafe4a..0217ab6403de 100644
> --- a/drivers/net/ethernet/intel/ice/Makefile
> +++ b/drivers/net/ethernet/intel/ice/Makefile
> @@ -37,6 +37,7 @@ ice-y := ice_main.o \
> devlink/devlink.o \
> devlink/health.o \
> devlink/port.o \
...
> +
> +static int ice_devl_res_take(struct ice_pf *pf,
> + enum ice_devl_resource_id res_id, int slot,
> + void *owner)
> +{
> + struct ice_devl_resource *res = &pf->adapter-
> >resources[res_id];
> + int end = slot == ICE_ANY_SLOT ? res->max_size : slot + 1;
> + int beg = slot == ICE_ANY_SLOT ? 0 : slot;
> + int err, new_id = ICE_ANY_SLOT;
> +
> + for (int id = beg; id < end; id++) {
> + if (!res->owner[id]) {
> + new_id = id;
> + break;
> + }
> + }
> + if (new_id == ICE_ANY_SLOT)
> + return -ENOSPC;
> +
> + if (res_id == ICE_RSS_LUT_GLOBAL) {
> + struct ice_vsi *vsi;
> + u16 lut_id;
> +
> + err = ice_alloc_rss_global_lut(&pf->hw, &lut_id);
> + if (err)
> + return err;
> + if (lut_id != new_id)
> + return -ENOANO;
-ENOANO; looks for me very unusual choice.
BTW won't LUT leak without calling ice_free_rss_global_lut() ?
> +
> + if (pf == owner)
> + vsi = ice_get_main_vsi(pf);
> + else
> + vsi = ice_get_vf_vsi(owner);
> +
> + vsi->global_lut_id = new_id;
> + }
> +
> + res->owner[new_id] = owner;
> + res->pf_id[new_id] = pf->hw.pf_id;
> + return new_id;
> +}
...
>
> return status;
> }
> --
> 2.39.3