Message ID | 20220822143243.2798-1-ubizjak@gmail.com (mailing list archive) |
---|---|
State | Accepted |
Commit | b9030780971b56c0c455c3b66244efd96608846d |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | netdev: Use try_cmpxchg in napi_if_scheduled_mark_missed | expand |
Hello: This patch was applied to netdev/net-next.git (master) by Jakub Kicinski <kuba@kernel.org>: On Mon, 22 Aug 2022 16:32:43 +0200 you wrote: > 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. > > [...] Here is the summary with links: - netdev: Use try_cmpxchg in napi_if_scheduled_mark_missed https://git.kernel.org/netdev/net-next/c/b9030780971b You are awesome, thank you!
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index 1a3cb93c3dcc..51c916894661 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h @@ -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; }
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: "David S. Miller" <davem@davemloft.net> Cc: Eric Dumazet <edumazet@google.com> Cc: Jakub Kicinski <kuba@kernel.org> Cc: Paolo Abeni <pabeni@redhat.com> Signed-off-by: Uros Bizjak <ubizjak@gmail.com> --- include/linux/netdevice.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)