fork/vm: Move common PF_IO_WORKER behavior to new flag
authorMike Christie <michael.christie@oracle.com>
Fri, 10 Mar 2023 22:03:26 +0000 (16:03 -0600)
committerChristian Brauner (Microsoft) <brauner@kernel.org>
Sun, 12 Mar 2023 09:54:43 +0000 (10:54 +0100)
This adds a new flag, PF_USER_WORKER, that's used for behavior common to
to both PF_IO_WORKER and users like vhost which will use a new helper
instead of create_io_thread because they require different behavior for
operations like signal handling.

The common behavior PF_USER_WORKER covers is the vm reclaim handling.

Signed-off-by: Mike Christie <michael.christie@oracle.com>
Acked-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Christian Brauner (Microsoft) <brauner@kernel.org>
include/linux/sched.h
include/linux/sched/task.h
kernel/fork.c
mm/vmscan.c

index 63d2421..e1e605b 100644 (file)
@@ -1729,7 +1729,7 @@ extern struct pid *cad_pid;
 #define PF_MEMALLOC            0x00000800      /* Allocating memory */
 #define PF_NPROC_EXCEEDED      0x00001000      /* set_user() noticed that RLIMIT_NPROC was exceeded */
 #define PF_USED_MATH           0x00002000      /* If unset the fpu must be initialized before use */
-#define PF__HOLE__00004000     0x00004000
+#define PF_USER_WORKER         0x00004000      /* Kernel thread cloned from userspace thread */
 #define PF_NOFREEZE            0x00008000      /* This thread should not be frozen */
 #define PF__HOLE__00010000     0x00010000
 #define PF_KSWAPD              0x00020000      /* I am kswapd */
index 268c77a..2950e83 100644 (file)
@@ -27,6 +27,7 @@ struct kernel_clone_args {
        int exit_signal;
        u32 kthread:1;
        u32 io_thread:1;
+       u32 user_worker:1;
        unsigned long stack;
        unsigned long stack_size;
        unsigned long tls;
index 81dfb25..fb8ec19 100644 (file)
@@ -2103,6 +2103,8 @@ static __latent_entropy struct task_struct *copy_process(
        p->flags &= ~PF_KTHREAD;
        if (args->kthread)
                p->flags |= PF_KTHREAD;
+       if (args->user_worker)
+               p->flags |= PF_USER_WORKER;
        if (args->io_thread) {
                /*
                 * Mark us an IO worker, and block any signal that isn't
@@ -2630,6 +2632,7 @@ struct task_struct *create_io_thread(int (*fn)(void *), void *arg, int node)
                .fn             = fn,
                .fn_arg         = arg,
                .io_thread      = 1,
+               .user_worker    = 1,
        };
 
        return copy_process(NULL, 0, node, &args);
index 9c1c5e8..7ba6bfd 100644 (file)
@@ -1151,12 +1151,12 @@ void reclaim_throttle(pg_data_t *pgdat, enum vmscan_throttle_state reason)
        DEFINE_WAIT(wait);
 
        /*
-        * Do not throttle IO workers, kthreads other than kswapd or
+        * Do not throttle user workers, kthreads other than kswapd or
         * workqueues. They may be required for reclaim to make
         * forward progress (e.g. journalling workqueues or kthreads).
         */
        if (!current_is_kswapd() &&
-           current->flags & (PF_IO_WORKER|PF_KTHREAD)) {
+           current->flags & (PF_USER_WORKER|PF_KTHREAD)) {
                cond_resched();
                return;
        }