Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756833AbbEESby (ORCPT ); Tue, 5 May 2015 14:31:54 -0400 Received: from mail-wi0-f174.google.com ([209.85.212.174]:36436 "EHLO mail-wi0-f174.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1030573AbbEERwj (ORCPT ); Tue, 5 May 2015 13:52:39 -0400 From: Ingo Molnar To: linux-kernel@vger.kernel.org Cc: Andy Lutomirski , Borislav Petkov , Dave Hansen , Fenghua Yu , "H. Peter Anvin" , Linus Torvalds , Oleg Nesterov , Thomas Gleixner Subject: [PATCH 098/208] x86/fpu: Split fpu__cpu_init() into early-boot and cpu-boot parts Date: Tue, 5 May 2015 19:49:50 +0200 Message-Id: <1430848300-27877-20-git-send-email-mingo@kernel.org> X-Mailer: git-send-email 2.1.0 In-Reply-To: <1430848300-27877-1-git-send-email-mingo@kernel.org> References: <1430848300-27877-1-git-send-email-mingo@kernel.org> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 3050 Lines: 93 There are two kinds of FPU initialization sequences necessary to bring FPU functionality up: once per system bootup activities, such as detection, feature initialization, etc. of attributes that are shared by all CPUs in the system - and per cpu initialization sequences run when a CPU is brought online (either during bootup or during CPU hotplug onlining), such as CR0/CR4 register setting, etc. The FPU code is mixing these roles together, with no clear distinction. Start sorting this out by splitting the main FPU detection routine (fpu__cpu_init()) into two parts: fpu__init_system() for one per system init activities, and fpu__init_cpu() for the per CPU onlining init activities. Note that xstate_init() is called from both variants for the time being, because it has a dual nature as well. We'll fix that in upcoming patches. Just do the split and call it as we used to before, don't introduce any change in initialization behavior yet, beyond duplicate (and harmless) fpu__init_cpu() and xstate_init() calls - which we'll fix in later patches. Reviewed-by: Borislav Petkov Cc: Andy Lutomirski Cc: Dave Hansen Cc: Fenghua Yu Cc: H. Peter Anvin Cc: Linus Torvalds Cc: Oleg Nesterov Cc: Thomas Gleixner Signed-off-by: Ingo Molnar --- arch/x86/kernel/fpu/init.c | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/arch/x86/kernel/fpu/init.c b/arch/x86/kernel/fpu/init.c index 3e0fee5bc2e7..d6234adc8ba0 100644 --- a/arch/x86/kernel/fpu/init.c +++ b/arch/x86/kernel/fpu/init.c @@ -118,13 +118,9 @@ static void fpstate_xstate_init_size(void) } /* - * Called on the boot CPU at bootup to set up the initial FPU state that - * is later cloned into all processes. - * - * Also called on secondary CPUs to set up the FPU state of their - * idle threads. + * Enable all supported FPU features. Called when a CPU is brought online. */ -void fpu__cpu_init(void) +void fpu__init_cpu(void) { unsigned long cr0; unsigned long cr4_mask = 0; @@ -150,12 +146,29 @@ void fpu__cpu_init(void) cr0 |= X86_CR0_EM; write_cr0(cr0); + xsave_init(); +} + +/* + * Called on the boot CPU once per system bootup, to set up the initial FPU state that + * is later cloned into all processes. + */ +void fpu__init_system(void) +{ + /* The FPU has to be operational for some of the later FPU init activities: */ + fpu__init_cpu(); mxcsr_feature_mask_init(); xsave_init(); eager_fpu_init(); } +void fpu__cpu_init(void) +{ + fpu__init_cpu(); + fpu__init_system(); +} + static int __init no_387(char *s) { setup_clear_cpu_cap(X86_FEATURE_FPU); -- 2.1.0 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/