mirror of
https://github.com/torvalds/linux.git
synced 2024-11-22 12:11:40 +00:00
exit: move core of do_wait() into helper
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>
This commit is contained in:
parent
9d900d4ea3
commit
06a101ca45
@ -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;
|
||||
long 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(¤t->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(¤t->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(¤t->signal->wait_chldexit, &wo->child_wait);
|
||||
return retval;
|
||||
|
Loading…
Reference in New Issue
Block a user