]> git.baikalelectronics.ru Git - kernel.git/commit
x86/alternatives: Do not use sync_core() to serialize I$
authorBorislav Petkov <bp@suse.de>
Sat, 3 Dec 2016 15:02:58 +0000 (16:02 +0100)
committerIngo Molnar <mingo@kernel.org>
Tue, 20 Dec 2016 08:36:42 +0000 (09:36 +0100)
commitfd888748a9a8a6f118ad681df7692dbd074bfcd6
tree332c3f082bb67dc8609d8a9c155698e590c736f4
parent8fd30a6a5eea748980e56323948a5f20e24d7121
x86/alternatives: Do not use sync_core() to serialize I$

We use sync_core() in the alternatives code to stop speculative
execution of prefetched instructions because we are potentially changing
them and don't want to execute stale bytes.

What it does on most machines is call CPUID which is a serializing
instruction. And that's expensive.

However, the instruction cache is serialized when we're on the local CPU
and are changing the data through the same virtual address. So then, we
don't need the serializing CPUID but a simple control flow change. Last
being accomplished with a CALL/RET which the noinline causes.

Suggested-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Borislav Petkov <bp@suse.de>
Reviewed-by: Andy Lutomirski <luto@kernel.org>
Cc: Andrew Cooper <andrew.cooper3@citrix.com>
Cc: Andy Lutomirski <luto@amacapital.net>
Cc: Brian Gerst <brgerst@gmail.com>
Cc: Henrique de Moraes Holschuh <hmh@hmh.eng.br>
Cc: Matthew Whitehead <tedheadster@gmail.com>
Cc: One Thousand Gnomes <gnomes@lxorguk.ukuu.org.uk>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Link: http://lkml.kernel.org/r/20161203150258.vwr5zzco7ctgc4pe@pd.tnic
Signed-off-by: Ingo Molnar <mingo@kernel.org>
arch/x86/kernel/alternative.c