Messages in this thread |  | | From | David Laight <> | Subject | RE: [PATCH 01/29] iov_iter: Switch to using a table of operations | Date | Sun, 22 Nov 2020 13:58:10 +0000 |
| |
From: David Howells > Sent: 22 November 2020 13:33 > > Linus Torvalds <torvalds@linux-foundation.org> 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)
|  |