From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753468AbcGUQXB (ORCPT ); Thu, 21 Jul 2016 12:23:01 -0400 Received: from terminus.zytor.com ([198.137.202.10]:55534 "EHLO terminus.zytor.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753319AbcGUQW6 (ORCPT ); Thu, 21 Jul 2016 12:22:58 -0400 Date: Thu, 21 Jul 2016 09:21:41 -0700 From: tip-bot for Dave Hansen Message-ID: Cc: torvalds@linux-foundation.org, mingo@kernel.org, peterz@infradead.org, fenghua.yu@intel.com, brgerst@gmail.com, quentin.casasnovas@oracle.com, luto@kernel.org, dave.hansen@linux.intel.com, dave@sr71.net, tglx@linutronix.de, bp@alien8.de, dvlasenk@redhat.com, jpoimboe@redhat.com, hpa@zytor.com, oleg@redhat.com, linux-kernel@vger.kernel.org Reply-To: mingo@kernel.org, torvalds@linux-foundation.org, fenghua.yu@intel.com, peterz@infradead.org, quentin.casasnovas@oracle.com, brgerst@gmail.com, bp@alien8.de, dvlasenk@redhat.com, dave@sr71.net, luto@kernel.org, dave.hansen@linux.intel.com, tglx@linutronix.de, jpoimboe@redhat.com, hpa@zytor.com, linux-kernel@vger.kernel.org, oleg@redhat.com In-Reply-To: <20160720194551.63BB2B58@viggo.jf.intel.com> References: <20160720194551.63BB2B58@viggo.jf.intel.com> To: linux-tip-commits@vger.kernel.org Subject: [tip:x86/fpu] x86/fpu: Do not BUG_ON() in early FPU code Git-Commit-ID: ec3ed4a2104b8d1ab8da2db5b1221b2ba8a7a6e1 X-Mailer: tip-git-log-daemon Robot-ID: Robot-Unsubscribe: Contact to get blacklisted from these emails MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset=UTF-8 Content-Disposition: inline Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Commit-ID: ec3ed4a2104b8d1ab8da2db5b1221b2ba8a7a6e1 Gitweb: http://git.kernel.org/tip/ec3ed4a2104b8d1ab8da2db5b1221b2ba8a7a6e1 Author: Dave Hansen AuthorDate: Wed, 20 Jul 2016 12:45:51 -0700 Committer: Ingo Molnar CommitDate: Thu, 21 Jul 2016 18:18:45 +0200 x86/fpu: Do not BUG_ON() in early FPU code I don't think it is really possible to have a system where CPUID enumerates support for XSAVE but that it does not have FP/SSE (they are "legacy" features and always present). But, I did manage to hit this case in qemu when I enabled its somewhat shaky XSAVE support. The bummer is that the FPU is set up before we parse the command-line or have *any* console support including earlyprintk. That turned what should have been an easy thing to debug in to a bit more of an odyssey. So a BUG() here is worthless. All it does it guarantee that if/when we hit this case we have an empty console. So, remove the BUG() and try to limp along by disabling XSAVE and trying to continue. Add a comment on why we are doing this, and also add a common "out_disable" path for leaving fpu__init_system_xstate(). Signed-off-by: Dave Hansen Cc: Andy Lutomirski Cc: Borislav Petkov Cc: Brian Gerst Cc: Dave Hansen Cc: Denys Vlasenko Cc: Fenghua Yu Cc: H. Peter Anvin Cc: Josh Poimboeuf Cc: Linus Torvalds Cc: Oleg Nesterov Cc: Peter Zijlstra Cc: Quentin Casasnovas Cc: Thomas Gleixner Link: http://lkml.kernel.org/r/20160720194551.63BB2B58@viggo.jf.intel.com Signed-off-by: Ingo Molnar --- arch/x86/kernel/fpu/xstate.c | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/arch/x86/kernel/fpu/xstate.c b/arch/x86/kernel/fpu/xstate.c index 3169bca..680049a 100644 --- a/arch/x86/kernel/fpu/xstate.c +++ b/arch/x86/kernel/fpu/xstate.c @@ -714,8 +714,13 @@ void __init fpu__init_system_xstate(void) xfeatures_mask = eax + ((u64)edx << 32); if ((xfeatures_mask & XFEATURE_MASK_FPSSE) != XFEATURE_MASK_FPSSE) { + /* + * This indicates that something really unexpected happened + * with the enumeration. Disable XSAVE and try to continue + * booting without it. This is too early to BUG(). + */ pr_err("x86/fpu: FP/SSE not present amongst the CPU's xstate features: 0x%llx.\n", xfeatures_mask); - BUG(); + goto out_disable; } xfeatures_mask &= fpu__get_supported_xfeatures_mask(); @@ -723,11 +728,8 @@ void __init fpu__init_system_xstate(void) /* Enable xstate instructions to be able to continue with initialization: */ fpu__init_cpu_xstate(); err = init_xstate_size(); - if (err) { - /* something went wrong, boot without any XSAVE support */ - fpu__init_disable_system_xstate(); - return; - } + if (err) + goto out_disable; /* * Update info used for ptrace frames; use standard-format size and no @@ -744,6 +746,11 @@ void __init fpu__init_system_xstate(void) xfeatures_mask, fpu_kernel_xstate_size, boot_cpu_has(X86_FEATURE_XSAVES) ? "compacted" : "standard"); + return; + +out_disable: + /* something went wrong, try to boot without any XSAVE support */ + fpu__init_disable_system_xstate(); } /*