ethdev: support sub-function representor

SubFunction is a portion of the PCI device, created on demand, a SF
netdev has its own dedicated queues(txq, rxq). A SF netdev supports
eswitch representation offload similar to existing PF and VF
representors.

To support SF representor, this patch introduces new devargs syntax,
examples:
 representor=sf0               - single SubFunction representor
 representor=sf[1,3,5]         - single list
 representor=sf[0-3],          - single range
 representor=sf[0,2-6,8,10-12] - list with singles and ranges

Signed-off-by: Xueming Li <xuemingl@nvidia.com>
Acked-by: Viacheslav Ovsiienko <viacheslavo@nvidia.com>
Acked-by: Thomas Monjalon <thomas@monjalon.net>
Acked-by: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>
This commit is contained in:
Xueming Li 2021-03-11 13:13:27 +00:00 committed by Ferruh Yigit
parent cebf7f1715
commit fa4f3fecb9
6 changed files with 49 additions and 15 deletions

View File

@ -372,12 +372,16 @@ parameters to those ports.
* ``representor`` for a device which supports the creation of representor ports
this argument allows user to specify which switch ports to enable port
representors for.::
representors for. Multiple representors in one device argument is invalid::
-a DBDF,representor=vf0
-a DBDF,representor=vf[0,4,6,9]
-a DBDF,representor=vf[0-31]
-a DBDF,representor=vf[0,2-4,7,9-11]
-a DBDF,representor=sf0
-a DBDF,representor=sf[1,3,5]
-a DBDF,representor=sf[0-1023]
-a DBDF,representor=sf[0,2-4,7,9-11]
Note: PMDs are not required to support the standard device arguments and users
should consult the relevant PMD documentation to see support devargs.

View File

@ -13,7 +13,7 @@ Introduction
Network adapters with multiple physical ports and/or SR-IOV capabilities
usually support the offload of traffic steering rules between their virtual
functions (VFs), physical functions (PFs) and ports.
functions (VFs), sub functions (SFs), physical functions (PFs) and ports.
Like for standard Ethernet switches, this involves a combination of
automatic MAC learning and manual configuration. For most purposes it is
@ -24,7 +24,7 @@ layer 2 (L2) traffic (such as OVS) need to steer traffic themselves
according on their own criteria.
Without a standard software interface to manage traffic steering rules
between VFs, PFs and the various physical ports of a given device,
between VFs, SFs, PFs and the various physical ports of a given device,
applications cannot take advantage of these offloads; software processing is
mandatory even for traffic which ends up re-injected into the device it
originates from.
@ -34,6 +34,17 @@ the DPDK flow API (**rte_flow**), with emphasis on the SR-IOV use case
(PF/VF steering) using a single physical port for clarity, however the same
logic applies to any number of ports without necessarily involving SR-IOV.
Sub Function
------------
Besides SR-IOV, Sub function is a portion of the PCI device, a SF netdev
has its own dedicated queues(txq, rxq). A SF netdev supports E-Switch
representation offload similar to existing PF and VF representors.
A SF shares PCI level resources with other SFs and/or with its parent PCI
function.
Sub function is created on-demand, coexists with VFs. Number of SFs is
limited by hardware resources.
Port Representors
-----------------
@ -42,15 +53,16 @@ applications usually have to process a bit of traffic in software before
thinking about offloading specific flows to hardware.
Applications therefore need the ability to receive and inject traffic to
various device endpoints (other VFs, PFs or physical ports) before
various device endpoints (other VFs, SFs, PFs or physical ports) before
connecting them together. Device drivers must provide means to hook the
"other end" of these endpoints and to refer them when configuring flow
rules.
This role is left to so-called "port representors" (also known as "VF
representors" in the specific context of VFs), which are to DPDK what the
Ethernet switch device driver model (**switchdev**) [1]_ is to Linux, and
which can be thought as a software "patch panel" front-end for applications.
representors" in the specific context of VFs, "SF representors" in the
specific context of SFs), which are to DPDK what the Ethernet switch
device driver model (**switchdev**) [1]_ is to Linux, and which can be
thought as a software "patch panel" front-end for applications.
- DPDK port representors are implemented as additional virtual Ethernet
device (**ethdev**) instances, spawned on an as needed basis through
@ -59,9 +71,12 @@ which can be thought as a software "patch panel" front-end for applications.
::
-a pci:dbdf,representor=0
-a pci:dbdf,representor=[0-3]
-a pci:dbdf,representor=[0,5-11]
-a pci:dbdf,representor=vf0
-a pci:dbdf,representor=vf[0-3]
-a pci:dbdf,representor=vf[0,5-11]
-a pci:dbdf,representor=sf1
-a pci:dbdf,representor=sf[0-1023]
-a pci:dbdf,representor=sf[0,2-1023]
- As virtual devices, they may be more limited than their physical
counterparts, for instance by exposing only a subset of device
@ -360,7 +375,7 @@ Compared to creating a brand new dedicated interface, **rte_flow** was
deemed flexible enough to manage representor traffic only with minor
extensions:
- Using physical ports, PF, VF or port representors as targets.
- Using physical ports, PF, SF, VF or port representors as targets.
- Affecting traffic that is not necessarily addressed to the DPDK port ID a
flow rule is associated with (e.g. forcing VF traffic redirection to PF).

View File

@ -57,10 +57,11 @@ New Features
* **Enhanced ethdev representor syntax.**
* Introduced representor type of VF.
* Supported representor syntax::
* Introduced representor type of VF, SF.
* Supported sub-function in representor syntax::
representor=# [0,2-4] /* Legacy VF compatible. */
representor=sf# sf[0,2-1023] /* 1023 SFs. */
* **Updated Broadcom bnxt driver.**

View File

@ -119,6 +119,7 @@ rte_eth_devargs_process_list(char *str, uint16_t *list, uint16_t *len_list,
* Representor format:
* #: range or single number of VF representor - legacy
* vf#: VF port representor/s
* sf#: SF port representor/s
*
* Examples of #:
* 2 - single
@ -130,9 +131,15 @@ rte_eth_devargs_parse_representor_ports(char *str, void *data)
{
struct rte_eth_devargs *eth_da = data;
eth_da->type = RTE_ETH_REPRESENTOR_VF;
if (str[0] == 'v' && str[1] == 'f')
if (str[0] == 'v' && str[1] == 'f') {
eth_da->type = RTE_ETH_REPRESENTOR_VF;
str += 2;
} else if (str[0] == 's' && str[1] == 'f') {
eth_da->type = RTE_ETH_REPRESENTOR_SF;
str += 2;
} else {
eth_da->type = RTE_ETH_REPRESENTOR_VF;
}
str = rte_eth_devargs_process_list(str, eth_da->representor_ports,
&eth_da->nb_representor_ports,
RTE_DIM(eth_da->representor_ports));

View File

@ -5589,6 +5589,12 @@ rte_eth_devargs_parse(const char *dargs, struct rte_eth_devargs *eth_da)
for (i = 0; i < args.count; i++) {
pair = &args.pairs[i];
if (strcmp("representor", pair->key) == 0) {
if (eth_da->type != RTE_ETH_REPRESENTOR_NONE) {
RTE_LOG(ERR, EAL, "duplicated representor key: %s\n",
dargs);
result = -1;
goto parse_cleanup;
}
result = rte_eth_devargs_parse_representor_ports(
pair->value, eth_da);
if (result < 0)

View File

@ -1512,6 +1512,7 @@ struct rte_eth_rxseg_capa {
enum rte_eth_representor_type {
RTE_ETH_REPRESENTOR_NONE, /**< not a representor. */
RTE_ETH_REPRESENTOR_VF, /**< representor of Virtual Function. */
RTE_ETH_REPRESENTOR_SF, /**< representor of Sub Function. */
};
/**