lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite for Android: free password hash cracker in your pocket
[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-ID: <73ac167e-abc5-4e7b-96e3-7c6689b5665a@intel.com>
Date: Fri, 26 Apr 2024 15:22:02 +0200
From: Przemek Kitszel <przemyslaw.kitszel@...el.com>
To: "netdev@...r.kernel.org" <netdev@...r.kernel.org>
CC: "intel-wired-lan@...ts.osuosl.org" <intel-wired-lan@...ts.osuosl.org>,
	"Knitter, Konrad" <konrad.knitter@...el.com>, "Samudrala, Sridhar"
	<sridhar.samudrala@...el.com>, "Brandeburg, Jesse"
	<jesse.brandeburg@...el.com>, Mateusz Polchlopek
	<mateusz.polchlopek@...el.com>, Ahmed Zaki <ahmed.zaki@...el.com>, "Simon
 Horman" <horms@...nel.org>, Michal Schmidt <mschmidt@...hat.com>, Paolo Abeni
	<pabeni@...hat.com>, Jakub Kicinski <kuba@...nel.org>, Jiri Pirko
	<jiri@...nulli.us>, Pawel Chmielewski <pawel.chmielewski@...el.com>, "Nguyen,
 Anthony L" <anthony.l.nguyen@...el.com>
Subject: [RFC net-next (what uAPI?) ice: add support for more than 16 RSS
 queues for VF

Main aim for this RFC is to ask for the preferred uAPI, but let me start
with some background. Then I describe considered uAPIs, from most
readily available to most implementation-needed.

## why
We want to extend ice+iavf in order to support more than 16 RSS-enabled
queues for a VF. To do so we have to assign a bigger RSS LUT than the
default VSI LUT. This feature is known as Extra Large VF to the users of
our OOT driver. iavf would be notified about changes by ice, it's not
touched in any way by this RFC.

## what
There are 3 types of the RSS LUT in e800 family, and the resource limits
are per whole card. Smallest, practically unlimited is VSI LUT, allows
for 16 RSS queues, then there is GLOBAL LUT, allows for 64 RSS queues,
finally there is PF LUT which allows 256 RSS queues. Sizes for LUTs (in
terms of entries) are respectively 64, 512, 2048 (that size could be
used later for ethtool -X). Hardware limits for e810 card are 16 GLOBAL
LUTs (unused at the moment) and one PF LUT (assigned to PF VSI) for each
port, (what means that the limit grows after a port split).

In case this is not yet clear, PF needs to arbitrage resource allocation
to avoid the case that there are two users of the given PF LUT. For
GLOBAL LUTs arbitrage could be deferred to FW, but PFs need to be able
to report usage. It is still possible (and preferred) to arbitrage
GLOBAL LUT distribution in SW, struct ice_adapter could be extended for
that.

Please find various interface considerations/propositions below.

## sysfs
Our OOT solution is based on sysfs, with one RW file (attribute) for
each VF and PF. Example flow to reassign PF LUT from PF to VF0:
echo 512 > /sys/class/net/$pf/device/rss_lut_pf_attr # switch to GLOBAL
echo 2048 > /sys/class/net/$pf/device/virtfn0/rss_lut_vf_attr
Obvious, easy to implement, but cursed sysfs.

## ethtool -L $vf
It's tempting to think about all of this Intel RSS LUT as an 
implementation detail that should be transparent to the user, but
anything other that the default flow would be obscured then: not all Rx
queues need RSS; one could benefit also from bigger table even if there
are less queues; etc.
So I'm opposed.
Any ethtool base interface would also be least convenient to implement,
since we will have additional virtchannel communication to pass request
to the PF.

## devlink - priv params + priv port params
Direct translation of sysfs interface into 2020's, would require a
bring-back of unused (thus removed) port params API.
Would require registering of entry for each VF, which does not feel
right (keep in mind that the entities that we want to distribute are
LUTs). Straightforward to implement.

# for PF:
devlink dev param set DEV name rss_lut_size value { 512 | 2048 } \
		cmode runtime
# for VF:
devlink dev param set DEV/PORT_INDEX name rss_lut_size \
		value { 64 | 512 | 2048 } cmode runtime

(I wonder why there is no "port" word for port version (VF) above in the
man page: https://man7.org/linux/man-pages/man8/devlink-port.8.html )

With `show` implemented too.

I don't know if this would require "porting" our "port representors" for
VFs, right now we don't have any devlink interface for VFs.

 From user perspective this is my most liked variant.

## devlink resources (with current API)
`devlink resource` is compelling, partially given the name sounds like a
perfect match. But when we dig just a little bit, the current Path+sizes
(min,max,step) is totally off to what is the most elegant picture of the
situation. In order to fit into existing uAPI, I would need to register
VFs as PF's resource, then GLOBAL LUT and PF LUT as a sub resource to
that (each VF gets two entries under it; plus two additional ones for
PF) I don't like it, I also feel like there is not that much use of
current resources API (it's not natural to use it for distribution, only
for limitation).

## devlink resources (with extended API)
It is possible to extend current `devlink resource` so instead of only
Path+size, there would be also Path+Owner option to use.
The default state for ice driver would be that PFs owns PF LUTs, GLOBAL
LUTs are all free.

example proposed flow to assign a GLOBAL LUT to VF0 and PF LUT to VF1:
pf=0000:03:00.0  # likely more meaningful than VSI idx, but open for
vf0=0000:03:00.1 #                                       suggestions
vf1=0000:03:00.2
devlink resource set pci/$pf path /lut/lut_table_512 owner $pf
devlink resource set pci/$pf path /lut/lut_table_2048 owner free
devlink resource set pci/$pf path /lut/lut_table_512 owner $vf0
devlink resource set pci/$pf path /lut/lut_table_2048 owner $vf1

(ASSUMING 1 Port)
the above 4 commands would default to transfer ownership of "1 unit",
the $pf still has 17 LUT entries under it, and would display 2 GLOBALs
as taken by particular owners, same for the PF LUT, and finally display
14 GLOBAL LUT units as free.

This option will be the best if 16 Global LUTs were given to each port,
but that is not the case.
(ASSUMPTION off)
`show` command would have to aggregate over all ports, or simply don't
show free global LUTs (show only those in use).

If it would be possible to register a "merged device" (==all PFs or
physical card), for which we don't have a driver, as an entry for
devlink resource command, then it would be straightforward to implement
`show` subcommand for multi port case.

## conclusion
I like the most devlink priv params, with devlink resources modified to
have an owner semantics as the second option.

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ