[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20090511121708.GD13954@elte.hu>
Date: Mon, 11 May 2009 14:17:08 +0200
From: Ingo Molnar <mingo@...e.hu>
To: Christoph Hellwig <hch@...radead.org>,
Hiroshi Shimamoto <h-shimamoto@...jp.nec.com>
Cc: Vitaly Mayatskikh <v.mayatskih@...il.com>,
Andrew Morton <akpm@...ux-foundation.org>,
Oleg Nesterov <oleg@...hat.com>,
Roland McGrath <roland@...hat.com>,
linux-kernel@...r.kernel.org, "H. Peter Anvin" <hpa@...or.com>,
Thomas Gleixner <tglx@...utronix.de>
Subject: Re: [PATCH 1/5] Split wait_noreap_copyout()
* Christoph Hellwig <hch@...radead.org> wrote:
> On Mon, May 11, 2009 at 12:12:40PM +0200, Vitaly Mayatskikh wrote:
> > +static int wait_copyout(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;
>
> wouldn't this better be written as:
>
> static int wait_copyout(struct wait_opts *wo, struct task_struct *p,
> pid_t pid, uid_t uid, int why, int status, int signal)
> {
> struct siginfo __user *infop = wo->wo_info;
>
> if (wo->wo_rusage) {
> int retval = getrusage(p, RUSAGE_BOTH, wo->wo_rusage);
> if (retval)
> return retval;
> }
>
> if (!infop)
> return 0;
>
> if (put_user(signal, &infop->si_signo) ||
> put_user(0, &infop->si_errno) ||
> put_user((short)why, &infop->si_code) ||
> put_user(pid, &infop->si_pid) ||
> put_user(uid, &infop->si_uid) ||
> put_user(status, &infop->si_status))
> return -EFAULT;
For best assembly code this should generally be written as a series
of:
__uaccess_err |= __put_user(x, ptr);
__uaccess_err |= __put_user(y, ptr);
__uaccess_err |= __put_user(z, ptr);
As this generates non-dependent, compressed, branch-less code.
See the (new) put_user_try / put_user_ex() / put_user_catch()
abstraction in arch/x86/include/asm/uaccess.h, and how all the x86
signal code makes use of that to optimize such patterns of per field
user copies.
Ingo
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists