[PATCH 1/2] lpm: load tbl24 entries up front in scalar lookupx4

Sun Yuechi sunyuechi at iscas.ac.cn
Mon Oct 5 08:30:17 CEST 2026


Read the four tbl24 entries before resolving any of them, as the SSE
and NEON versions do. On an in-order core the cache misses then
overlap instead of being served one after another.

Signed-off-by: Sun Yuechi <sunyuechi at iscas.ac.cn>
---
 lib/lpm/rte_lpm_scalar.h | 40 +++++++++++++++++++++++++++++-----------
 1 file changed, 29 insertions(+), 11 deletions(-)

diff --git a/lib/lpm/rte_lpm_scalar.h b/lib/lpm/rte_lpm_scalar.h
index df4f83fa48..9ad25838fd 100644
--- a/lib/lpm/rte_lpm_scalar.h
+++ b/lib/lpm/rte_lpm_scalar.h
@@ -13,22 +13,40 @@
 extern "C" {
 #endif
 
+static inline uint32_t
+__rte_lpm_lookupx4_hop(const struct rte_lpm *lpm, uint32_t tbl_entry,
+		uint32_t ip, uint32_t defv)
+{
+	if (unlikely((tbl_entry & RTE_LPM_VALID_EXT_ENTRY_BITMASK) ==
+			RTE_LPM_VALID_EXT_ENTRY_BITMASK)) {
+		const uint32_t *tbl8 = (const uint32_t *)lpm->tbl8;
+
+		tbl_entry = tbl8[(uint8_t)ip + (tbl_entry & 0x00FFFFFF) *
+				RTE_LPM_TBL8_GROUP_NUM_ENTRIES];
+	}
+
+	return (tbl_entry & RTE_LPM_LOOKUP_SUCCESS) ?
+		(tbl_entry & 0x00FFFFFF) : defv;
+}
+
 static inline void
 rte_lpm_lookupx4(const struct rte_lpm *lpm, xmm_t ip, uint32_t hop[4],
 		uint32_t defv)
 {
 	rte_xmm_t xip = { .x = ip };
-	uint32_t nh;
-	int ret;
-
-	ret = rte_lpm_lookup(lpm, xip.u32[0], &nh);
-	hop[0] = (ret == 0) ? nh : defv;
-	ret = rte_lpm_lookup(lpm, xip.u32[1], &nh);
-	hop[1] = (ret == 0) ? nh : defv;
-	ret = rte_lpm_lookup(lpm, xip.u32[2], &nh);
-	hop[2] = (ret == 0) ? nh : defv;
-	ret = rte_lpm_lookup(lpm, xip.u32[3], &nh);
-	hop[3] = (ret == 0) ? nh : defv;
+	const uint32_t *tbl24 = (const uint32_t *)lpm->tbl24;
+	uint32_t tbl0, tbl1, tbl2, tbl3;
+
+	/* Issue the four tbl24 loads before any entry is examined. */
+	tbl0 = tbl24[xip.u32[0] >> 8];
+	tbl1 = tbl24[xip.u32[1] >> 8];
+	tbl2 = tbl24[xip.u32[2] >> 8];
+	tbl3 = tbl24[xip.u32[3] >> 8];
+
+	hop[0] = __rte_lpm_lookupx4_hop(lpm, tbl0, xip.u32[0], defv);
+	hop[1] = __rte_lpm_lookupx4_hop(lpm, tbl1, xip.u32[1], defv);
+	hop[2] = __rte_lpm_lookupx4_hop(lpm, tbl2, xip.u32[2], defv);
+	hop[3] = __rte_lpm_lookupx4_hop(lpm, tbl3, xip.u32[3], defv);
 }
 
 #ifdef __cplusplus
-- 
2.56.0



More information about the dev mailing list