Philip Guenther wrote:
> On Mon, Oct 26, 2015 at 8:46 AM, Michael McConville <[email protected]> wrote:
> > We have a pretty strong guarantee that it can only happen once per
> > process...
> ...
> > --- sys/sys/syscall_mi.h 9 Oct 2015 01:17:18 -0000 1.11
> > +++ sys/sys/syscall_mi.h 26 Oct 2015 15:13:44 -0000
> > @@ -72,7 +72,8 @@ mi_syscall(struct proc *p, register_t co
> > if (lock)
> > KERNEL_LOCK();
> > pledged = (p->p_p->ps_flags & PS_PLEDGE);
> > - if (pledged && !(tval = pledge_check(p, code))) {
> > + if (__predict_false(
> > + pledged && !(tval = pledge_check(p, code)))) {
>
> I disagree. That's the code used on every syscall, not just once per
> process and pledged is true for *most* of the processes on a -current
> box. No, that doesn't mean we should do __predict_true() there.
That's what I mean - it's used on every syscall and it can never be true
more than once per process. (That's a pledge failure, and the program
will be terminated.)
> In general, __predict_{true,false} should be left in the tool box and
> only pulled out after detailed dives into code paths involved. For
> all my banging on the project, I think I've used them in *two* places.
Passing thought: it'd be nice if the names were shorter. I feel like
much of the reason they're seen as cumbersome is that they're so
verbose. Linux uses likely() and unlikely(). __rare() could also work.
FWIW, below is what /usr/include/sys/cdefs.h says about them. Maybe
outdated.
/*
* GNU C version 2.96 adds explicit branch prediction so that
* the CPU back-end can hint the processor and also so that
* code blocks can be reordered such that the predicted path
* sees a more linear flow, thus improving cache behavior, etc.
*
* The following two macros provide us with a way to utilize this
* compiler feature. Use __predict_true() if you expect the expression
* to evaluate to true, and __predict_false() if you expect the
* expression to evaluate to false.
*
* A few notes about usage:
*
* * Generally, __predict_false() error condition checks (unless
* you have some _strong_ reason to do otherwise, in which case
* document it), and/or __predict_true() `no-error' condition
* checks, assuming you want to optimize for the no-error case.
*
* * Other than that, if you don't know the likelihood of a test
* succeeding from empirical or other `hard' evidence, don't
* make predictions.
*
* * These are meant to be used in places that are run `a lot'.
* It is wasteful to make predictions in code that is run
* seldomly (e.g. at subsystem initialization time) as the
* basic block reordering that this affects can often generate
* larger code.
*/