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:
parent
cebf7f1715
commit
fa4f3fecb9
@ -372,12 +372,16 @@ parameters to those ports.
|
|||||||
|
|
||||||
* ``representor`` for a device which supports the creation of representor ports
|
* ``representor`` for a device which supports the creation of representor ports
|
||||||
this argument allows user to specify which switch ports to enable port
|
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=vf0
|
||||||
-a DBDF,representor=vf[0,4,6,9]
|
-a DBDF,representor=vf[0,4,6,9]
|
||||||
-a DBDF,representor=vf[0-31]
|
-a DBDF,representor=vf[0-31]
|
||||||
-a DBDF,representor=vf[0,2-4,7,9-11]
|
-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
|
Note: PMDs are not required to support the standard device arguments and users
|
||||||
should consult the relevant PMD documentation to see support devargs.
|
should consult the relevant PMD documentation to see support devargs.
|
||||||
|
@ -13,7 +13,7 @@ Introduction
|
|||||||
|
|
||||||
Network adapters with multiple physical ports and/or SR-IOV capabilities
|
Network adapters with multiple physical ports and/or SR-IOV capabilities
|
||||||
usually support the offload of traffic steering rules between their virtual
|
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
|
Like for standard Ethernet switches, this involves a combination of
|
||||||
automatic MAC learning and manual configuration. For most purposes it is
|
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.
|
according on their own criteria.
|
||||||
|
|
||||||
Without a standard software interface to manage traffic steering rules
|
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
|
applications cannot take advantage of these offloads; software processing is
|
||||||
mandatory even for traffic which ends up re-injected into the device it
|
mandatory even for traffic which ends up re-injected into the device it
|
||||||
originates from.
|
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
|
(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.
|
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
|
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.
|
thinking about offloading specific flows to hardware.
|
||||||
|
|
||||||
Applications therefore need the ability to receive and inject traffic to
|
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
|
connecting them together. Device drivers must provide means to hook the
|
||||||
"other end" of these endpoints and to refer them when configuring flow
|
"other end" of these endpoints and to refer them when configuring flow
|
||||||
rules.
|
rules.
|
||||||
|
|
||||||
This role is left to so-called "port representors" (also known as "VF
|
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
|
representors" in the specific context of VFs, "SF representors" in the
|
||||||
Ethernet switch device driver model (**switchdev**) [1]_ is to Linux, and
|
specific context of SFs), which are to DPDK what the Ethernet switch
|
||||||
which can be thought as a software "patch panel" front-end for applications.
|
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
|
- DPDK port representors are implemented as additional virtual Ethernet
|
||||||
device (**ethdev**) instances, spawned on an as needed basis through
|
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=vf0
|
||||||
-a pci:dbdf,representor=[0-3]
|
-a pci:dbdf,representor=vf[0-3]
|
||||||
-a pci:dbdf,representor=[0,5-11]
|
-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
|
- As virtual devices, they may be more limited than their physical
|
||||||
counterparts, for instance by exposing only a subset of device
|
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
|
deemed flexible enough to manage representor traffic only with minor
|
||||||
extensions:
|
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
|
- 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).
|
flow rule is associated with (e.g. forcing VF traffic redirection to PF).
|
||||||
|
@ -57,10 +57,11 @@ New Features
|
|||||||
|
|
||||||
* **Enhanced ethdev representor syntax.**
|
* **Enhanced ethdev representor syntax.**
|
||||||
|
|
||||||
* Introduced representor type of VF.
|
* Introduced representor type of VF, SF.
|
||||||
* Supported representor syntax::
|
* Supported sub-function in representor syntax::
|
||||||
|
|
||||||
representor=# [0,2-4] /* Legacy VF compatible. */
|
representor=# [0,2-4] /* Legacy VF compatible. */
|
||||||
|
representor=sf# sf[0,2-1023] /* 1023 SFs. */
|
||||||
|
|
||||||
* **Updated Broadcom bnxt driver.**
|
* **Updated Broadcom bnxt driver.**
|
||||||
|
|
||||||
|
@ -119,6 +119,7 @@ rte_eth_devargs_process_list(char *str, uint16_t *list, uint16_t *len_list,
|
|||||||
* Representor format:
|
* Representor format:
|
||||||
* #: range or single number of VF representor - legacy
|
* #: range or single number of VF representor - legacy
|
||||||
* vf#: VF port representor/s
|
* vf#: VF port representor/s
|
||||||
|
* sf#: SF port representor/s
|
||||||
*
|
*
|
||||||
* Examples of #:
|
* Examples of #:
|
||||||
* 2 - single
|
* 2 - single
|
||||||
@ -130,9 +131,15 @@ rte_eth_devargs_parse_representor_ports(char *str, void *data)
|
|||||||
{
|
{
|
||||||
struct rte_eth_devargs *eth_da = 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;
|
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,
|
str = rte_eth_devargs_process_list(str, eth_da->representor_ports,
|
||||||
ð_da->nb_representor_ports,
|
ð_da->nb_representor_ports,
|
||||||
RTE_DIM(eth_da->representor_ports));
|
RTE_DIM(eth_da->representor_ports));
|
||||||
|
@ -5589,6 +5589,12 @@ rte_eth_devargs_parse(const char *dargs, struct rte_eth_devargs *eth_da)
|
|||||||
for (i = 0; i < args.count; i++) {
|
for (i = 0; i < args.count; i++) {
|
||||||
pair = &args.pairs[i];
|
pair = &args.pairs[i];
|
||||||
if (strcmp("representor", pair->key) == 0) {
|
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(
|
result = rte_eth_devargs_parse_representor_ports(
|
||||||
pair->value, eth_da);
|
pair->value, eth_da);
|
||||||
if (result < 0)
|
if (result < 0)
|
||||||
|
@ -1512,6 +1512,7 @@ struct rte_eth_rxseg_capa {
|
|||||||
enum rte_eth_representor_type {
|
enum rte_eth_representor_type {
|
||||||
RTE_ETH_REPRESENTOR_NONE, /**< not a representor. */
|
RTE_ETH_REPRESENTOR_NONE, /**< not a representor. */
|
||||||
RTE_ETH_REPRESENTOR_VF, /**< representor of Virtual Function. */
|
RTE_ETH_REPRESENTOR_VF, /**< representor of Virtual Function. */
|
||||||
|
RTE_ETH_REPRESENTOR_SF, /**< representor of Sub Function. */
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Loading…
Reference in New Issue
Block a user