On 5/8/26 19:03, Loktionov, Aleksandr wrote:


-----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() ?

I will replace it by WARN_ONCE() and just let use the ID we were
assigned by FW


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