[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