From: David Howells > Sent: 22 November 2020 13:33 > > Linus Torvalds <torvalds@xxxxxxxxxxxxxxxxxxxx> wrote: > > > - I worry a bit about the indirect call overhead and spectre v2. > > I don't know enough about how spectre v2 works to say if this would be a > problem for the ops-table approach, but wouldn't it also affect the chain of > conditional branches that we currently use, since it's branch-prediction > based? The advantage of the 'chain of branches' is that it can be converted into a 'tree of branches' because the values are all separate bits. So as well as putting the (expected) common one first; you can do: if (likely((a & (A | B))) { if (a & A) { code for A; } else { code for B; } else ... So get better control over the branch sequence. (Hopefully the compiler doesn't change the logic. I want a dumb compiler that (mostly) compiles what I write!) Part of the difficulty is deciding the common case. There'll always be a benchmark that exercises an uncommon case. Adding an indirect call does let you do things like adding ITER_IOVER_SINGLE and ITER_KVEC_SINGLE that are used in the common case of a single buffer fragment. That might be a measurable gain. It is also possible to optimise the common case to a direct call (or even inline code) and use an indirect call for everything else. David - Registered Address Lakeside, Bramley Road, Mount Farm, Milton Keynes, MK1 1PT, UK Registration No: 1397386 (Wales)