From 3e7bced6a6f29f980c4d72574bb0f4301f06e272 Mon Sep 17 00:00:00 2001 From: Tomasz Kulasek Date: Tue, 26 Apr 2016 17:47:56 +0200 Subject: [PATCH] examples/performance-thread: fix crash with gcc 5 It seems that with gcc >5.x and -O2/-O3 optimization breaks packet grouping algorithm in l3fwd-thread application causing segfault. When last packet pointer "lp" and "pnum->u64" buffer points the same memory buffer, high optimization can cause unpredictable results. It seems that assignment of precalculated group sizes may interfere with initialization of new group size when lp points value inside current group and didn't should be changed. With gcc >5.x and optimization we cannot be sure which assignment will be done first, so the group size can be counted incorrectly causing segfault. This patch eliminates intersection of assignment of initial group size (lp[0] = 1) and precalculated group sizes when gptbl[v].idx < 4. The same patch was applied for original l3fwd (af1694d94). Fixes: d48415e1fee3 ("examples/performance-thread: add l3fwd-thread app") Signed-off-by: Tomasz Kulasek --- examples/performance-thread/l3fwd-thread/main.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/performance-thread/l3fwd-thread/main.c b/examples/performance-thread/l3fwd-thread/main.c index cb9a82ed42..4ad16eac2a 100644 --- a/examples/performance-thread/l3fwd-thread/main.c +++ b/examples/performance-thread/l3fwd-thread/main.c @@ -1658,9 +1658,9 @@ port_groupx4(uint16_t pn[FWDSTEP + 1], uint16_t *lp, __m128i dp1, __m128i dp2) /* if dest port value has changed. */ if (v != GRPMSK) { - lp = pnum->u16 + gptbl[v].idx; - lp[0] = 1; pnum->u64 = gptbl[v].pnum; + pnum->u16[FWDSTEP] = 1; + lp = pnum->u16 + gptbl[v].idx; } return lp; -- 2.20.1