On Wed, Mar 18, 2020 at 1:20 AM George Spelvin <lkml@xxxxxxx> wrote: > > On Tue, Mar 17, 2020 at 08:53:55PM -0700, Dan Williams wrote: > > On Tue, Mar 17, 2020 at 6:44 PM George Spelvin <lkml@xxxxxxx> wrote: > >> - if (rand_bits == 0) { > >> - rand_bits = 64; > >> - rand = get_random_u64(); > >> + if (unlikely(rshift == 0)) { > > > > I had the impression that unless unlikely is "mostly never" then it > > can do more harm than good. Is a branch guaranteed to be taken every > > BITS_PER_LONG'th occurrence really a candidate for unlikely() > > annotation? > > I had to look this up. GCC manual: > > For the purposes of branch prediction optimizations, the probability > that a '__builtin_expect' expression is 'true' is controlled by GCC's > 'builtin-expect-probability' parameter, which defaults to 90%. You can > also use '__builtin_expect_with_probability' to explicitly assign a > probability value to individual expressions. > > So I think that <= 10% is good enough, which is true in this case. > > I was tring to encourage the compiler to: > * Place this code path out of line, and > * Not do the stack manipulations (build a frame, spill registers) > needed for a non-leaf function if this path isn't taken. Understood, I think it's ok in this case because the shuffling only happens for order-10 page free events by default so it will be difficult to measure the perf impact either way. But in other kernel contexts I think unlikely() annotation should come with numbers, 90% not taken is not sufficient in and of itself. You can add: Acked-by: Dan Williams <dan.j.williams@xxxxxxxxx>