lkml.org 
[lkml]   [2009]   [Jun]   [9]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    SubjectRe: [PATCH 1/5] Split wait_noreap_copyout()
    Hi, Andrew!

    Can you, please, update description of
    wait_task_-cleanups-split-wait_noreap_copyout.patch?

    New description:
    ----------------------------------------------------------------------
    Move getrusage() and put_user() code from wait_noreap_copyout()
    to copy_wait_opts_to_user(). The same code is spreaded across all
    wait_task_*() routines, it's better to reuse one copy.

    User visible change: previously, waitid() was doing unconditional
    put_user() in wait_noreap_copyout(), and was returning EFAULT
    if infop pointer, provided by user, was NULL *and* WCONTINUED was not
    set in options. Now all variants of wait() function use the same generic
    copy_wait_opts_to_user(), and, thus, have the same behaviour regarding
    to filling of siginfo structure. Starting from this commit waitid()
    returns NULL if infop argument is NULL.
    ----------------------------------------------------------------------

    Thanks!

    >
    > Move getrusage() and put_user() code from wait_noreap_copyout()
    > to copy_wait_opts_to_user(). The same code is spreaded across all
    > wait_task_*() routines, it's better to reuse one copy.
    >
    > Signed-off-by: Vitaly Mayatskikh <v.mayatskih@gmail.com>
    > ---
    > kernel/exit.c | 39 +++++++++++++++++++++++----------------
    > 1 files changed, 23 insertions(+), 16 deletions(-)
    >
    > diff --git a/kernel/exit.c b/kernel/exit.c
    > index 25782da..9546362 100644
    > --- a/kernel/exit.c
    > +++ b/kernel/exit.c
    > @@ -1123,27 +1123,34 @@ static int eligible_child(struct wait_opts *wo, struct task_struct *p)
    > return 1;
    > }
    >
    > -static int wait_noreap_copyout(struct wait_opts *wo, struct task_struct *p,
    > - pid_t pid, uid_t uid, int why, int status)
    > +static int copy_wait_opts_to_user(struct wait_opts *wo, struct task_struct *p,
    > + pid_t pid, uid_t uid, int why, int status, int signal)
    > {
    > - struct siginfo __user *infop;
    > + struct siginfo __user *infop = wo->wo_info;
    > int retval = wo->wo_rusage
    > ? getrusage(p, RUSAGE_BOTH, wo->wo_rusage) : 0;
    >
    > + if (!retval && infop) {
    > + retval = put_user(signal, &infop->si_signo);
    > + if (!retval)
    > + retval = put_user(0, &infop->si_errno);
    > + if (!retval)
    > + retval = put_user((short)why, &infop->si_code);
    > + if (!retval)
    > + retval = put_user(pid, &infop->si_pid);
    > + if (!retval)
    > + retval = put_user(uid, &infop->si_uid);
    > + if (!retval)
    > + retval = put_user(status, &infop->si_status);
    > + }
    > + return retval;
    > +}
    > +
    > +static int wait_noreap_copyout(struct wait_opts *wo, struct task_struct *p,
    > + pid_t pid, uid_t uid, int why, int status)
    > +{
    > + int retval = copy_wait_opts_to_user(wo, p, pid, uid, why, status, SIGCHLD);
    > put_task_struct(p);
    > - infop = wo->wo_info;
    > - if (!retval)
    > - retval = put_user(SIGCHLD, &infop->si_signo);
    > - if (!retval)
    > - retval = put_user(0, &infop->si_errno);
    > - if (!retval)
    > - retval = put_user((short)why, &infop->si_code);
    > - if (!retval)
    > - retval = put_user(pid, &infop->si_pid);
    > - if (!retval)
    > - retval = put_user(uid, &infop->si_uid);
    > - if (!retval)
    > - retval = put_user(status, &infop->si_status);
    > if (!retval)
    > retval = pid;
    > return retval;
    > --
    > 1.6.2.2
    >
    >

    --
    wbr, Vitaly


    \
     
     \ /
      Last update: 2009-06-09 17:17    [W:0.028 / U:0.300 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site