[PATCH dpdk] net/mlx5: add option to reduce Tx datapath compilation time

Robin Jarry rjarry at redhat.com
Tue Apr 21 23:23:55 CEST 2026


The mlx5 Tx datapath compiles 42 variants of the burst function, each
a specialization of mlx5_tx_burst_tmpl() with a different combination
of offload flags. The compiler must instantiate and optimize the entire
3800+ line template for every variant, which dominates build time for
all the code base.

When MLX5_MINIMAL_TX is defined, only 11 variants are compiled instead
of 42. Two new "full without inline" superset variants (full_noi and
full_noi_empw) are introduced to satisfy the selection algorithm
constraint that the INLINE bit must match exactly between request and
variant. The remaining 9 variants are existing ones that already cover
all reachable combinations of the EMPW, MPW, INLINE and TXPP flags.

The selection function is unchanged. At runtime, it picks the best
matching variant from whatever is available. With the minimal set, each
selected variant may include a few unnecessary offload checks compared
to the precisely-tailored original, which has negligible impact on
performance since modern branch predictors handle static never-taken
branches well.

Compilation times (MM:SS) measured on Intel Core Ultra 7 165U with GCC
16.0.1:

FILE              BUILD          BEFORE   AFTER   DELTA
================= ============== ======== ======= ===============
mlx5_tx_mpw.c     debug          00:31    00:22   -00:09 (-29.0%)
mlx5_tx_txpp.c                   00:39    00:25   -00:14 (-35.9%)
mlx5_tx_empw.c                   01:11    00:19   -00:52 (-73.2%)
mlx5_tx_nompw.c                  01:13    00:16   -00:57 (-78.1%)
----------------- -------------- -------- ------- ---------------
mlx5_tx_mpw.c     debug+asan     03:15    02:45   -00:30 (-15.4%)
mlx5_tx_txpp.c                  *06:28*   03:13   -03:15 (-50.3%)
mlx5_tx_empw.c                  *12:07*   01:55   -10:12 (-84.2%)
mlx5_tx_nompw.c                 *12:54*   01:45   -11:09 (-86.4%)
----------------- -------------- -------- ------- ---------------
mlx5_tx_mpw.c     release        00:12    00:09   -00:03 (-25.0%)
mlx5_tx_txpp.c                   00:31    00:24   -00:07 (-22.6%)
mlx5_tx_empw.c                   00:32    00:18   -00:14 (-43.8%)
mlx5_tx_nompw.c                  00:34    00:16   -00:18 (-52.9%)
----------------- -------------- -------- ------- ---------------
mlx5_tx_mpw.c     release+asan   00:25    00:23   -00:02 (-8.0%)
mlx5_tx_empw.c                   01:24    00:42   -00:42 (-50.0%)
mlx5_tx_txpp.c                   01:32    00:59   -00:33 (-35.9%)
mlx5_tx_nompw.c                  01:38    00:37   -01:01 (-62.2%)

To enable, pass -DMLX5_MINIMAL_TX via c_args:

  meson setup build -Dc_args='-DMLX5_MINIMAL_TX'

Signed-off-by: Robin Jarry <rjarry at redhat.com>
---
 drivers/net/mlx5/mlx5_tx.c       | 23 +++++++++++++++++++++++
 drivers/net/mlx5/mlx5_tx.h       | 12 ++++++++++++
 drivers/net/mlx5/mlx5_tx_empw.c  | 10 ++++++++++
 drivers/net/mlx5/mlx5_tx_mpw.c   |  2 ++
 drivers/net/mlx5/mlx5_tx_nompw.c |  9 +++++++++
 drivers/net/mlx5/mlx5_tx_txpp.c  |  2 ++
 6 files changed, 58 insertions(+)

diff --git a/drivers/net/mlx5/mlx5_tx.c b/drivers/net/mlx5/mlx5_tx.c
index 94644bc3b9e2..a395577bb7e6 100644
--- a/drivers/net/mlx5/mlx5_tx.c
+++ b/drivers/net/mlx5/mlx5_tx.c
@@ -294,6 +294,14 @@ MLX5_TXOFF_INFO(full_empw,
 		MLX5_TXOFF_CONFIG_INLINE | MLX5_TXOFF_CONFIG_VLAN |
 		MLX5_TXOFF_CONFIG_METADATA | MLX5_TXOFF_CONFIG_EMPW)
 
+#ifdef MLX5_MINIMAL_TX
+MLX5_TXOFF_INFO(full_noi_empw,
+		MLX5_TXOFF_CONFIG_MULTI | MLX5_TXOFF_CONFIG_TSO |
+		MLX5_TXOFF_CONFIG_SWP | MLX5_TXOFF_CONFIG_CSUM |
+		MLX5_TXOFF_CONFIG_VLAN | MLX5_TXOFF_CONFIG_METADATA |
+		MLX5_TXOFF_CONFIG_EMPW)
+#else
+
 MLX5_TXOFF_INFO(none_empw,
 		MLX5_TXOFF_CONFIG_NONE | MLX5_TXOFF_CONFIG_EMPW)
 
@@ -355,6 +363,8 @@ MLX5_TXOFF_INFO(iv_empw,
 		MLX5_TXOFF_CONFIG_INLINE | MLX5_TXOFF_CONFIG_VLAN |
 		MLX5_TXOFF_CONFIG_METADATA | MLX5_TXOFF_CONFIG_EMPW)
 
+#endif /* !MLX5_MINIMAL_TX */
+
 MLX5_TXOFF_INFO(full_ts_nompw,
 		MLX5_TXOFF_CONFIG_FULL | MLX5_TXOFF_CONFIG_TXPP)
 
@@ -374,6 +384,7 @@ MLX5_TXOFF_INFO(full_ts_noi,
 		MLX5_TXOFF_CONFIG_VLAN | MLX5_TXOFF_CONFIG_METADATA |
 		MLX5_TXOFF_CONFIG_TXPP | MLX5_TXOFF_CONFIG_EMPW)
 
+#ifndef MLX5_MINIMAL_TX
 MLX5_TXOFF_INFO(none_ts,
 		MLX5_TXOFF_CONFIG_NONE | MLX5_TXOFF_CONFIG_TXPP |
 		MLX5_TXOFF_CONFIG_EMPW)
@@ -392,6 +403,7 @@ MLX5_TXOFF_INFO(mtiv_ts,
 		MLX5_TXOFF_CONFIG_INLINE | MLX5_TXOFF_CONFIG_VLAN |
 		MLX5_TXOFF_CONFIG_METADATA | MLX5_TXOFF_CONFIG_TXPP |
 		MLX5_TXOFF_CONFIG_EMPW)
+#endif
 
 MLX5_TXOFF_INFO(full,
 		MLX5_TXOFF_CONFIG_MULTI | MLX5_TXOFF_CONFIG_TSO |
@@ -399,6 +411,13 @@ MLX5_TXOFF_INFO(full,
 		MLX5_TXOFF_CONFIG_INLINE | MLX5_TXOFF_CONFIG_VLAN |
 		MLX5_TXOFF_CONFIG_METADATA)
 
+#ifdef MLX5_MINIMAL_TX
+MLX5_TXOFF_INFO(full_noi,
+		MLX5_TXOFF_CONFIG_MULTI | MLX5_TXOFF_CONFIG_TSO |
+		MLX5_TXOFF_CONFIG_SWP | MLX5_TXOFF_CONFIG_CSUM |
+		MLX5_TXOFF_CONFIG_VLAN | MLX5_TXOFF_CONFIG_METADATA)
+#else
+
 MLX5_TXOFF_INFO(none,
 		MLX5_TXOFF_CONFIG_NONE)
 
@@ -460,6 +479,8 @@ MLX5_TXOFF_INFO(iv,
 		MLX5_TXOFF_CONFIG_INLINE | MLX5_TXOFF_CONFIG_VLAN |
 		MLX5_TXOFF_CONFIG_METADATA)
 
+#endif /* !MLX5_MINIMAL_TX */
+
 MLX5_TXOFF_INFO(none_mpw,
 		MLX5_TXOFF_CONFIG_NONE | MLX5_TXOFF_CONFIG_EMPW |
 		MLX5_TXOFF_CONFIG_MPW)
@@ -473,9 +494,11 @@ MLX5_TXOFF_INFO(mc_mpw,
 		MLX5_TXOFF_CONFIG_MULTI | MLX5_TXOFF_CONFIG_CSUM |
 		MLX5_TXOFF_CONFIG_EMPW | MLX5_TXOFF_CONFIG_MPW)
 
+#ifndef MLX5_MINIMAL_TX
 MLX5_TXOFF_INFO(i_mpw,
 		MLX5_TXOFF_CONFIG_INLINE | MLX5_TXOFF_CONFIG_EMPW |
 		MLX5_TXOFF_CONFIG_MPW)
+#endif
 };
 
 /**
diff --git a/drivers/net/mlx5/mlx5_tx.h b/drivers/net/mlx5/mlx5_tx.h
index 016dba0b03c6..db55355abdd9 100644
--- a/drivers/net/mlx5/mlx5_tx.h
+++ b/drivers/net/mlx5/mlx5_tx.h
@@ -244,6 +244,9 @@ int mlx5_tx_burst_mode_get(struct rte_eth_dev *dev, uint16_t tx_queue_id,
 /* mlx5_tx_empw.c */
 
 MLX5_TXOFF_PRE_DECL(full_empw);
+#ifdef MLX5_MINIMAL_TX
+MLX5_TXOFF_PRE_DECL(full_noi_empw);
+#else
 MLX5_TXOFF_PRE_DECL(none_empw);
 MLX5_TXOFF_PRE_DECL(md_empw);
 MLX5_TXOFF_PRE_DECL(mt_empw);
@@ -258,10 +261,14 @@ MLX5_TXOFF_PRE_DECL(sciv_empw);
 MLX5_TXOFF_PRE_DECL(i_empw);
 MLX5_TXOFF_PRE_DECL(v_empw);
 MLX5_TXOFF_PRE_DECL(iv_empw);
+#endif
 
 /* mlx5_tx_nompw.c */
 
 MLX5_TXOFF_PRE_DECL(full);
+#ifdef MLX5_MINIMAL_TX
+MLX5_TXOFF_PRE_DECL(full_noi);
+#else
 MLX5_TXOFF_PRE_DECL(none);
 MLX5_TXOFF_PRE_DECL(md);
 MLX5_TXOFF_PRE_DECL(mt);
@@ -276,6 +283,7 @@ MLX5_TXOFF_PRE_DECL(sciv);
 MLX5_TXOFF_PRE_DECL(i);
 MLX5_TXOFF_PRE_DECL(v);
 MLX5_TXOFF_PRE_DECL(iv);
+#endif
 
 /* mlx5_tx_txpp.c */
 
@@ -283,17 +291,21 @@ MLX5_TXOFF_PRE_DECL(full_ts_nompw);
 MLX5_TXOFF_PRE_DECL(full_ts_nompwi);
 MLX5_TXOFF_PRE_DECL(full_ts);
 MLX5_TXOFF_PRE_DECL(full_ts_noi);
+#ifndef MLX5_MINIMAL_TX
 MLX5_TXOFF_PRE_DECL(none_ts);
 MLX5_TXOFF_PRE_DECL(mdi_ts);
 MLX5_TXOFF_PRE_DECL(mti_ts);
 MLX5_TXOFF_PRE_DECL(mtiv_ts);
+#endif
 
 /* mlx5_tx_mpw.c */
 
 MLX5_TXOFF_PRE_DECL(none_mpw);
 MLX5_TXOFF_PRE_DECL(mci_mpw);
 MLX5_TXOFF_PRE_DECL(mc_mpw);
+#ifndef MLX5_MINIMAL_TX
 MLX5_TXOFF_PRE_DECL(i_mpw);
+#endif
 
 static __rte_always_inline struct mlx5_uar_data *
 mlx5_tx_bfreg(struct mlx5_txq_data *txq)
diff --git a/drivers/net/mlx5/mlx5_tx_empw.c b/drivers/net/mlx5/mlx5_tx_empw.c
index 81c2dc451b14..4cb9965956c5 100644
--- a/drivers/net/mlx5/mlx5_tx_empw.c
+++ b/drivers/net/mlx5/mlx5_tx_empw.c
@@ -9,6 +9,14 @@
 MLX5_TXOFF_DECL(full_empw,
 		MLX5_TXOFF_CONFIG_FULL | MLX5_TXOFF_CONFIG_EMPW)
 
+#ifdef MLX5_MINIMAL_TX
+MLX5_TXOFF_DECL(full_noi_empw,
+		MLX5_TXOFF_CONFIG_MULTI | MLX5_TXOFF_CONFIG_TSO |
+		MLX5_TXOFF_CONFIG_SWP | MLX5_TXOFF_CONFIG_CSUM |
+		MLX5_TXOFF_CONFIG_VLAN | MLX5_TXOFF_CONFIG_METADATA |
+		MLX5_TXOFF_CONFIG_EMPW)
+#else
+
 MLX5_TXOFF_DECL(none_empw,
 		MLX5_TXOFF_CONFIG_NONE | MLX5_TXOFF_CONFIG_EMPW)
 
@@ -69,3 +77,5 @@ MLX5_TXOFF_DECL(v_empw,
 MLX5_TXOFF_DECL(iv_empw,
 		MLX5_TXOFF_CONFIG_INLINE | MLX5_TXOFF_CONFIG_VLAN |
 		MLX5_TXOFF_CONFIG_METADATA | MLX5_TXOFF_CONFIG_EMPW)
+
+#endif /* !MLX5_MINIMAL_TX */
diff --git a/drivers/net/mlx5/mlx5_tx_mpw.c b/drivers/net/mlx5/mlx5_tx_mpw.c
index bd7d5d2e533f..15061cde5bb1 100644
--- a/drivers/net/mlx5/mlx5_tx_mpw.c
+++ b/drivers/net/mlx5/mlx5_tx_mpw.c
@@ -29,6 +29,8 @@ MLX5_TXOFF_DECL(mc_mpw,
 		MLX5_TXOFF_CONFIG_MULTI | MLX5_TXOFF_CONFIG_CSUM |
 		MLX5_TXOFF_CONFIG_EMPW | MLX5_TXOFF_CONFIG_MPW)
 
+#ifndef MLX5_MINIMAL_TX
 MLX5_TXOFF_DECL(i_mpw,
 		MLX5_TXOFF_CONFIG_INLINE | MLX5_TXOFF_CONFIG_EMPW |
 		MLX5_TXOFF_CONFIG_MPW)
+#endif
diff --git a/drivers/net/mlx5/mlx5_tx_nompw.c b/drivers/net/mlx5/mlx5_tx_nompw.c
index ad23aab5d37b..a4d9ac8c576a 100644
--- a/drivers/net/mlx5/mlx5_tx_nompw.c
+++ b/drivers/net/mlx5/mlx5_tx_nompw.c
@@ -9,6 +9,13 @@
 MLX5_TXOFF_DECL(full,
 		MLX5_TXOFF_CONFIG_FULL)
 
+#ifdef MLX5_MINIMAL_TX
+MLX5_TXOFF_DECL(full_noi,
+		MLX5_TXOFF_CONFIG_MULTI | MLX5_TXOFF_CONFIG_TSO |
+		MLX5_TXOFF_CONFIG_SWP | MLX5_TXOFF_CONFIG_CSUM |
+		MLX5_TXOFF_CONFIG_VLAN | MLX5_TXOFF_CONFIG_METADATA)
+#else
+
 MLX5_TXOFF_DECL(none,
 		MLX5_TXOFF_CONFIG_NONE)
 
@@ -69,3 +76,5 @@ MLX5_TXOFF_DECL(v,
 MLX5_TXOFF_DECL(iv,
 		MLX5_TXOFF_CONFIG_INLINE | MLX5_TXOFF_CONFIG_VLAN |
 		MLX5_TXOFF_CONFIG_METADATA)
+
+#endif /* !MLX5_MINIMAL_TX */
diff --git a/drivers/net/mlx5/mlx5_tx_txpp.c b/drivers/net/mlx5/mlx5_tx_txpp.c
index 4d2a4c65f752..3e48a2bbe23c 100644
--- a/drivers/net/mlx5/mlx5_tx_txpp.c
+++ b/drivers/net/mlx5/mlx5_tx_txpp.c
@@ -25,6 +25,7 @@ MLX5_TXOFF_DECL(full_ts_noi,
 		MLX5_TXOFF_CONFIG_VLAN | MLX5_TXOFF_CONFIG_METADATA |
 		MLX5_TXOFF_CONFIG_TXPP | MLX5_TXOFF_CONFIG_EMPW)
 
+#ifndef MLX5_MINIMAL_TX
 MLX5_TXOFF_DECL(none_ts,
 		MLX5_TXOFF_CONFIG_NONE | MLX5_TXOFF_CONFIG_TXPP |
 		MLX5_TXOFF_CONFIG_EMPW)
@@ -43,3 +44,4 @@ MLX5_TXOFF_DECL(mtiv_ts,
 		MLX5_TXOFF_CONFIG_INLINE | MLX5_TXOFF_CONFIG_VLAN |
 		MLX5_TXOFF_CONFIG_METADATA | MLX5_TXOFF_CONFIG_TXPP |
 		MLX5_TXOFF_CONFIG_EMPW)
+#endif /* !MLX5_MINIMAL_TX */
-- 
2.53.0



More information about the dev mailing list