netdev: Use try_cmpxchg in napi_if_scheduled_mark_missed
authorUros Bizjak <ubizjak@gmail.com>
Mon, 22 Aug 2022 14:32:43 +0000 (16:32 +0200)
committerJakub Kicinski <kuba@kernel.org>
Thu, 25 Aug 2022 21:20:35 +0000 (14:20 -0700)
Use try_cmpxchg instead of cmpxchg (*ptr, old, new) == old in
napi_if_scheduled_mark_missed. x86 CMPXCHG instruction returns
success in ZF flag, so this change saves a compare after cmpxchg
(and related move instruction in front of cmpxchg).

Also, try_cmpxchg implicitly assigns old *ptr value to "old" when cmpxchg
fails, enabling further code simplifications.

Cc: Eric Dumazet <edumazet@google.com>
Cc: Paolo Abeni <pabeni@redhat.com>
Signed-off-by: Uros Bizjak <ubizjak@gmail.com>
Link: https://lore.kernel.org/r/20220822143243.2798-1-ubizjak@gmail.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
include/linux/netdevice.h

index 64e8662..8839abc 100644 (file)
@@ -546,8 +546,8 @@ static inline bool napi_if_scheduled_mark_missed(struct napi_struct *n)
 {
        unsigned long val, new;
 
+       val = READ_ONCE(n->state);
        do {
-               val = READ_ONCE(n->state);
                if (val & NAPIF_STATE_DISABLE)
                        return true;
 
@@ -555,7 +555,7 @@ static inline bool napi_if_scheduled_mark_missed(struct napi_struct *n)
                        return false;
 
                new = val | NAPIF_STATE_MISSED;
-       } while (cmpxchg(&n->state, val, new) != val);
+       } while (!try_cmpxchg(&n->state, &val, new));
 
        return true;
 }