Lines Matching refs:wo

915 static int eligible_pid(struct wait_opts *wo, struct task_struct *p)  in eligible_pid()  argument
917 return wo->wo_type == PIDTYPE_MAX || in eligible_pid()
918 task_pid_type(p, wo->wo_type) == wo->wo_pid; in eligible_pid()
922 eligible_child(struct wait_opts *wo, bool ptrace, struct task_struct *p) in eligible_child() argument
924 if (!eligible_pid(wo, p)) in eligible_child()
931 if (ptrace || (wo->wo_flags & __WALL)) in eligible_child()
942 if ((p->exit_signal != SIGCHLD) ^ !!(wo->wo_flags & __WCLONE)) in eligible_child()
948 static int wait_noreap_copyout(struct wait_opts *wo, struct task_struct *p, in wait_noreap_copyout() argument
952 int retval = wo->wo_rusage in wait_noreap_copyout()
953 ? getrusage(p, RUSAGE_BOTH, wo->wo_rusage) : 0; in wait_noreap_copyout()
956 infop = wo->wo_info; in wait_noreap_copyout()
982 static int wait_task_zombie(struct wait_opts *wo, struct task_struct *p) in wait_task_zombie() argument
989 if (!likely(wo->wo_flags & WEXITED)) in wait_task_zombie()
992 if (unlikely(wo->wo_flags & WNOWAIT)) { in wait_task_zombie()
1007 return wait_noreap_copyout(wo, p, pid, uid, why, status); in wait_task_zombie()
1080 retval = wo->wo_rusage in wait_task_zombie()
1081 ? getrusage(p, RUSAGE_BOTH, wo->wo_rusage) : 0; in wait_task_zombie()
1084 if (!retval && wo->wo_stat) in wait_task_zombie()
1085 retval = put_user(status, wo->wo_stat); in wait_task_zombie()
1087 infop = wo->wo_info; in wait_task_zombie()
1162 static int wait_task_stopped(struct wait_opts *wo, in wait_task_stopped() argument
1173 if (!ptrace && !(wo->wo_flags & WUNTRACED)) in wait_task_stopped()
1190 if (!unlikely(wo->wo_flags & WNOWAIT)) in wait_task_stopped()
1212 if (unlikely(wo->wo_flags & WNOWAIT)) in wait_task_stopped()
1213 return wait_noreap_copyout(wo, p, pid, uid, why, exit_code); in wait_task_stopped()
1215 retval = wo->wo_rusage in wait_task_stopped()
1216 ? getrusage(p, RUSAGE_BOTH, wo->wo_rusage) : 0; in wait_task_stopped()
1217 if (!retval && wo->wo_stat) in wait_task_stopped()
1218 retval = put_user((exit_code << 8) | 0x7f, wo->wo_stat); in wait_task_stopped()
1220 infop = wo->wo_info; in wait_task_stopped()
1247 static int wait_task_continued(struct wait_opts *wo, struct task_struct *p) in wait_task_continued() argument
1253 if (!unlikely(wo->wo_flags & WCONTINUED)) in wait_task_continued()
1265 if (!unlikely(wo->wo_flags & WNOWAIT)) in wait_task_continued()
1275 if (!wo->wo_info) { in wait_task_continued()
1276 retval = wo->wo_rusage in wait_task_continued()
1277 ? getrusage(p, RUSAGE_BOTH, wo->wo_rusage) : 0; in wait_task_continued()
1279 if (!retval && wo->wo_stat) in wait_task_continued()
1280 retval = put_user(0xffff, wo->wo_stat); in wait_task_continued()
1284 retval = wait_noreap_copyout(wo, p, pid, uid, in wait_task_continued()
1301 static int wait_consider_task(struct wait_opts *wo, int ptrace, in wait_consider_task() argument
1315 ret = eligible_child(wo, ptrace, p); in wait_consider_task()
1328 if (wo->notask_error) in wait_consider_task()
1329 wo->notask_error = ret; in wait_consider_task()
1339 wo->notask_error = 0; in wait_consider_task()
1369 return wait_task_zombie(wo, p); in wait_consider_task()
1392 if (likely(!ptrace) || (wo->wo_flags & (WCONTINUED | WEXITED))) in wait_consider_task()
1393 wo->notask_error = 0; in wait_consider_task()
1399 wo->notask_error = 0; in wait_consider_task()
1406 ret = wait_task_stopped(wo, ptrace, p); in wait_consider_task()
1415 return wait_task_continued(wo, p); in wait_consider_task()
1427 static int do_wait_thread(struct wait_opts *wo, struct task_struct *tsk) in do_wait_thread() argument
1432 int ret = wait_consider_task(wo, 0, p); in do_wait_thread()
1441 static int ptrace_do_wait(struct wait_opts *wo, struct task_struct *tsk) in ptrace_do_wait() argument
1446 int ret = wait_consider_task(wo, 1, p); in ptrace_do_wait()
1458 struct wait_opts *wo = container_of(wait, struct wait_opts, in child_wait_callback() local
1462 if (!eligible_pid(wo, p)) in child_wait_callback()
1465 if ((wo->wo_flags & __WNOTHREAD) && wait->private != p->parent) in child_wait_callback()
1477 static long do_wait(struct wait_opts *wo) in do_wait() argument
1482 trace_sched_process_wait(wo->wo_pid); in do_wait()
1484 init_waitqueue_func_entry(&wo->child_wait, child_wait_callback); in do_wait()
1485 wo->child_wait.private = current; in do_wait()
1486 add_wait_queue(&current->signal->wait_chldexit, &wo->child_wait); in do_wait()
1494 wo->notask_error = -ECHILD; in do_wait()
1495 if ((wo->wo_type < PIDTYPE_MAX) && in do_wait()
1496 (!wo->wo_pid || hlist_empty(&wo->wo_pid->tasks[wo->wo_type]))) in do_wait()
1503 retval = do_wait_thread(wo, tsk); in do_wait()
1507 retval = ptrace_do_wait(wo, tsk); in do_wait()
1511 if (wo->wo_flags & __WNOTHREAD) in do_wait()
1517 retval = wo->notask_error; in do_wait()
1518 if (!retval && !(wo->wo_flags & WNOHANG)) { in do_wait()
1527 remove_wait_queue(&current->signal->wait_chldexit, &wo->child_wait); in do_wait()
1534 struct wait_opts wo; in SYSCALL_DEFINE5() local
1565 wo.wo_type = type; in SYSCALL_DEFINE5()
1566 wo.wo_pid = pid; in SYSCALL_DEFINE5()
1567 wo.wo_flags = options; in SYSCALL_DEFINE5()
1568 wo.wo_info = infop; in SYSCALL_DEFINE5()
1569 wo.wo_stat = NULL; in SYSCALL_DEFINE5()
1570 wo.wo_rusage = ru; in SYSCALL_DEFINE5()
1571 ret = do_wait(&wo); in SYSCALL_DEFINE5()
1602 struct wait_opts wo; in SYSCALL_DEFINE4() local
1624 wo.wo_type = type; in SYSCALL_DEFINE4()
1625 wo.wo_pid = pid; in SYSCALL_DEFINE4()
1626 wo.wo_flags = options | WEXITED; in SYSCALL_DEFINE4()
1627 wo.wo_info = NULL; in SYSCALL_DEFINE4()
1628 wo.wo_stat = stat_addr; in SYSCALL_DEFINE4()
1629 wo.wo_rusage = ru; in SYSCALL_DEFINE4()
1630 ret = do_wait(&wo); in SYSCALL_DEFINE4()