From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.8 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 84682C4320A for ; Wed, 4 Aug 2021 04:32:50 +0000 (UTC) Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.kernel.org (Postfix) with ESMTP id 3D62260C3F for ; Wed, 4 Aug 2021 04:32:50 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.1 mail.kernel.org 3D62260C3F Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=intel.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=kvack.org Received: by kanga.kvack.org (Postfix) id DF9D48D0024; Wed, 4 Aug 2021 00:32:40 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id CE37A8D001F; Wed, 4 Aug 2021 00:32:40 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id A4AB38D001E; Wed, 4 Aug 2021 00:32:40 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0102.hostedemail.com [216.40.44.102]) by kanga.kvack.org (Postfix) with ESMTP id 743168D0022 for ; Wed, 4 Aug 2021 00:32:40 -0400 (EDT) Received: from smtpin25.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay01.hostedemail.com (Postfix) with ESMTP id 2D263181D46E7 for ; Wed, 4 Aug 2021 04:32:40 +0000 (UTC) X-FDA: 78436127280.25.85B534A Received: from mga17.intel.com (mga17.intel.com [192.55.52.151]) by imf27.hostedemail.com (Postfix) with ESMTP id 8F5827026160 for ; Wed, 4 Aug 2021 04:32:39 +0000 (UTC) X-IronPort-AV: E=McAfee;i="6200,9189,10065"; a="194125764" X-IronPort-AV: E=Sophos;i="5.84,293,1620716400"; d="scan'208";a="194125764" Received: from fmsmga003.fm.intel.com ([10.253.24.29]) by fmsmga107.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 03 Aug 2021 21:32:36 -0700 X-IronPort-AV: E=Sophos;i="5.84,293,1620716400"; d="scan'208";a="511702681" Received: from iweiny-desk2.sc.intel.com (HELO localhost) ([10.3.52.147]) by fmsmga003-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 03 Aug 2021 21:32:36 -0700 From: ira.weiny@intel.com To: Dave Hansen , Dan Williams Cc: Ira Weiny , Fenghua Yu , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Peter Zijlstra , Andy Lutomirski , "H. Peter Anvin" , Rick Edgecombe , x86@kernel.org, linux-kernel@vger.kernel.org, nvdimm@lists.linux.dev, linux-mm@kvack.org Subject: [PATCH V7 07/18] x86/pks: Preserve the PKRS MSR on context switch Date: Tue, 3 Aug 2021 21:32:20 -0700 Message-Id: <20210804043231.2655537-8-ira.weiny@intel.com> X-Mailer: git-send-email 2.28.0.rc0.12.gb6a658bd00c9 In-Reply-To: <20210804043231.2655537-1-ira.weiny@intel.com> References: <20210804043231.2655537-1-ira.weiny@intel.com> MIME-Version: 1.0 X-Rspamd-Server: rspam04 X-Rspamd-Queue-Id: 8F5827026160 Authentication-Results: imf27.hostedemail.com; dkim=none; dmarc=fail reason="No valid SPF, No valid DKIM" header.from=intel.com (policy=none); spf=none (imf27.hostedemail.com: domain of ira.weiny@intel.com has no SPF policy when checking 192.55.52.151) smtp.mailfrom=ira.weiny@intel.com X-Stat-Signature: xnu6pzkxz95855k6tnugsuatkz7a6drj X-HE-Tag: 1628051559-69445 Content-Transfer-Encoding: quoted-printable X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: From: Ira Weiny The PKRS MSR is defined as a per-logical-processor register. This isolates memory access by logical CPU. Unfortunately, the MSR is not managed by XSAVE. Therefore, tasks must save/restore the MSR value on context switch. Define a saved PKRS value in the task struct. Initialize all tasks with the INIT_PKRS_VALUE and call pkrs_write_current() to set the MSR to the saved task value on schedule in. Co-developed-by: Fenghua Yu Signed-off-by: Fenghua Yu Signed-off-by: Ira Weiny --- Changes for V7 Move definitions from asm/processor.h to asm/pks.h s/INIT_PKRS_VALUE/pkrs_init_value Change pks_init_task()/pks_sched_in() to functions s/pks_sched_in/pks_write_current to be used more generically later in the series --- arch/x86/include/asm/pks.h | 4 ++++ arch/x86/include/asm/processor.h | 19 ++++++++++++++++++- arch/x86/kernel/process.c | 3 +++ arch/x86/kernel/process_64.c | 3 +++ arch/x86/mm/pkeys.c | 16 ++++++++++++++++ 5 files changed, 44 insertions(+), 1 deletion(-) diff --git a/arch/x86/include/asm/pks.h b/arch/x86/include/asm/pks.h index 5d7067ada8fb..e7727086cec2 100644 --- a/arch/x86/include/asm/pks.h +++ b/arch/x86/include/asm/pks.h @@ -5,10 +5,14 @@ #ifdef CONFIG_ARCH_ENABLE_SUPERVISOR_PKEYS =20 void setup_pks(void); +void pkrs_write_current(void); +void pks_init_task(struct task_struct *task); =20 #else /* !CONFIG_ARCH_ENABLE_SUPERVISOR_PKEYS */ =20 static inline void setup_pks(void) { } +static inline void pkrs_write_current(void) { } +static inline void pks_init_task(struct task_struct *task) { } =20 #endif /* CONFIG_ARCH_ENABLE_SUPERVISOR_PKEYS */ =20 diff --git a/arch/x86/include/asm/processor.h b/arch/x86/include/asm/proc= essor.h index f3020c54e2cb..a6cb7d152c62 100644 --- a/arch/x86/include/asm/processor.h +++ b/arch/x86/include/asm/processor.h @@ -502,6 +502,12 @@ struct thread_struct { unsigned long cr2; unsigned long trap_nr; unsigned long error_code; + +#ifdef CONFIG_ARCH_ENABLE_SUPERVISOR_PKEYS + /* Saved Protection key register for supervisor mappings */ + u32 saved_pkrs; +#endif + #ifdef CONFIG_VM86 /* Virtual 86 mode info */ struct vm86 *vm86; @@ -768,7 +774,18 @@ static inline void spin_lock_prefetch(const void *x) #define KSTK_ESP(task) (task_pt_regs(task)->sp) =20 #else -#define INIT_THREAD { } + +#ifdef CONFIG_ARCH_ENABLE_SUPERVISOR_PKEYS +/* + * Early task gets full permissions, the restrictive value is set in + * pks_init_task() + */ +#define INIT_THREAD { \ + .saved_pkrs =3D 0, \ +} +#else +#define INIT_THREAD { } +#endif =20 extern unsigned long KSTK_ESP(struct task_struct *task); =20 diff --git a/arch/x86/kernel/process.c b/arch/x86/kernel/process.c index 1d9463e3096b..c792ac5f33a2 100644 --- a/arch/x86/kernel/process.c +++ b/arch/x86/kernel/process.c @@ -43,6 +43,7 @@ #include #include #include +#include =20 #include "process.h" =20 @@ -223,6 +224,8 @@ void flush_thread(void) =20 fpu_flush_thread(); pkru_flush_thread(); + + pks_init_task(tsk); } =20 void disable_TSC(void) diff --git a/arch/x86/kernel/process_64.c b/arch/x86/kernel/process_64.c index ec0d836a13b1..8bd1f039e5bf 100644 --- a/arch/x86/kernel/process_64.c +++ b/arch/x86/kernel/process_64.c @@ -59,6 +59,7 @@ /* Not included via unistd.h */ #include #endif +#include =20 #include "process.h" =20 @@ -658,6 +659,8 @@ __switch_to(struct task_struct *prev_p, struct task_s= truct *next_p) /* Load the Intel cache allocation PQR MSR. */ resctrl_sched_in(); =20 + pkrs_write_current(); + return prev_p; } =20 diff --git a/arch/x86/mm/pkeys.c b/arch/x86/mm/pkeys.c index fbffbced81b5..eca01dc8d7ac 100644 --- a/arch/x86/mm/pkeys.c +++ b/arch/x86/mm/pkeys.c @@ -284,5 +284,21 @@ void setup_pks(void) write_pkrs(pkrs_init_value); cr4_set_bits(X86_CR4_PKS); } +; + +/* + * PKRS is only temporarily changed during specific code paths. Only a + * preemption during these windows away from the default value would + * require updating the MSR. write_pkrs() handles this optimization. + */ +void pkrs_write_current(void) +{ + write_pkrs(current->thread.saved_pkrs); +} + +void pks_init_task(struct task_struct *task) +{ + task->thread.saved_pkrs =3D pkrs_init_value; +} =20 #endif /* CONFIG_ARCH_ENABLE_SUPERVISOR_PKEYS */ --=20 2.28.0.rc0.12.gb6a658bd00c9