Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933597AbcLBAfZ (ORCPT ); Thu, 1 Dec 2016 19:35:25 -0500 Received: from mail.kernel.org ([198.145.29.136]:45726 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S933009AbcLBAfV (ORCPT ); Thu, 1 Dec 2016 19:35:21 -0500 From: Andy Lutomirski To: x86@kernel.org Cc: One Thousand Gnomes , Borislav Petkov , "linux-kernel@vger.kernel.org" , Brian Gerst , Matthew Whitehead , Henrique de Moraes Holschuh , Peter Zijlstra , Andy Lutomirski Subject: [PATCH v2 4/6] x86/paravirt: Make sync_core() be a paravirt op Date: Thu, 1 Dec 2016 16:35:00 -0800 Message-Id: X-Mailer: git-send-email 2.9.3 In-Reply-To: References: In-Reply-To: References: Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2672 Lines: 80 I want to change sync_core() to use MOV to CR2, but that won't work the way we want on Xen PV, and the easiest fix is to make sync_core() be a paravirt op. Make it so. A real paravirt guru could probably microoptimize this. I doubt it matters much, though, as sync_core() is mostly used during boot. Signed-off-by: Andy Lutomirski --- arch/x86/include/asm/paravirt.h | 5 +++++ arch/x86/include/asm/paravirt_types.h | 2 ++ arch/x86/include/asm/processor.h | 3 ++- arch/x86/kernel/paravirt.c | 2 ++ 4 files changed, 11 insertions(+), 1 deletion(-) diff --git a/arch/x86/include/asm/paravirt.h b/arch/x86/include/asm/paravirt.h index ce932812f142..7e76b72aa698 100644 --- a/arch/x86/include/asm/paravirt.h +++ b/arch/x86/include/asm/paravirt.h @@ -28,6 +28,11 @@ static inline void __cpuid(unsigned int *eax, unsigned int *ebx, PVOP_VCALL4(pv_cpu_ops.cpuid, eax, ebx, ecx, edx); } +static inline void sync_core(void) +{ + PVOP_VCALL0(pv_cpu_ops.sync_core); +} + /* * These special macros can be used to get or set a debugging register */ diff --git a/arch/x86/include/asm/paravirt_types.h b/arch/x86/include/asm/paravirt_types.h index 0f400c0e4979..e4d2cb2c0165 100644 --- a/arch/x86/include/asm/paravirt_types.h +++ b/arch/x86/include/asm/paravirt_types.h @@ -177,6 +177,8 @@ struct pv_cpu_ops { void (*start_context_switch)(struct task_struct *prev); void (*end_context_switch)(struct task_struct *next); + + void (*sync_core)(void); }; struct pv_irq_ops { diff --git a/arch/x86/include/asm/processor.h b/arch/x86/include/asm/processor.h index 64fbc937d586..c4402053c663 100644 --- a/arch/x86/include/asm/processor.h +++ b/arch/x86/include/asm/processor.h @@ -507,6 +507,7 @@ static inline void load_sp0(struct tss_struct *tss, } #define set_iopl_mask native_set_iopl_mask +#define sync_core native_sync_core #endif /* CONFIG_PARAVIRT */ /* Free all resources held by a thread. */ @@ -591,7 +592,7 @@ static __always_inline void cpu_relax(void) #define cpu_relax_lowlatency() cpu_relax() /* Stop speculative execution and prefetching of modified code. */ -static inline void sync_core(void) +static inline void native_sync_core(void) { int tmp; diff --git a/arch/x86/kernel/paravirt.c b/arch/x86/kernel/paravirt.c index bbf3d5933eaa..4d6a20ecbc78 100644 --- a/arch/x86/kernel/paravirt.c +++ b/arch/x86/kernel/paravirt.c @@ -373,6 +373,8 @@ __visible struct pv_cpu_ops pv_cpu_ops = { .start_context_switch = paravirt_nop, .end_context_switch = paravirt_nop, + + .sync_core = native_sync_core, }; /* At this point, native_get/set_debugreg has real function entries */ -- 2.9.3