mirror of
https://github.com/torvalds/linux.git
synced 2026-03-08 03:04:51 +01:00
fs: Use try_cmpxchg() in start_dir_add()
Use try_cmpxchg() instead of cmpxchg(*ptr, old, new) == old. The x86 CMPXCHG instruction returns success in the ZF flag, so this change saves a compare after CMPXCHG (and related move instruction in front of CMPXCHG). Note that the value from *ptr should be read using READ_ONCE() to prevent the compiler from merging, refetching or reordering the read. No functional change intended. Signed-off-by: Uros Bizjak <ubizjak@gmail.com> Link: https://lore.kernel.org/20250811125308.616717-1-ubizjak@gmail.com Reviewed-by: Jan Kara <jack@suse.cz> Cc: Alexander Viro <viro@zeniv.linux.org.uk> Cc: Christian Brauner <brauner@kernel.org> Cc: Jan Kara <jack@suse.cz> Signed-off-by: Christian Brauner <brauner@kernel.org>
This commit is contained in:
parent
278033a225
commit
14498ca7e0
1 changed files with 2 additions and 2 deletions
|
|
@ -2509,8 +2509,8 @@ static inline unsigned start_dir_add(struct inode *dir)
|
|||
{
|
||||
preempt_disable_nested();
|
||||
for (;;) {
|
||||
unsigned n = dir->i_dir_seq;
|
||||
if (!(n & 1) && cmpxchg(&dir->i_dir_seq, n, n + 1) == n)
|
||||
unsigned n = READ_ONCE(dir->i_dir_seq);
|
||||
if (!(n & 1) && try_cmpxchg(&dir->i_dir_seq, &n, n + 1))
|
||||
return n;
|
||||
cpu_relax();
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue