]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
fork: use this_cpu_try_cmpxchg() in try_release_thread_stack_to_cache()
authorUros Bizjak <ubizjak@gmail.com>
Thu, 23 May 2024 07:35:14 +0000 (09:35 +0200)
committerAndrew Morton <akpm@linux-foundation.org>
Tue, 25 Jun 2024 05:24:56 +0000 (22:24 -0700)
Use this_cpu_try_cmpxchg() instead of this_cpu_cmpxchg (*ptr, old, new) ==
old in try_release_thread_stack_to_cache.  x86 CMPXCHG instruction returns
success in ZF flag, so this change saves a compare after cmpxchg (and
related move instruction in front of cmpxchg).

No functional change intended.

[ubizjak@gmail.com: simplify the for loop a bit]
Link: https://lkml.kernel.org/r/20240523214442.21102-1-ubizjak@gmail.com
Link: https://lkml.kernel.org/r/20240523073530.8128-1-ubizjak@gmail.com
Signed-off-by: Uros Bizjak <ubizjak@gmail.com>
Cc: Oleg Nesterov <oleg@redhat.com>
Cc: Kees Cook <keescook@chromium.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
kernel/fork.c

index 99076dbe27d83f93d704882d4f5c09ae103af303..f1c16b3dd8ac616aa690ffb09bb387bff75320b7 100644 (file)
@@ -205,9 +205,10 @@ static bool try_release_thread_stack_to_cache(struct vm_struct *vm)
        unsigned int i;
 
        for (i = 0; i < NR_CACHED_STACKS; i++) {
-               if (this_cpu_cmpxchg(cached_stacks[i], NULL, vm) != NULL)
-                       continue;
-               return true;
+               struct vm_struct *tmp = NULL;
+
+               if (this_cpu_try_cmpxchg(cached_stacks[i], &tmp, vm))
+                       return true;
        }
        return false;
 }