exit: move core of do_wait() into helper
authorJens Axboe <axboe@kernel.dk>
Tue, 11 Jul 2023 16:34:37 +0000 (10:34 -0600)
committerJens Axboe <axboe@kernel.dk>
Thu, 21 Sep 2023 18:03:38 +0000 (12:03 -0600)
Rather than have a maze of gotos, put the actual logic in __do_wait()
and have do_wait() loop deal with waitqueue setup/teardown and whether
to call __do_wait() again.

No functional changes intended in this patch.

Acked-by: Christian Brauner <brauner@kernel.org>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
kernel/exit.c

index 2809dad69492f916f385942141f44b78530d3046..c6fba9ecca27c0b389cd1dabbc3399e87da5a2cb 100644 (file)
@@ -1590,16 +1590,10 @@ static int do_wait_pid(struct wait_opts *wo)
        return 0;
 }
 
-static long do_wait(struct wait_opts *wo)
+static long __do_wait(struct wait_opts *wo)
 {
-       int retval;
-
-       trace_sched_process_wait(wo->wo_pid);
+       long retval;
 
-       init_waitqueue_func_entry(&wo->child_wait, child_wait_callback);
-       wo->child_wait.private = current;
-       add_wait_queue(&current->signal->wait_chldexit, &wo->child_wait);
-repeat:
        /*
         * If there is nothing that can match our criteria, just get out.
         * We will clear ->notask_error to zero if we see any child that
@@ -1611,24 +1605,23 @@ repeat:
           (!wo->wo_pid || !pid_has_task(wo->wo_pid, wo->wo_type)))
                goto notask;
 
-       set_current_state(TASK_INTERRUPTIBLE);
        read_lock(&tasklist_lock);
 
        if (wo->wo_type == PIDTYPE_PID) {
                retval = do_wait_pid(wo);
                if (retval)
-                       goto end;
+                       return retval;
        } else {
                struct task_struct *tsk = current;
 
                do {
                        retval = do_wait_thread(wo, tsk);
                        if (retval)
-                               goto end;
+                               return retval;
 
                        retval = ptrace_do_wait(wo, tsk);
                        if (retval)
-                               goto end;
+                               return retval;
 
                        if (wo->wo_flags & __WNOTHREAD)
                                break;
@@ -1638,14 +1631,32 @@ repeat:
 
 notask:
        retval = wo->notask_error;
-       if (!retval && !(wo->wo_flags & WNOHANG)) {
-               retval = -ERESTARTSYS;
-               if (!signal_pending(current)) {
-                       schedule();
-                       goto repeat;
-               }
-       }
-end:
+       if (!retval && !(wo->wo_flags & WNOHANG))
+               return -ERESTARTSYS;
+
+       return retval;
+}
+
+static long do_wait(struct wait_opts *wo)
+{
+       int retval;
+
+       trace_sched_process_wait(wo->wo_pid);
+
+       init_waitqueue_func_entry(&wo->child_wait, child_wait_callback);
+       wo->child_wait.private = current;
+       add_wait_queue(&current->signal->wait_chldexit, &wo->child_wait);
+
+       do {
+               set_current_state(TASK_INTERRUPTIBLE);
+               retval = __do_wait(wo);
+               if (retval != -ERESTARTSYS)
+                       break;
+               if (signal_pending(current))
+                       break;
+               schedule();
+       } while (1);
+
        __set_current_state(TASK_RUNNING);
        remove_wait_queue(&current->signal->wait_chldexit, &wo->child_wait);
        return retval;