Re: [rfc][patch] Avoid taking global tasklist_lock for single threadedprocess at getrusage()

From: Christoph Lameter
Date: Fri Dec 23 2005 - 19:13:14 EST


Please put the copy_to_user() invocation into sys_getrusage. That is the
only function that needs to deal with user space issues includding
the transfer of the contents of struct rusage. Define
a local rusage in sys_getrusage. Pass that address to the other functions
and only copy on success to user space.

copy_to_user occurs repeatedly:

On Fri, 23 Dec 2005, Ravikiran G Thirumalai wrote:


> if (unlikely(!p->signal))
> - return;
> + return copy_to_user(ru, &r, sizeof(r)) ? -EFAULT : 0;
>
> + cputime_to_timeval(utime, &r.ru_utime);
> + cputime_to_timeval(stime, &r.ru_stime);
> +
> + return copy_to_user(ru, &r, sizeof(r)) ? -EFAULT : 0;
> +}
> +
> +
> + return copy_to_user(ru, &r, sizeof(r)) ? -EFAULT : 0;
> }
>
> + if (unlikely(!p->signal))
> + return copy_to_user(ru, &r, sizeof(r)) ? -EFAULT : 0;
> +

But its only needed here:

> asmlinkage long sys_getrusage(int who, struct rusage __user *ru)
> {
> - if (who != RUSAGE_SELF && who != RUSAGE_CHILDREN)
> - return -EINVAL;
> - return getrusage(current, who, ru);
> + switch (who) {
> + case RUSAGE_SELF:
> + return getrusage_self(ru);
> + case RUSAGE_CHILDREN:
> + return getrusage_children(ru);
> + default:
> + break;
> + }
> + return -EINVAL;
> }
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/