Re: [RFC v2 1/6] x86: introduce kernel restartable sequence

From: Nadav Amit
Date: Thu Jan 03 2019 - 17:29:42 EST


> On Jan 3, 2019, at 2:21 PM, Andi Kleen <ak@xxxxxxxxxxxxxxx> wrote:
>
> Nadav Amit <namit@xxxxxxxxxx> writes:
>
> I see another poor man's attempt to reinvent TSX.
>
>> It is sometimes beneficial to have a restartable sequence - very few
>> instructions which if they are preempted jump to a predefined point.
>>
>> To provide such functionality on x86-64, we use an empty REX-prefix
>> (opcode 0x40) as an indication for instruction in such a sequence. Before
>> calling the schedule IRQ routine, if the "magic" prefix is found, we
>> call a routine to adjust the instruction pointer. It is expected that
>> this opcode is not in common use.
>
> You cannot just assume something like that. x86 is a constantly
> evolving architecture. The prefix might well have meaning at
> some point.
>
> Before doing something like that you would need to ask the CPU
> vendors to reserve the sequence you're using for software use.

Okâ Iâll try to think about another solution. Just note that this is just
used as a hint to avoid unnecessary lookups. (IOW, nothing will break if the
prefix is used.)

> You're doing the equivalent of patching a private system call
> into your own kernel without working with upstream, don't do that.

I donât understand this comment though. Can you please explain?

> Better to find some other solution to do the restart.
> How about simply using a per cpu variable? That should be cheaper
> anyways.

The problem is that the per-cpu variable needs to be updated after the call
is executed, when we are already not in the context of the âinjectedâ code.
I can increase it before the call, and decrease it after return - but this
can create (in theory) long periods in which the code is âunpatchableâ,
increase the code size and slow performance.

Anyhow, Iâll give more thought. Ideas are welcomed.