Unverified Commit ec6f613e authored by Uros Bizjak's avatar Uros Bizjak Committed by Christian Brauner
Browse files

fs: Use try_cmpxchg() in sb_init_done_wq()



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.

No functional change intended.

Signed-off-by: default avatarUros Bizjak <ubizjak@gmail.com>
Link: https://lore.kernel.org/20250811132326.620521-1-ubizjak@gmail.com


Reviewed-by: default avatarJan 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: default avatarChristian Brauner <brauner@kernel.org>
parent 14498ca7
Loading
Loading
Loading
Loading
+5 −3
Original line number Diff line number Diff line
@@ -2318,13 +2318,15 @@ int sb_init_dio_done_wq(struct super_block *sb)
						      sb->s_id);
	if (!wq)
		return -ENOMEM;

	old = NULL;
	/*
	 * This has to be atomic as more DIOs can race to create the workqueue
	 */
	old = cmpxchg(&sb->s_dio_done_wq, NULL, wq);
	if (!try_cmpxchg(&sb->s_dio_done_wq, &old, wq)) {
		/* Someone created workqueue before us? Free ours... */
	if (old)
		destroy_workqueue(wq);
	}
	return 0;
}
EXPORT_SYMBOL_GPL(sb_init_dio_done_wq);