iversion: use atomic64_try_cmpxchg)
authorUros Bizjak <ubizjak@gmail.com>
Sun, 21 Aug 2022 19:30:11 +0000 (21:30 +0200)
committerAndrew Morton <akpm@linux-foundation.org>
Mon, 12 Sep 2022 04:55:08 +0000 (21:55 -0700)
commitda3f52ba359590d8eb465ae0d8b6e11d6fd9432f
tree003c4c1976664451f6a85feeb67c12388303c735
parent38ace0d513d9d2556beca4d07102d25e9a73c53c
iversion: use atomic64_try_cmpxchg)

Use atomic64_try_cmpxchg instead of
atomic64_cmpxchg (*ptr, old, new) == old in inode_set_max_iversion_raw,
inode_maybe_inc_version and inode_query_iversion. 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.

The loop in inode_maybe_inc_iversion improves from:

    5563: 48 89 ca              mov    %rcx,%rdx
    5566: 48 89 c8              mov    %rcx,%rax
    5569: 48 83 e2 fe           and    $0xfffffffffffffffe,%rdx
    556d: 48 83 c2 02           add    $0x2,%rdx
    5571: f0 48 0f b1 16        lock cmpxchg %rdx,(%rsi)
    5576: 48 39 c1              cmp    %rax,%rcx
    5579: 0f 84 85 fc ff ff     je     5204 <...>
    557f: 48 89 c1              mov    %rax,%rcx
    5582: eb df                 jmp    5563 <...>

to:

    5563: 48 89 c2              mov    %rax,%rdx
    5566: 48 83 e2 fe           and    $0xfffffffffffffffe,%rdx
    556a: 48 83 c2 02           add    $0x2,%rdx
    556e: f0 48 0f b1 11        lock cmpxchg %rdx,(%rcx)
    5573: 0f 84 8b fc ff ff     je     5204 <...>
    5579: eb e8                 jmp    5563 <...>

Link: https://lkml.kernel.org/r/20220821193011.88208-1-ubizjak@gmail.com
Signed-off-by: Uros Bizjak <ubizjak@gmail.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
include/linux/iversion.h