]> www.infradead.org Git - users/hch/misc.git/commitdiff
fork: kill the pointless lower_32_bits() in create_io_thread(), kernel_thread(),...
authorOleg Nesterov <oleg@redhat.com>
Wed, 20 Aug 2025 16:39:46 +0000 (18:39 +0200)
committerAndrew Morton <akpm@linux-foundation.org>
Sun, 14 Sep 2025 00:32:49 +0000 (17:32 -0700)
Unlike sys_clone(), these helpers have only in kernel users which should
pass the correct "flags" argument.  lower_32_bits(flags) just adds the
unnecessary confusion and doesn't allow to use the CLONE_ flags which
don't fit into 32 bits.

create_io_thread() looks especially confusing because:

- "flags" is a compile-time constant, so lower_32_bits() simply
  has no effect

- .exit_signal = (lower_32_bits(flags) & CSIGNAL) is harmless but
  doesn't look right, copy_process(CLONE_THREAD) will ignore this
  argument anyway.

None of these helpers actually need CLONE_UNTRACED or "& ~CSIGNAL", but
their presence does not add any confusion and improves code clarity.

Link: https://lkml.kernel.org/r/20250820163946.GA18549@redhat.com
Signed-off-by: Oleg Nesterov <oleg@redhat.com>
Reviewed-by: Jens Axboe <axboe@kernel.dk>
Cc: Christian Brauner <brauner@kernel.org>
Cc: Kees Cook <kees@kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
kernel/fork.c

index e06cfaa85a84b2b799593bdf810b8138e6de5d96..a8674ba2b33b7109c318dc86d0eaf09c11557c57 100644 (file)
@@ -2537,11 +2537,9 @@ struct task_struct * __init fork_idle(int cpu)
 struct task_struct *create_io_thread(int (*fn)(void *), void *arg, int node)
 {
        unsigned long flags = CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|
-                               CLONE_IO;
+                             CLONE_IO|CLONE_VM|CLONE_UNTRACED;
        struct kernel_clone_args args = {
-               .flags          = ((lower_32_bits(flags) | CLONE_VM |
-                                   CLONE_UNTRACED) & ~CSIGNAL),
-               .exit_signal    = (lower_32_bits(flags) & CSIGNAL),
+               .flags          = flags,
                .fn             = fn,
                .fn_arg         = arg,
                .io_thread      = 1,
@@ -2653,9 +2651,8 @@ pid_t kernel_thread(int (*fn)(void *), void *arg, const char *name,
                    unsigned long flags)
 {
        struct kernel_clone_args args = {
-               .flags          = ((lower_32_bits(flags) | CLONE_VM |
-                                   CLONE_UNTRACED) & ~CSIGNAL),
-               .exit_signal    = (lower_32_bits(flags) & CSIGNAL),
+               .flags          = ((flags | CLONE_VM | CLONE_UNTRACED) & ~CSIGNAL),
+               .exit_signal    = (flags & CSIGNAL),
                .fn             = fn,
                .fn_arg         = arg,
                .name           = name,
@@ -2671,9 +2668,8 @@ pid_t kernel_thread(int (*fn)(void *), void *arg, const char *name,
 pid_t user_mode_thread(int (*fn)(void *), void *arg, unsigned long flags)
 {
        struct kernel_clone_args args = {
-               .flags          = ((lower_32_bits(flags) | CLONE_VM |
-                                   CLONE_UNTRACED) & ~CSIGNAL),
-               .exit_signal    = (lower_32_bits(flags) & CSIGNAL),
+               .flags          = ((flags | CLONE_VM | CLONE_UNTRACED) & ~CSIGNAL),
+               .exit_signal    = (flags & CSIGNAL),
                .fn             = fn,
                .fn_arg         = arg,
        };