[PATCH] net: optimize cmpxchg in ip_idents_reserve

From: Shaokun Zhang
Date: Tue Jan 14 2020 - 22:23:55 EST


From: Yuqi Jin <jinyuqi@xxxxxxxxxx>

atomic_try_cmpxchg is called instead of atomic_cmpxchg that can reduce
the access number of the global variable @p_id in the loop. Let's
optimize it for performance.

Cc: "David S. Miller" <davem@xxxxxxxxxxxxx>
Cc: Alexey Kuznetsov <kuznet@xxxxxxxxxxxxx>
Cc: Hideaki YOSHIFUJI <yoshfuji@xxxxxxxxxxxxxx>
Cc: Eric Dumazet <edumazet@xxxxxxxxxx>
Cc: Yang Guo <guoyang2@xxxxxxxxxx>
Signed-off-by: Yuqi Jin <jinyuqi@xxxxxxxxxx>
Signed-off-by: Shaokun Zhang <zhangshaokun@xxxxxxxxxxxxx>
---
net/ipv4/route.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/net/ipv4/route.c b/net/ipv4/route.c
index 87e979f2b74a..7e28c7121c20 100644
--- a/net/ipv4/route.c
+++ b/net/ipv4/route.c
@@ -496,10 +496,10 @@ u32 ip_idents_reserve(u32 hash, int segs)
delta = prandom_u32_max(now - old);

/* Do not use atomic_add_return() as it makes UBSAN unhappy */
+ old = (u32)atomic_read(p_id);
do {
- old = (u32)atomic_read(p_id);
new = old + delta + segs;
- } while (atomic_cmpxchg(p_id, old, new) != old);
+ } while (!atomic_try_cmpxchg(p_id, &old, new));

return new - segs;
}
--
2.7.4