Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

xen/mcelog: simplify MCE_GETCLEAR_FLAGS using xchg()

The MCE_GETCLEAR_FLAGS ioctl retrieves xen_mcelog.flags while
atomically clearing it. This was previously implemented using a
cmpxchg() loop.

Replace the cmpxchg() loop with a single xchg(), which provides the
same atomic get-and-clear semantics, avoids retry spinning under
contention, and simplifies the code.

The code on x86_64 improves from:

186: 8b 15 00 00 00 00 mov 0x0(%rip),%edx
18c: 89 d0 mov %edx,%eax
18e: f0 0f b1 0d 00 00 00 lock cmpxchg %ecx,0x0(%rip)
195: 00
196: 39 c2 cmp %eax,%edx
198: 75 ec jne 186 <...>

to just:

186: 87 05 00 00 00 00 xchg %eax,0x0(%rip)

No functional change intended.

Signed-off-by: Uros Bizjak <ubizjak@gmail.com>
Cc: Juergen Gross <jgross@suse.com>
Cc: Stefano Stabellini <sstabellini@kernel.org>
Cc: Oleksandr Tyshchenko <oleksandr_tyshchenko@epam.com>
Reviewed-by: Andrew Cooper <andrew.cooper3@citrix.com>
Reviewed-by: Jan Beulich <jbeulich@suse.com>
Signed-off-by: Juergen Gross <jgross@suse.com>
Message-ID: <20260122141754.116129-1-ubizjak@gmail.com>

authored by

Uros Bizjak and committed by
Juergen Gross
c74a1a68 b13cd24c

+1 -3
+1 -3
drivers/xen/mcelog.c
··· 165 165 case MCE_GETCLEAR_FLAGS: { 166 166 unsigned flags; 167 167 168 - do { 169 - flags = xen_mcelog.flags; 170 - } while (cmpxchg(&xen_mcelog.flags, flags, 0) != flags); 168 + flags = xchg(&xen_mcelog.flags, 0); 171 169 172 170 return put_user(flags, p); 173 171 }