ethdev: introduce shared Rx queue

In current DPDK framework, each Rx queue is pre-loaded with mbufs to
save incoming packets. For some PMDs, when number of representors scale
out in a switch domain, the memory consumption became significant.
Polling all ports also leads to high cache miss, high latency and low
throughput.

This patch introduces shared Rx queue. Ports in same Rx domain and
switch domain could share Rx queue set by specifying non-zero sharing
group in Rx queue configuration.

Shared Rx queue is identified by share_rxq field of Rx queue
configuration. Port A RxQ X can share RxQ with Port B RxQ Y by using
same shared Rx queue ID.

No special API is defined to receive packets from shared Rx queue.
Polling any member port of a shared Rx queue receives packets of that
queue for all member ports, port_id is identified by mbuf->port. PMD is
responsible to resolve shared Rx queue from device and queue data.

Shared Rx queue must be polled in same thread or core, polling a queue
ID of any member port is essentially same.

Multiple share groups are supported. PMD should support mixed
configuration by allowing multiple share groups and non-shared Rx queue
on one port.

Example grouping and polling model to reflect service priority:
 Group1, 2 shared Rx queues per port: PF, rep0, rep1
 Group2, 1 shared Rx queue per port: rep2, rep3, ... rep127
 Core0: poll PF queue0
 Core1: poll PF queue1
 Core2: poll rep2 queue0

PMD advertise shared Rx queue capability via RTE_ETH_DEV_CAPA_RXQ_SHARE.

PMD is responsible for shared Rx queue consistency checks to avoid
member port's configuration contradict each other.

Signed-off-by: Xueming Li <xuemingl@nvidia.com>
Reviewed-by: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>
Acked-by: Ajit Khaparde <ajit.khaparde@broadcom.com>
This commit is contained in:
Xueming Li 2021-10-21 18:41:36 +08:00 committed by Ferruh Yigit
parent 17faaed854
commit dd22740cc2
6 changed files with 63 additions and 0 deletions

View File

@ -614,6 +614,19 @@ Supports inner packet L4 checksum.
``tx_offload_capa,tx_queue_offload_capa:DEV_TX_OFFLOAD_OUTER_UDP_CKSUM``.
.. _nic_features_shared_rx_queue:
Shared Rx queue
---------------
Supports shared Rx queue for ports in same Rx domain of a switch domain.
* **[uses] rte_eth_dev_info**: ``dev_capa:RTE_ETH_DEV_CAPA_RXQ_SHARE``.
* **[uses] rte_eth_dev_inforte_eth_switch_info**: ``rx_domain``, ``domain_id``.
* **[uses] rte_eth_rxconf**: ``share_group``, ``share_qid``.
* **[provides] mbuf**: ``mbuf.port``.
.. _nic_features_packet_type_parsing:
Packet type parsing

View File

@ -19,6 +19,7 @@ Free Tx mbuf on demand =
Queue start/stop =
Runtime Rx queue setup =
Runtime Tx queue setup =
Shared Rx queue =
Burst mode info =
Power mgmt address monitor =
MTU update =

View File

@ -123,6 +123,17 @@ thought as a software "patch panel" front-end for applications.
.. [1] `Ethernet switch device driver model (switchdev)
<https://www.kernel.org/doc/Documentation/networking/switchdev.txt>`_
- For some PMDs, memory usage of representors is huge when number of
representor grows, mbufs are allocated for each descriptor of Rx queue.
Polling large number of ports brings more CPU load, cache miss and
latency. Shared Rx queue can be used to share Rx queue between PF and
representors among same Rx domain. ``RTE_ETH_DEV_CAPA_RXQ_SHARE`` in
device info is used to indicate the capability. Setting non-zero share
group in Rx queue configuration to enable share, share_qid is used to
identify the shared Rx queue in group. Polling any member port can
receive packets of all member ports in the group, port ID is saved in
``mbuf.port``.
Basic SR-IOV
------------

View File

@ -120,6 +120,12 @@ New Features
A new API, ``rte_flow_pick_transfer_proxy()``, was added.
* **Added ethdev shared Rx queue support.**
* Added new device capability flag and Rx domain field to switch info.
* Added share group and share queue ID to Rx queue configuration.
* Added testpmd support and dedicate forwarding engine.
* **Updated af_packet ethdev driver.**
* Default VLAN strip behavior was changed. VLAN tag won't be stripped

View File

@ -2175,6 +2175,14 @@ rte_eth_rx_queue_setup(uint16_t port_id, uint16_t rx_queue_id,
return -EINVAL;
}
if (local_conf.share_group > 0 &&
(dev_info.dev_capa & RTE_ETH_DEV_CAPA_RXQ_SHARE) == 0) {
RTE_ETHDEV_LOG(ERR,
"Ethdev port_id=%d rx_queue_id=%d, enabled share_group=%hu while device doesn't support Rx queue share\n",
port_id, rx_queue_id, local_conf.share_group);
return -EINVAL;
}
/*
* If LRO is enabled, check that the maximum aggregated packet
* size is supported by the configured device.

View File

@ -1046,6 +1046,14 @@ struct rte_eth_rxconf {
uint8_t rx_drop_en; /**< Drop packets if no descriptors are available. */
uint8_t rx_deferred_start; /**< Do not start queue with rte_eth_dev_start(). */
uint16_t rx_nseg; /**< Number of descriptions in rx_seg array. */
/**
* Share group index in Rx domain and switch domain.
* Non-zero value to enable Rx queue share, zero value disable share.
* PMD is responsible for Rx queue consistency checks to avoid member
* port's configuration contradict to each other.
*/
uint16_t share_group;
uint16_t share_qid; /**< Shared Rx queue ID in group */
/**
* Per-queue Rx offloads to be set using DEV_RX_OFFLOAD_* flags.
* Only offloads set on rx_queue_offload_capa or rx_offload_capa
@ -1448,6 +1456,16 @@ struct rte_eth_conf {
#define RTE_ETH_DEV_CAPA_RUNTIME_RX_QUEUE_SETUP 0x00000001
/** Device supports Tx queue setup after device started. */
#define RTE_ETH_DEV_CAPA_RUNTIME_TX_QUEUE_SETUP 0x00000002
/**
* Device supports shared Rx queue among ports within Rx domain and
* switch domain. Mbufs are consumed by shared Rx queue instead of
* each queue. Multiple groups are supported by share_group of Rx
* queue configuration. Shared Rx queue is identified by PMD using
* share_qid of Rx queue configuration. Polling any port in the group
* receive packets of all member ports, source port identified by
* mbuf->port field.
*/
#define RTE_ETH_DEV_CAPA_RXQ_SHARE RTE_BIT64(2)
/**@}*/
/*
@ -1491,6 +1509,12 @@ struct rte_eth_switch_info {
* port identifier to that physical interconnect/switch
*/
uint16_t port_id;
/**
* Shared Rx queue sub-domain boundary. Only ports in same Rx domain
* and switch domain can share Rx queue. Valid only if device advertised
* RTE_ETH_DEV_CAPA_RXQ_SHARE capability.
*/
uint16_t rx_domain;
};
/**