[00/28] net/mlx5: support LRO

Message ID 1563786795-14027-1-git-send-email-matan@mellanox.com (mailing list archive)


Matan Azrad July 22, 2019, 9:12 a.m. UTC
LRO (Large Receive Offload) is intended to reduce host CPU overhead when processing Rx TCP packets.
LRO works by aggregating multiple incoming packets from a single stream into a larger buffer, before they are passed higher up the networking stack. Thus reducing the number of packets that have to be processed.

MLX5 PMD will query the HCA capabilities on initialization to check if LRO is supported and can be used.
LRO in MLX5 PMD is intended for use by applications using a relatively small number of flows.
LRO support can be enabled only per port.
In each LRO session, packets of the same flow will be coalesced until one of the following occur:
  *   Buffer size limit is exceeded.
  *   Session timeout is exceeded.
  *   Packet from a different flow is received on the same queue.

When LRO session ends the coalesced packet is passed to the PMD, which will update the header fields before passing the packet to the application.
For efficient memory utilization, the MPRQ mechanism is used.
Support of Non-LRO flows will not be impacted.

Existing API:
Offload capability DEV_RX_OFFLOAD_TCP_LRO will be used to indicate device supports LRO.
testpmd command-line option "-enable-lro" will be used to request LRO feature enable on application start.
testpmd rx_offload "tcp_lro" on or off will be used to request LRO feature enable or disable during application runtime.
Offload flag PKT_RX_LRO will be used. This flag can be set in Rx mbuf to indicate this is a LRO coalesced packet.

New API:
PMD configuration parameter lro_timeout_usec will be added.
This parameter can be used by application to select LRO session timeout (in microseconds).
If this value is not specified, the minimal value supported by device will be used.

Known limitations:
mbuf head-room is zero for any packet if LRO is configured in the port.
Keep CRC offload cannot be supported with LRO.
CQE compression is not supported with LRO.

Dekel Peled (23):
  net/mlx5: remove redundant item from union
  net/mlx5: add LRO APIs and initial settings
  net/mlx5: support LRO caps query using devx API
  net/mlx5: glue func for queue query using new API
  net/mlx5: glue function for action using new API
  net/mlx5: check conditions to enable LRO
  net/mlx5: support Tx interface query using new API
  net/mlx5: update Tx queue create for LRO
  net/mlx5: create advanced RxQ object using new API
  net/mlx5: modify advanced RxQ object using new API
  net/mlx5: create advanced Rx object using new API
  net/mlx5: create advanced RxQ table using new API
  net/mlx5: allocate door-bells using new API
  net/mlx5: rename RxQ verbs to general RxQ object
  net/mlx5: rename verbs indirection table to obj
  net/mlx5: rename hash RxQ verbs to general
  net/mlx5: update queue state modify function
  net/mlx5: store protection domain number on create
  net/mlx5: func to create Rx verbs completion queue
  net/mlx5: function to create Rx verbs work queue
  net/mlx5: create advanced RxQ using new API
  net/mlx5: support LRO with single RxQ object
  doc: update MLX5 doc and release notes with LRO

Matan Azrad (5):
  net/mlx5: replace the external mbuf shared memory
  net/mlx5: update LRO fields in completion entry
  net/mlx5: handle LRO packets in Rx queue
  net/mlx5: zero the LRO mbuf headroom
  net/mlx5: adjust the maximum LRO message size

 doc/guides/nics/features/mlx5.ini      |    1 +
 doc/guides/nics/mlx5.rst               |   14 +
 doc/guides/rel_notes/release_19_08.rst |    2 +-
 drivers/net/mlx5/Makefile              |    5 +
 drivers/net/mlx5/meson.build           |    2 +
 drivers/net/mlx5/mlx5.c                |  223 ++++++-
 drivers/net/mlx5/mlx5.h                |  160 ++++-
 drivers/net/mlx5/mlx5_devx_cmds.c      |  326 +++++++++
 drivers/net/mlx5/mlx5_ethdev.c         |   14 +-
 drivers/net/mlx5/mlx5_flow.h           |    6 +
 drivers/net/mlx5/mlx5_flow_dv.c        |   28 +-
 drivers/net/mlx5/mlx5_flow_verbs.c     |    3 +-
 drivers/net/mlx5/mlx5_glue.c           |   33 +
 drivers/net/mlx5/mlx5_glue.h           |    6 +-
 drivers/net/mlx5/mlx5_prm.h            |  379 ++++++++++-
 drivers/net/mlx5/mlx5_rxq.c            | 1135 ++++++++++++++++++++++----------
 drivers/net/mlx5/mlx5_rxtx.c           |  167 ++++-
 drivers/net/mlx5/mlx5_rxtx.h           |   80 ++-
 drivers/net/mlx5/mlx5_rxtx_vec.h       |    6 +-
 drivers/net/mlx5/mlx5_rxtx_vec_sse.h   |   16 +-
 drivers/net/mlx5/mlx5_trigger.c        |   12 +-
 drivers/net/mlx5/mlx5_txq.c            |   27 +-
 drivers/net/mlx5/mlx5_vlan.c           |   32 +-
 23 files changed, 2197 insertions(+), 480 deletions(-)