lib/genalloc: use try_cmpxchg in {set,clear}_bits_ll
authorUros Bizjak <ubizjak@gmail.com>
Wed, 18 Jan 2023 15:07:03 +0000 (16:07 +0100)
committerAndrew Morton <akpm@linux-foundation.org>
Fri, 3 Feb 2023 06:50:05 +0000 (22:50 -0800)
commit030c6ff6498881ac842c7f6da5eec181202b29f4
treef08c6b2f70ed980d645fb671455023fb0e7e59c3
parentf3296f80c8065b26a27eb8ab686d0c1d67880524
lib/genalloc: use try_cmpxchg in {set,clear}_bits_ll

Use try_cmpxchg instead of cmpxchg (*ptr, old, new) == old in
{set,clear}_bits_ll.  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.

Note that the value from *ptr should be read using READ_ONCE to prevent
the compiler from merging, refetching or reordering the read.

The patch also declares these two functions inline, to ensure inlining.

No functional change intended.

Link: https://lkml.kernel.org/r/20230118150703.4024-1-ubizjak@gmail.com
Signed-off-by: Uros Bizjak <ubizjak@gmail.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
lib/genalloc.c