[dpdk-dev] [PATCH v3 1/2] ethdev: introduce Rx queue offloads API
Andrew Rybchenko
arybchenko at solarflare.com
Wed Sep 13 10:49:34 CEST 2017
On 09/13/2017 09:37 AM, Shahaf Shuler wrote:
> Introduce a new API to configure Rx offloads.
>
> In the new API, offloads are divided into per-port and per-queue
> offloads. The PMD reports capability for each of them.
> Offloads are enabled using the existing DEV_RX_OFFLOAD_* flags.
> To enable per-port offload, the offload should be set on both device
> configuration and queue configuration. To enable per-queue offload, the
> offloads can be set only on queue configuration.
>
> Applications should set the ignore_offload_bitfield bit on rxmode
> structure in order to move to the new API.
>
> The old Rx offloads API is kept for the meanwhile, in order to enable a
> smooth transition for PMDs and application to the new API.
>
> Signed-off-by: Shahaf Shuler <shahafs at mellanox.com>
> ---
> doc/guides/nics/features.rst | 33 ++++----
> lib/librte_ether/rte_ethdev.c | 156 +++++++++++++++++++++++++++++++++----
> lib/librte_ether/rte_ethdev.h | 51 +++++++++++-
> 3 files changed, 210 insertions(+), 30 deletions(-)
[snip]
> diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c
> index 0597641ee..b3c10701e 100644
> --- a/lib/librte_ether/rte_ethdev.c
> +++ b/lib/librte_ether/rte_ethdev.c
> @@ -687,12 +687,90 @@ rte_eth_speed_bitflag(uint32_t speed, int duplex)
> }
> }
>
> +/**
> + * A conversion function from rxmode bitfield API.
> + */
> +static void
> +rte_eth_convert_rx_offload_bitfield(const struct rte_eth_rxmode *rxmode,
> + uint64_t *rx_offloads)
> +{
> + uint64_t offloads = 0;
> +
> + if (rxmode->header_split == 1)
> + offloads |= DEV_RX_OFFLOAD_HEADER_SPLIT;
> + if (rxmode->hw_ip_checksum == 1)
> + offloads |= DEV_RX_OFFLOAD_CHECKSUM;
> + if (rxmode->hw_vlan_filter == 1)
> + offloads |= DEV_RX_OFFLOAD_VLAN_FILTER;
> + if (rxmode->hw_vlan_strip == 1)
> + offloads |= DEV_RX_OFFLOAD_VLAN_STRIP;
> + if (rxmode->hw_vlan_extend == 1)
> + offloads |= DEV_RX_OFFLOAD_VLAN_EXTEND;
> + if (rxmode->jumbo_frame == 1)
> + offloads |= DEV_RX_OFFLOAD_JUMBO_FRAME;
> + if (rxmode->hw_strip_crc == 1)
> + offloads |= DEV_RX_OFFLOAD_CRC_STRIP;
> + if (rxmode->enable_scatter == 1)
> + offloads |= DEV_RX_OFFLOAD_SCATTER;
> + if (rxmode->enable_lro == 1)
> + offloads |= DEV_RX_OFFLOAD_TCP_LRO;
> +
> + *rx_offloads = offloads;
> +}
> +
> +/**
> + * A conversion function from rxmode offloads API.
> + */
> +static void
> +rte_eth_convert_rx_offloads(const uint64_t rx_offloads,
> + struct rte_eth_rxmode *rxmode)
> +{
> +
> + if (rx_offloads & DEV_RX_OFFLOAD_HEADER_SPLIT)
> + rxmode->header_split = 1;
> + else
> + rxmode->header_split = 0;
> + if (rx_offloads & DEV_RX_OFFLOAD_CHECKSUM)
> + rxmode->hw_ip_checksum = 1;
> + else
> + rxmode->hw_ip_checksum = 0;
> + if (rx_offloads & DEV_RX_OFFLOAD_VLAN_FILTER)
> + rxmode->hw_vlan_filter = 1;
> + else
> + rxmode->hw_vlan_filter = 0;
> + if (rx_offloads & DEV_RX_OFFLOAD_VLAN_STRIP)
> + rxmode->hw_vlan_strip = 1;
> + else
> + rxmode->hw_vlan_strip = 0;
> + if (rx_offloads & DEV_RX_OFFLOAD_VLAN_EXTEND)
> + rxmode->hw_vlan_extend = 1;
> + else
> + rxmode->hw_vlan_extend = 0;
> + if (rx_offloads & DEV_RX_OFFLOAD_JUMBO_FRAME)
> + rxmode->jumbo_frame = 1;
> + else
> + rxmode->jumbo_frame = 0;
> + if (rx_offloads & DEV_RX_OFFLOAD_CRC_STRIP)
> + rxmode->hw_strip_crc = 1;
> + else
> + rxmode->hw_strip_crc = 0;
> + if (rx_offloads & DEV_RX_OFFLOAD_SCATTER)
> + rxmode->enable_scatter = 1;
> + else
> + rxmode->enable_scatter = 0;
> + if (rx_offloads & DEV_RX_OFFLOAD_TCP_LRO)
> + rxmode->enable_lro = 1;
> + else
> + rxmode->enable_lro = 0;
> +}
> +
> int
> rte_eth_dev_configure(uint8_t port_id, uint16_t nb_rx_q, uint16_t nb_tx_q,
> const struct rte_eth_conf *dev_conf)
> {
> struct rte_eth_dev *dev;
> struct rte_eth_dev_info dev_info;
> + struct rte_eth_conf local_conf = *dev_conf;
> int diag;
>
> RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -EINVAL);
> @@ -722,8 +800,20 @@ rte_eth_dev_configure(uint8_t port_id, uint16_t nb_rx_q, uint16_t nb_tx_q,
> return -EBUSY;
> }
>
> + /*
> + * Convert between the offloads API to enable PMDs to support
> + * only one of them.
> + */
> + if ((dev_conf->rxmode.ignore_offload_bitfield == 0)) {
> + rte_eth_convert_rx_offload_bitfield(
> + &dev_conf->rxmode, &local_conf.rxmode.offloads);
> + } else {
> + rte_eth_convert_rx_offloads(dev_conf->rxmode.offloads,
> + &local_conf.rxmode);
Ignore flag is lost here and it will result in treating txq_flags as the
primary
information about offloads. It is important in the case of failsafe PMD.
> + }
> +
> /* Copy the dev_conf parameter into the dev structure */
> - memcpy(&dev->data->dev_conf, dev_conf, sizeof(dev->data->dev_conf));
> + memcpy(&dev->data->dev_conf, &local_conf, sizeof(dev->data->dev_conf));
>
> /*
> * Check that the numbers of RX and TX queues are not greater
[snip]
More information about the dev
mailing list