All of lore.kernel.org
 help / color / mirror / Atom feed
From: Dan Williams <dan.j.williams@intel.com>
To: linux-kernel@vger.kernel.org
Cc: Christoph Hellwig <hch@lst.de>, Jane Chu <jane.chu@oracle.com>,
	Borislav Petkov <bp@suse.de>,
	Stephen Rothwell <sfr@canb.auug.org.au>,
	x86@kernel.org, nvdimm@lists.linux.dev,
	linux-fsdevel@vger.kernel.org
Subject: [PATCH v11 2/7] x86/mce: relocate set{clear}_mce_nospec() functions
Date: Mon, 16 May 2022 11:21:46 -0700	[thread overview]
Message-ID: <165272527328.90175.8336008202048685278.stgit@dwillia2-desk3.amr.corp.intel.com> (raw)
In-Reply-To: <165247798860.4117683.4554602198740624216.stgit@dwillia2-desk3.amr.corp.intel.com>

From: Jane Chu <jane.chu@oracle.com>

Relocate the twin mce functions to arch/x86/mm/pat/set_memory.c
file where they belong.

While at it, fixup a function name in a comment.

Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Dan Williams <dan.j.williams@intel.com>
Signed-off-by: Jane Chu <jane.chu@oracle.com>
Acked-by: Borislav Petkov <bp@suse.de>
Cc: Stephen Rothwell <sfr@canb.auug.org.au>
[sfr: gate {set,clear}_mce_nospec() by CONFIG_X86_64]
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
---
Changes since v10:
- Fix a compile error with 32-bit builds (Stephen)

 arch/x86/include/asm/set_memory.h |   52 -------------------------------------
 arch/x86/mm/pat/set_memory.c      |   50 ++++++++++++++++++++++++++++++++++--
 include/linux/set_memory.h        |    8 +++---
 3 files changed, 52 insertions(+), 58 deletions(-)

diff --git a/arch/x86/include/asm/set_memory.h b/arch/x86/include/asm/set_memory.h
index 78ca53512486..b45c4d27fd46 100644
--- a/arch/x86/include/asm/set_memory.h
+++ b/arch/x86/include/asm/set_memory.h
@@ -86,56 +86,4 @@ bool kernel_page_present(struct page *page);
 
 extern int kernel_set_to_readonly;
 
-#ifdef CONFIG_X86_64
-/*
- * Prevent speculative access to the page by either unmapping
- * it (if we do not require access to any part of the page) or
- * marking it uncacheable (if we want to try to retrieve data
- * from non-poisoned lines in the page).
- */
-static inline int set_mce_nospec(unsigned long pfn, bool unmap)
-{
-	unsigned long decoy_addr;
-	int rc;
-
-	/* SGX pages are not in the 1:1 map */
-	if (arch_is_platform_page(pfn << PAGE_SHIFT))
-		return 0;
-	/*
-	 * We would like to just call:
-	 *      set_memory_XX((unsigned long)pfn_to_kaddr(pfn), 1);
-	 * but doing that would radically increase the odds of a
-	 * speculative access to the poison page because we'd have
-	 * the virtual address of the kernel 1:1 mapping sitting
-	 * around in registers.
-	 * Instead we get tricky.  We create a non-canonical address
-	 * that looks just like the one we want, but has bit 63 flipped.
-	 * This relies on set_memory_XX() properly sanitizing any __pa()
-	 * results with __PHYSICAL_MASK or PTE_PFN_MASK.
-	 */
-	decoy_addr = (pfn << PAGE_SHIFT) + (PAGE_OFFSET ^ BIT(63));
-
-	if (unmap)
-		rc = set_memory_np(decoy_addr, 1);
-	else
-		rc = set_memory_uc(decoy_addr, 1);
-	if (rc)
-		pr_warn("Could not invalidate pfn=0x%lx from 1:1 map\n", pfn);
-	return rc;
-}
-#define set_mce_nospec set_mce_nospec
-
-/* Restore full speculative operation to the pfn. */
-static inline int clear_mce_nospec(unsigned long pfn)
-{
-	return set_memory_wb((unsigned long) pfn_to_kaddr(pfn), 1);
-}
-#define clear_mce_nospec clear_mce_nospec
-#else
-/*
- * Few people would run a 32-bit kernel on a machine that supports
- * recoverable errors because they have too much memory to boot 32-bit.
- */
-#endif
-
 #endif /* _ASM_X86_SET_MEMORY_H */
diff --git a/arch/x86/mm/pat/set_memory.c b/arch/x86/mm/pat/set_memory.c
index abf5ed76e4b7..0caf4b0edcbc 100644
--- a/arch/x86/mm/pat/set_memory.c
+++ b/arch/x86/mm/pat/set_memory.c
@@ -19,6 +19,7 @@
 #include <linux/vmstat.h>
 #include <linux/kernel.h>
 #include <linux/cc_platform.h>
+#include <linux/set_memory.h>
 
 #include <asm/e820/api.h>
 #include <asm/processor.h>
@@ -29,7 +30,6 @@
 #include <asm/pgalloc.h>
 #include <asm/proto.h>
 #include <asm/memtype.h>
-#include <asm/set_memory.h>
 #include <asm/hyperv-tlfs.h>
 #include <asm/mshyperv.h>
 
@@ -1816,7 +1816,7 @@ static inline int cpa_clear_pages_array(struct page **pages, int numpages,
 }
 
 /*
- * _set_memory_prot is an internal helper for callers that have been passed
+ * __set_memory_prot is an internal helper for callers that have been passed
  * a pgprot_t value from upper layers and a reservation has already been taken.
  * If you want to set the pgprot to a specific page protocol, use the
  * set_memory_xx() functions.
@@ -1925,6 +1925,52 @@ int set_memory_wb(unsigned long addr, int numpages)
 }
 EXPORT_SYMBOL(set_memory_wb);
 
+/*
+ * Prevent speculative access to the page by either unmapping
+ * it (if we do not require access to any part of the page) or
+ * marking it uncacheable (if we want to try to retrieve data
+ * from non-poisoned lines in the page).
+ */
+#ifdef CONFIG_X86_64
+int set_mce_nospec(unsigned long pfn, bool unmap)
+{
+	unsigned long decoy_addr;
+	int rc;
+
+	/* SGX pages are not in the 1:1 map */
+	if (arch_is_platform_page(pfn << PAGE_SHIFT))
+		return 0;
+	/*
+	 * We would like to just call:
+	 *      set_memory_XX((unsigned long)pfn_to_kaddr(pfn), 1);
+	 * but doing that would radically increase the odds of a
+	 * speculative access to the poison page because we'd have
+	 * the virtual address of the kernel 1:1 mapping sitting
+	 * around in registers.
+	 * Instead we get tricky.  We create a non-canonical address
+	 * that looks just like the one we want, but has bit 63 flipped.
+	 * This relies on set_memory_XX() properly sanitizing any __pa()
+	 * results with __PHYSICAL_MASK or PTE_PFN_MASK.
+	 */
+	decoy_addr = (pfn << PAGE_SHIFT) + (PAGE_OFFSET ^ BIT(63));
+
+	if (unmap)
+		rc = set_memory_np(decoy_addr, 1);
+	else
+		rc = set_memory_uc(decoy_addr, 1);
+	if (rc)
+		pr_warn("Could not invalidate pfn=0x%lx from 1:1 map\n", pfn);
+	return rc;
+}
+
+/* Restore full speculative operation to the pfn. */
+int clear_mce_nospec(unsigned long pfn)
+{
+	return set_memory_wb((unsigned long) pfn_to_kaddr(pfn), 1);
+}
+EXPORT_SYMBOL_GPL(clear_mce_nospec);
+#endif /* CONFIG_X86_64 */
+
 int set_memory_x(unsigned long addr, int numpages)
 {
 	if (!(__supported_pte_mask & _PAGE_NX))
diff --git a/include/linux/set_memory.h b/include/linux/set_memory.h
index f36be5166c19..683a6c3f7179 100644
--- a/include/linux/set_memory.h
+++ b/include/linux/set_memory.h
@@ -42,14 +42,14 @@ static inline bool can_set_direct_map(void)
 #endif
 #endif /* CONFIG_ARCH_HAS_SET_DIRECT_MAP */
 
-#ifndef set_mce_nospec
+#ifdef CONFIG_X86_64
+int set_mce_nospec(unsigned long pfn, bool unmap);
+int clear_mce_nospec(unsigned long pfn);
+#else
 static inline int set_mce_nospec(unsigned long pfn, bool unmap)
 {
 	return 0;
 }
-#endif
-
-#ifndef clear_mce_nospec
 static inline int clear_mce_nospec(unsigned long pfn)
 {
 	return 0;


  reply	other threads:[~2022-05-16 18:21 UTC|newest]

Thread overview: 46+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-04-22 22:45 [PATCH v9 0/7] DAX poison recovery Jane Chu
2022-04-22 22:45 ` [dm-devel] " Jane Chu
2022-04-22 22:45 ` [PATCH v9 1/7] acpi/nfit: rely on mce->misc to determine poison granularity Jane Chu
2022-04-22 22:45   ` [dm-devel] " Jane Chu
2022-04-22 22:45 ` [PATCH v9 2/7] x86/mce: relocate set{clear}_mce_nospec() functions Jane Chu
2022-04-22 22:45   ` [dm-devel] " Jane Chu
2022-04-28 13:09   ` Borislav Petkov
2022-04-28 13:09     ` [dm-devel] " Borislav Petkov
2022-05-13 21:41   ` [PATCH v10 " Dan Williams
2022-05-16 18:21     ` Dan Williams [this message]
2022-05-16 20:30   ` [PATCH v9 " Dan Williams
2022-05-16 20:30     ` [dm-devel] " Dan Williams
2022-04-22 22:45 ` [PATCH v9 3/7] mce: fix set_mce_nospec to always unmap the whole page Jane Chu
2022-04-22 22:45   ` [dm-devel] " Jane Chu
2022-04-22 23:25   ` Dan Williams
2022-04-22 23:25     ` Dan Williams
2022-05-11  3:56     ` Dan Williams
2022-05-11  3:56       ` [dm-devel] " Dan Williams
2022-05-11  8:44       ` Borislav Petkov
2022-05-11  8:44         ` [dm-devel] " Borislav Petkov
2022-05-11 17:17         ` Luck, Tony
2022-05-11 17:17           ` [dm-devel] " Luck, Tony
2022-05-13  3:41           ` Dan Williams
2022-05-13  3:41             ` [dm-devel] " Dan Williams
2022-05-16 18:38   ` [PATCH v10 " Dan Williams
2022-04-22 22:45 ` [PATCH v9 4/7] dax: introduce DAX_RECOVERY_WRITE dax access mode Jane Chu
2022-04-22 22:45   ` [dm-devel] " Jane Chu
2022-04-23  5:20   ` Christoph Hellwig
2022-04-23  5:20     ` [dm-devel] " Christoph Hellwig
2022-05-13 21:55   ` [PATCH v10 " Dan Williams
2022-05-13 21:55     ` [dm-devel] " Dan Williams
2022-05-13 22:09     ` Dan Williams
2022-05-13 22:09       ` [dm-devel] " Dan Williams
2022-05-13 22:10     ` [PATCH v11 " Dan Williams
2022-05-13 22:10       ` [dm-devel] " Dan Williams
2022-05-16 12:40     ` [PATCH v10 " Vivek Goyal
2022-05-16 12:40       ` [dm-devel] " Vivek Goyal
2022-04-22 22:45 ` [PATCH v9 5/7] dax: add .recovery_write dax_operation Jane Chu
2022-04-22 22:45   ` [dm-devel] " Jane Chu
2022-04-22 22:45 ` [PATCH v9 6/7] pmem: refactor pmem_clear_poison() Jane Chu
2022-04-22 22:45   ` [dm-devel] " Jane Chu
2022-04-22 22:45 ` [PATCH v9 7/7] pmem: implement pmem_recovery_write() Jane Chu
2022-04-22 22:45   ` [dm-devel] " Jane Chu
2022-04-23  5:21   ` Christoph Hellwig
2022-04-23  5:21     ` [dm-devel] " Christoph Hellwig
2022-05-13 22:13   ` [PATCH v10 " Dan Williams

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=165272527328.90175.8336008202048685278.stgit@dwillia2-desk3.amr.corp.intel.com \
    --to=dan.j.williams@intel.com \
    --cc=bp@suse.de \
    --cc=hch@lst.de \
    --cc=jane.chu@oracle.com \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=nvdimm@lists.linux.dev \
    --cc=sfr@canb.auug.org.au \
    --cc=x86@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.