mbox

[v4,00/14] net/mlx5: add hardware steering

Message ID 20220224134051.18167-1-suanmingm@nvidia.com (mailing list archive)
Headers

Message

Suanming Mou Feb. 24, 2022, 1:40 p.m. UTC
The Connect-X steering is a lookup hardware mechanism that accesses
flow tables, matches packets to the rules, and performs specified actions.
Historically, mlx5 PMD implements several software engines to manage
steering hardware facility:

   - FW Steering - Verbs/Direct Verbs, uses FW calls to manage flows
   - SW Steering - DevX/mlx5dv, uses WQEs to access table memory directly

However, there are still some disadvantages:

   - performance is limited, we should invoke firmware either to
     manage the entire flow, or to handle some internal steering objects

   - organizing and preparing flow infrastructure (actions, matchers,
     groups, etc.) on the flow inserting is sure to cause slow flow
     insertion

   - security, exposing the low-level steering entries directly to the
     userspace may cause security risks

A new hardware WQE based steering operation with codename "HW Steering"
is going to be introduced to get rid of the security risks. And it will
take advantage of the recently new introduced async queue-based rte_flow
APIs to prepare everything in advance to achieve high insertion rate.

In this new HW steering engine, the original SW steering rte_flow API
will not be supported in the first implementation, only the new async
queue-based flow operations is going to be supported. A new steering
mode parameter for dv_flow_en will be introduced and user will be
able to engage the new steering engine.

---

v4:
v3:
 - rebase to the latest version.

v2:
 - New HW steering low-level abstract code added.
 - commit message improvement.
 - add protection for rte_flow and rte_flow_async callbacks.
 - rebase to rte_flow_async v9.
 - fix some rte_flow error not filled bugs.

Suanming Mou (14):
  net/mlx5: introduce hardware steering operation
  net/mlx5: add HW steering low-level abstract code
  net/mlx5: introduce hardware steering enable routine
  net/mlx5: add port flow configuration
  net/mlx5: add pattern template management
  net/mlx5: add action template management
  net/mlx5: add table management
  net/mlx5: add basic flow queue operation
  net/mlx5: add flow flush function
  net/mlx5: add flow jump action
  net/mlx5: add queue and RSS action
  net/mlx5: add mark action
  net/mlx5: add indirect action
  net/mlx5: add header reformat action

 doc/guides/nics/mlx5.rst                |   19 +-
 doc/guides/rel_notes/release_22_03.rst  |    1 +
 drivers/net/mlx5/linux/mlx5_flow_os.h   |    1 +
 drivers/net/mlx5/linux/mlx5_os.c        |   22 +-
 drivers/net/mlx5/meson.build            |    2 +
 drivers/net/mlx5/mlx5.c                 |   55 +-
 drivers/net/mlx5/mlx5.h                 |   66 +-
 drivers/net/mlx5/mlx5_devx.c            |   10 +
 drivers/net/mlx5/mlx5_dr.c              |  383 ++++
 drivers/net/mlx5/mlx5_dr.h              |  456 +++++
 drivers/net/mlx5/mlx5_flow.c            |  721 ++++++-
 drivers/net/mlx5/mlx5_flow.h            |  287 +++
 drivers/net/mlx5/mlx5_flow_dv.c         |  186 +-
 drivers/net/mlx5/mlx5_flow_hw.c         | 2337 +++++++++++++++++++++++
 drivers/net/mlx5/mlx5_flow_verbs.c      |    7 +-
 drivers/net/mlx5/mlx5_rx.h              |    9 +-
 drivers/net/mlx5/mlx5_rxq.c             |   85 +-
 drivers/net/mlx5/windows/mlx5_flow_os.h |    1 +
 18 files changed, 4468 insertions(+), 180 deletions(-)
 create mode 100644 drivers/net/mlx5/mlx5_dr.c
 create mode 100644 drivers/net/mlx5/mlx5_dr.h
 create mode 100644 drivers/net/mlx5/mlx5_flow_hw.c