From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932698AbcBIQLv (ORCPT ); Tue, 9 Feb 2016 11:11:51 -0500 Received: from terminus.zytor.com ([198.137.202.10]:38546 "EHLO terminus.zytor.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932588AbcBIQLs (ORCPT ); Tue, 9 Feb 2016 11:11:48 -0500 Date: Tue, 9 Feb 2016 08:10:35 -0800 From: tip-bot for Andy Lutomirski Message-ID: Cc: sai.praneeth.prakhya@intel.com, bp@alien8.de, riel@redhat.com, fenghua.yu@intel.com, dave.hansen@linux.intel.com, yu-cheng.yu@intel.com, linux-kernel@vger.kernel.org, peterz@infradead.org, luto@amacapital.net, quentin.casasnovas@oracle.com, tglx@linutronix.de, oleg@redhat.com, mingo@kernel.org, hpa@zytor.com, torvalds@linux-foundation.org, luto@kernel.org Reply-To: tglx@linutronix.de, peterz@infradead.org, luto@amacapital.net, quentin.casasnovas@oracle.com, torvalds@linux-foundation.org, luto@kernel.org, hpa@zytor.com, oleg@redhat.com, mingo@kernel.org, bp@alien8.de, riel@redhat.com, fenghua.yu@intel.com, sai.praneeth.prakhya@intel.com, dave.hansen@linux.intel.com, linux-kernel@vger.kernel.org, yu-cheng.yu@intel.com In-Reply-To: <60662444e13c76f06e23c15c5dcdba31b4ac3d67.1453675014.git.luto@kernel.org> References: <60662444e13c76f06e23c15c5dcdba31b4ac3d67.1453675014.git.luto@kernel.org> To: linux-tip-commits@vger.kernel.org Subject: [tip:x86/fpu] x86/fpu: Fix FNSAVE usage in eagerfpu mode Git-Commit-ID: 5ed73f40735c68d8a656b46d09b1885d3b8740ae 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: 5ed73f40735c68d8a656b46d09b1885d3b8740ae Gitweb: http://git.kernel.org/tip/5ed73f40735c68d8a656b46d09b1885d3b8740ae Author: Andy Lutomirski AuthorDate: Sun, 24 Jan 2016 14:38:07 -0800 Committer: Ingo Molnar CommitDate: Tue, 9 Feb 2016 15:42:55 +0100 x86/fpu: Fix FNSAVE usage in eagerfpu mode In eager fpu mode, having deactivated FPU without immediately reloading some other context is illegal. Therefore, to recover from FNSAVE, we can't just deactivate the state -- we need to reload it if we're not actively context switching. We had this wrong in fpu__save() and fpu__copy(). Fix both. __kernel_fpu_begin() was fine -- add a comment. This fixes a warning triggerable with nofxsr eagerfpu=on. Signed-off-by: Andy Lutomirski Cc: Andy Lutomirski Cc: Borislav Petkov Cc: Dave Hansen Cc: Fenghua Yu Cc: H. Peter Anvin Cc: Linus Torvalds Cc: Oleg Nesterov Cc: Peter Zijlstra Cc: Quentin Casasnovas Cc: Rik van Riel Cc: Sai Praneeth Prakhya Cc: Thomas Gleixner Cc: yu-cheng yu Link: http://lkml.kernel.org/r/60662444e13c76f06e23c15c5dcdba31b4ac3d67.1453675014.git.luto@kernel.org Signed-off-by: Ingo Molnar --- arch/x86/kernel/fpu/core.c | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/arch/x86/kernel/fpu/core.c b/arch/x86/kernel/fpu/core.c index 08e1e11..7a9244d 100644 --- a/arch/x86/kernel/fpu/core.c +++ b/arch/x86/kernel/fpu/core.c @@ -114,6 +114,10 @@ void __kernel_fpu_begin(void) kernel_fpu_disable(); if (fpu->fpregs_active) { + /* + * Ignore return value -- we don't care if reg state + * is clobbered. + */ copy_fpregs_to_fpstate(fpu); } else { this_cpu_write(fpu_fpregs_owner_ctx, NULL); @@ -189,8 +193,12 @@ void fpu__save(struct fpu *fpu) preempt_disable(); if (fpu->fpregs_active) { - if (!copy_fpregs_to_fpstate(fpu)) - fpregs_deactivate(fpu); + if (!copy_fpregs_to_fpstate(fpu)) { + if (use_eager_fpu()) + copy_kernel_to_fpregs(&fpu->state); + else + fpregs_deactivate(fpu); + } } preempt_enable(); } @@ -259,7 +267,11 @@ static void fpu_copy(struct fpu *dst_fpu, struct fpu *src_fpu) preempt_disable(); if (!copy_fpregs_to_fpstate(dst_fpu)) { memcpy(&src_fpu->state, &dst_fpu->state, xstate_size); - fpregs_deactivate(src_fpu); + + if (use_eager_fpu()) + copy_kernel_to_fpregs(&src_fpu->state); + else + fpregs_deactivate(src_fpu); } preempt_enable(); }