From patchwork Tue Feb 5 16:43:43 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Sebastian Andrzej Siewior X-Patchwork-Id: 10797719 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 7A5736C2 for ; Tue, 5 Feb 2019 16:44:16 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 46D44274A3 for ; Tue, 5 Feb 2019 16:43:56 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 39FC52837D; Tue, 5 Feb 2019 16:43:56 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.9 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI, RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id CC27E274A3 for ; Tue, 5 Feb 2019 16:43:55 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730206AbfBEQnu convert rfc822-to-8bit (ORCPT ); Tue, 5 Feb 2019 11:43:50 -0500 Received: from Galois.linutronix.de ([146.0.238.70]:60884 "EHLO Galois.linutronix.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727250AbfBEQnu (ORCPT ); Tue, 5 Feb 2019 11:43:50 -0500 Received: from bigeasy by Galois.linutronix.de with local (Exim 4.80) (envelope-from ) id 1gr3p1-00022A-KX; Tue, 05 Feb 2019 17:43:43 +0100 Date: Tue, 5 Feb 2019 17:43:43 +0100 From: Sebastian Andrzej Siewior To: Borislav Petkov Cc: linux-kernel@vger.kernel.org, x86@kernel.org, Andy Lutomirski , Paolo Bonzini , Radim =?utf-8?b?S3LEjW3DocWZ?= , kvm@vger.kernel.org, "Jason A. Donenfeld" , Rik van Riel , Dave Hansen Subject: [PATCH 06/22 v2] x86/fpu: Don't save fxregs for ia32 frames in Message-ID: <20190205164343.6gdllvtgmw45mpdk@linutronix.de> References: <20190109114744.10936-1-bigeasy@linutronix.de> <20190109114744.10936-7-bigeasy@linutronix.de> <20190124111714.GA11554@zn.tnic> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20190124111714.GA11554@zn.tnic> User-Agent: NeoMutt/20180716 Sender: kvm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP In commit 72a671ced66db ("x86, fpu: Unify signal handling code paths for x86 and x86_64 kernels") the 32bit and 64bit path of the signal delivery code were merged. The 32bit version: |int save_i387_xstate_ia32(void __user *buf) |… | if (cpu_has_xsave) | return save_i387_xsave(fp); | if (cpu_has_fxsr) | return save_i387_fxsave(fp); The 64bit version: |int save_i387_xstate(void __user *buf) |… | if (user_has_fpu()) { | if (use_xsave()) | err = xsave_user(buf); | else | err = fxsave_user(buf); | | if (unlikely(err)) { | __clear_user(buf, xstate_size); | return err; The merge: |int save_xstate_sig(void __user *buf, void __user *buf_fx, int size) |… | if (user_has_fpu()) { | /* Save the live register state to the user directly. */ | if (save_user_xstate(buf_fx)) | return -1; | /* Update the thread's fxstate to save the fsave header. */ | if (ia32_fxstate) | fpu_fxsave(&tsk->thread.fpu); I don't think that we needed to save the FPU registers to ->thread.fpu because the registers were stored in `buf_fx'. Today the state will be restored from `buf_fx' after the signal was handled (I assume that this was also the case with lazy-FPU). Since commit 66463db4fc560 ("x86, fpu: shift drop_init_fpu() from save_xstate_sig() to handle_signal()") it is ensured that the signal handler starts with clear/fresh set of FPU registers which means that the previous store is futile. Remove copy_fxregs_to_kernel() because task's FPU state is cleared later in handle_signal() via fpu__clear(). Signed-off-by: Sebastian Andrzej Siewior --- v1…v2: - reworte description. Replaced the "I don't know why it is like it is makes no sense buh" part with some pointer which might explain why copy_fxregs_to_kernel() ended there and since when it definitely is a nop. - removed `fpu' since it unused after that change. arch/x86/kernel/fpu/signal.c | 3 --- 1 file changed, 3 deletions(-) Index: staging/arch/x86/kernel/fpu/signal.c =================================================================== --- staging.orig/arch/x86/kernel/fpu/signal.c +++ staging/arch/x86/kernel/fpu/signal.c @@ -155,7 +155,6 @@ static inline int copy_fpregs_to_sigfram */ int copy_fpstate_to_sigframe(void __user *buf, void __user *buf_fx, int size) { - struct fpu *fpu = ¤t->thread.fpu; struct task_struct *tsk = current; int ia32_fxstate = (buf != buf_fx); @@ -173,9 +172,6 @@ int copy_fpstate_to_sigframe(void __user /* Save the live register state to the user directly. */ if (copy_fpregs_to_sigframe(buf_fx)) return -1; - /* Update the thread's fxstate to save the fsave header. */ - if (ia32_fxstate) - copy_fxregs_to_kernel(fpu); /* Save the fsave header for the 32-bit frames. */ if ((ia32_fxstate || !use_fxsr()) && save_fsave_header(tsk, buf))