diff options
author | Eric Dumazet <edumazet@google.com> | 2022-11-15 09:10:57 +0000 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2022-11-16 12:42:00 +0000 |
commit | 30189806fbb945c4cb753878aab0aa5af07bc921 (patch) | |
tree | 4e86790355c780ba3915c9589640380192aad18b /net/ipv6 | |
parent | 57fc05e8e82d015d5d58572e146ac8579a66efea (diff) | |
download | lwn-30189806fbb945c4cb753878aab0aa5af07bc921.tar.gz lwn-30189806fbb945c4cb753878aab0aa5af07bc921.zip |
ipv6: fib6_new_sernum() optimization
Adopt atomic_try_cmpxchg() which is slightly more efficient.
Signed-off-by: Eric Dumazet <edumazet@google.com>
Cc: David Ahern <dsahern@kernel.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv6')
-rw-r--r-- | net/ipv6/ip6_fib.c | 7 |
1 files changed, 3 insertions, 4 deletions
diff --git a/net/ipv6/ip6_fib.c b/net/ipv6/ip6_fib.c index 413f66781e50..2438da5ff6da 100644 --- a/net/ipv6/ip6_fib.c +++ b/net/ipv6/ip6_fib.c @@ -91,13 +91,12 @@ static void fib6_walker_unlink(struct net *net, struct fib6_walker *w) static int fib6_new_sernum(struct net *net) { - int new, old; + int new, old = atomic_read(&net->ipv6.fib6_sernum); do { - old = atomic_read(&net->ipv6.fib6_sernum); new = old < INT_MAX ? old + 1 : 1; - } while (atomic_cmpxchg(&net->ipv6.fib6_sernum, - old, new) != old); + } while (!atomic_try_cmpxchg(&net->ipv6.fib6_sernum, &old, new)); + return new; } |