Received: by 2002:a05:6a10:c7c6:0:0:0:0 with SMTP id h6csp2962575pxy; Tue, 3 Aug 2021 21:36:04 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzri/3P+/uj9sOvxI8vkIAMkcsvE1uJfZKohKv4bpR3qUuGxTAE3zAKmgsliK6yqjZgmJ8G X-Received: by 2002:a92:6610:: with SMTP id a16mr1012779ilc.71.1628051763804; Tue, 03 Aug 2021 21:36:03 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1628051763; cv=none; d=google.com; s=arc-20160816; b=Lg64ndB775pM9qs7k/WN/N5FUHtNsgKLLNtkWWKLgUeLcwkjoQIYPBMTaGigURO44M B2DPlgRmtKx5+PhgYAhJ89NDAcmUdHNDxAGRjTRGW6TbYXR/+N5CKe6/46FlSzViFxkt OVZmz79l2/vJtLBnhGz281i4Ok3TsfOk1d9V0xVMLVjWCViZlk0ORfcx18L8RApE8p0K /crsfuwLxnSEKP/kxFscbdMiO+fdt9qY09BvVW4p9WRf/Cu+6o6kHY4D4tpeGvi+TC4p rHtzojbPSAZySC61EKcdUslExBlfHEKgyP/saOeH56EI1ZSYewBxOG4fAggffOAGDaZG 5vag== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=nXWx2QDuPraWYvywyoriirnMgff2B9RPNNqy7k6Ew0c=; b=1EyBBY3ShINnqpgSPFP6ZpwJ+3pH5RZGPtPX3BUb5iq3ZLX71bmmhxPlVjTOLaQGS+ 4yIHfU04152TE9RPlPXqg/8jbElhy4lreL7laSFTY7Cy6Y0bGR+dAemHofuBIrqwRetM QVoIJnszHVpRCR5BEuK7SzUSrHDOwcDrdjymF68x0QNBurdBjojhckf2GH8GIv2jyByf j6sUhN31VZlC61UM3M2qvyQxN1rnCYruKzfdA0EPRw3tCRScMj3Dn5t8RYhcipSAgqSc 328/fkeag+gkFCNzxDiXpT01zEjTa5fjeptGmYz78SgCJ4EhesHMVZhvADYczO324c+C nYiA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id q18si993335jao.21.2021.08.03.21.35.50; Tue, 03 Aug 2021 21:36:03 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235129AbhHDEdI (ORCPT + 99 others); Wed, 4 Aug 2021 00:33:08 -0400 Received: from mga14.intel.com ([192.55.52.115]:41725 "EHLO mga14.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234831AbhHDEct (ORCPT ); Wed, 4 Aug 2021 00:32:49 -0400 X-IronPort-AV: E=McAfee;i="6200,9189,10065"; a="213574615" X-IronPort-AV: E=Sophos;i="5.84,293,1620716400"; d="scan'208";a="213574615" Received: from fmsmga003.fm.intel.com ([10.253.24.29]) by fmsmga103.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 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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 void setup_pks(void); +void pkrs_write_current(void); +void pks_init_task(struct task_struct *task); #else /* !CONFIG_ARCH_ENABLE_SUPERVISOR_PKEYS */ static inline void setup_pks(void) { } +static inline void pkrs_write_current(void) { } +static inline void pks_init_task(struct task_struct *task) { } #endif /* CONFIG_ARCH_ENABLE_SUPERVISOR_PKEYS */ diff --git a/arch/x86/include/asm/processor.h b/arch/x86/include/asm/processor.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) #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 = 0, \ +} +#else +#define INIT_THREAD { } +#endif extern unsigned long KSTK_ESP(struct task_struct *task); 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 #include "process.h" @@ -223,6 +224,8 @@ void flush_thread(void) fpu_flush_thread(); pkru_flush_thread(); + + pks_init_task(tsk); } 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 #include "process.h" @@ -658,6 +659,8 @@ __switch_to(struct task_struct *prev_p, struct task_struct *next_p) /* Load the Intel cache allocation PQR MSR. */ resctrl_sched_in(); + pkrs_write_current(); + return prev_p; } 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 = pkrs_init_value; +} #endif /* CONFIG_ARCH_ENABLE_SUPERVISOR_PKEYS */ -- 2.28.0.rc0.12.gb6a658bd00c9