> -----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

Reply via email to