Re: [PATCH 07/12] x86/entry/64: Always run ptregs-using syscalls on the slow path

From: Andy Lutomirski
Date: Tue Dec 08 2015 - 16:51:52 EST


On Tue, Dec 8, 2015 at 10:56 AM, Ingo Molnar <mingo@xxxxxxxxxx> wrote:
>
> * Brian Gerst <brgerst@xxxxxxxxx> wrote:
>
>> > We could adjust it a bit and check whether we're in C land (by checking rsp
>> > for ts) and jump into the slow path if we aren't, but I'm not sure this is a
>> > huge win. It does save some rodata space by avoiding duplicating the table.
>>
>> The syscall table is huge. 545*8 bytes, over a full page. Duplicating it for
>> just a few different entries is wasteful.
>
> Note that what matters more is cache footprint, not pure size: 1K of RAM overhead
> for something as fundamental as system calls is trivial cost.
>
> So the questions to ask are along these lines:
>
> - what is the typical locality of access (do syscall numbers cluster in time and
> space)
>

I suspect that they do. Web servers will call send over and over, for example.

> - how frequently would the two tables be accessed (is one accessed less
> frequently than the other?)

On setups that don't bail right away, the fast path table gets hit
most of the time. On setups that do bail right away (context tracking
on, for example), we exclusively use the slow path table.

>
> - subsequently how does the effective cache footprint change with the
> duplication?

In the worst case (repeatedly forking, for example, but I doubt we
care about that case), the duplication adds one extra cacheline.

>
> it might still end up not being worth it - but it's not the RAM cost that is the
> main factor IMHO.

Agreed.

One option: borrow the high bit to indicate "needs ptregs". This adds
a branch to both the fast path and the slow path, but it avoids the
cache hit.

Brian's approach gets the best of all worlds except that, if I
understand it right, it's a bit fragile.

--Andy
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/