From patchwork Wed Mar 22 14:50:49 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dave Martin X-Patchwork-Id: 9639123 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 683FC601E9 for ; Wed, 22 Mar 2017 14:56:17 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 5333B2846B for ; Wed, 22 Mar 2017 14:56:17 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 4807E28478; Wed, 22 Mar 2017 14:56:17 +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=-1.9 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID autolearn=ham version=3.3.1 Received: from bombadil.infradead.org (bombadil.infradead.org [65.50.211.133]) (using TLSv1.2 with cipher AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 410932846B for ; Wed, 22 Mar 2017 14:56:16 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:MIME-Version:Cc:List-Subscribe: List-Help:List-Post:List-Archive:List-Unsubscribe:List-Id:References: In-Reply-To:Message-Id:Date:Subject:To:From:Reply-To:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Owner; bh=xOsizqLKUXfd4+acLH7Uy638MIv8RrbISN/oLHRo4UY=; b=uVGUYtpK+j3rnVJHrdWej8yMHd govlZff+bYwOl4mRzg09PwVFG2A7Rbu1daMavQbrNVtQqPzlcUNSR42PVrZpjT+iHKJD4RAMsnYR7 /jOeEIfx4TNXtbboP96CFw2flYc8coNbUtwoTIxn2w047N4lQehBdONnExo8f6XGolgAPdzSWlULF r73NHye2ogYVkS6+DAJw08ijslWyTZNId6pNqTndQfaA8Su+VB34vVyi6Drg2/Y6z6J7yzcypElAJ pT0Un+Ckm2NHokSdedPSvuYxI0c8lC0YGl7liiojk78okgYua4kOX1dOY/B9luPnoWZAevWZuKydN 3J3I+xnQ==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.87 #1 (Red Hat Linux)) id 1cqhgK-0003jS-Bn; Wed, 22 Mar 2017 14:56:12 +0000 Received: from foss.arm.com ([217.140.101.70]) by bombadil.infradead.org with esmtp (Exim 4.87 #1 (Red Hat Linux)) id 1cqhdQ-0008IW-33 for linux-arm-kernel@lists.infradead.org; Wed, 22 Mar 2017 14:54:43 +0000 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.72.51.249]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 060D115BF; Wed, 22 Mar 2017 07:52:56 -0700 (PDT) Received: from e103592.cambridge.arm.com (usa-sjc-imap-foss1.foss.arm.com [10.72.51.249]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id B1B4D3F575; Wed, 22 Mar 2017 07:52:54 -0700 (PDT) From: Dave Martin To: linux-arm-kernel@lists.infradead.org Subject: [RFC PATCH v2 19/41] arm64/sve: Avoid corruption when replacing the SVE state Date: Wed, 22 Mar 2017 14:50:49 +0000 Message-Id: <1490194274-30569-20-git-send-email-Dave.Martin@arm.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1490194274-30569-1-git-send-email-Dave.Martin@arm.com> References: <1490194274-30569-1-git-send-email-Dave.Martin@arm.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20170322_075312_675212_77DA55AB X-CRM114-Status: UNSURE ( 9.78 ) X-CRM114-Notice: Please train this message. X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Florian Weimer , Ard Biesheuvel , Marc Zyngier , Catalin Marinas , Will Deacon , Szabolcs Nagy , Joseph Myers MIME-Version: 1.0 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org X-Virus-Scanned: ClamAV using ClamSMTP If preemption occurs during replacement of the whole SVE state, as occurs during execve() or rt_sigreturn(), then some or all of the new state for the thread can be lost, due to erroneous saving of the pre-existing state over the new data. This patch disables preemption around the affected operations to avoid this failure mode. This should be reexamined later if the impact on preemption latency proves to be excessive. Signed-off-by: Dave Martin --- arch/arm64/kernel/fpsimd.c | 4 ++++ arch/arm64/kernel/signal.c | 9 ++++++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/arch/arm64/kernel/fpsimd.c b/arch/arm64/kernel/fpsimd.c index 952dd20..f3006a6 100644 --- a/arch/arm64/kernel/fpsimd.c +++ b/arch/arm64/kernel/fpsimd.c @@ -254,6 +254,8 @@ void fpsimd_flush_thread(void) if (!system_supports_fpsimd()) return; + preempt_disable(); + fpsimd_flush_task_state(current); memset(¤t->thread.fpsimd_state, 0, sizeof(struct fpsimd_state)); @@ -269,6 +271,8 @@ void fpsimd_flush_thread(void) } set_thread_flag(TIF_FOREIGN_FPSTATE); + + preempt_enable(); } /* diff --git a/arch/arm64/kernel/signal.c b/arch/arm64/kernel/signal.c index 9d4f7c8..c3e15e2 100644 --- a/arch/arm64/kernel/signal.c +++ b/arch/arm64/kernel/signal.c @@ -256,6 +256,10 @@ static int __restore_sve_fpsimd_context(struct user_ctxs *user, if (vl != sve_get_vl()) return -EINVAL; + preempt_disable(); + + set_thread_flag(TIF_FOREIGN_FPSTATE); + BUG_ON(SVE_SIG_REGS_SIZE(vq) > sizeof(*task_sve_regs)); BUG_ON(round_up(SVE_SIG_REGS_SIZE(vq), 16) < sizeof(*task_sve_regs)); BUG_ON(SVE_SIG_FFR_OFFSET(vq) - SVE_SIG_REGS_OFFSET != @@ -265,7 +269,7 @@ static int __restore_sve_fpsimd_context(struct user_ctxs *user, SVE_SIG_REGS_OFFSET, SVE_SIG_REGS_SIZE(vq)); if (err) - return err; + goto out_preempt; /* copy the FP and status/control registers */ /* restore_sigframe() already checked that user->fpsimd != NULL. */ @@ -278,6 +282,9 @@ static int __restore_sve_fpsimd_context(struct user_ctxs *user, if (!err) fpsimd_update_current_state(&fpsimd); +out_preempt: + preempt_enable(); + return err; }