linux-sgx.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Tony Luck <tony.luck@intel.com>
To: "Rafael J. Wysocki" <rafael.j.wysocki@intel.com>,
	naoya.horiguchi@nec.com
Cc: Andrew Morton <akpm@linux-foundation.org>,
	Sean Christopherson <seanjc@google.com>,
	Jarkko Sakkinen <jarkko@kernel.org>,
	Dave Hansen <dave.hansen@intel.com>,
	Cathy Zhang <cathy.zhang@intel.com>,
	linux-sgx@vger.kernel.org, linux-acpi@vger.kernel.org,
	linux-mm@kvack.org, Tony Luck <tony.luck@intel.com>,
	Reinette Chatre <reinette.chatre@intel.com>
Subject: [PATCH v9 5/7] x86/sgx: Hook arch_memory_failure() into mainline code
Date: Mon, 11 Oct 2021 11:59:22 -0700	[thread overview]
Message-ID: <20211011185924.374213-6-tony.luck@intel.com> (raw)
In-Reply-To: <20211011185924.374213-1-tony.luck@intel.com>

Add a call inside memory_failure() to call the arch specific code
to check if the address is an SGX EPC page and handle it.

Note the SGX EPC pages do not have a "struct page" entry, so the hook
goes in at the same point as the device mapping hook.

Pull the call to acquire the mutex earlier so the SGX errors are also
protected.

Make set_mce_nospec() skip SGX pages when trying to adjust
the 1:1 map.

Tested-by: Reinette Chatre <reinette.chatre@intel.com>
Signed-off-by: Tony Luck <tony.luck@intel.com>
---
 arch/x86/include/asm/processor.h  |  8 ++++++++
 arch/x86/include/asm/set_memory.h |  4 ++++
 include/linux/mm.h                | 14 ++++++++++++++
 mm/memory-failure.c               | 19 +++++++++++++------
 4 files changed, 39 insertions(+), 6 deletions(-)

diff --git a/arch/x86/include/asm/processor.h b/arch/x86/include/asm/processor.h
index 9ad2acaaae9b..4865f2860a4f 100644
--- a/arch/x86/include/asm/processor.h
+++ b/arch/x86/include/asm/processor.h
@@ -853,4 +853,12 @@ enum mds_mitigations {
 	MDS_MITIGATION_VMWERV,
 };
 
+#ifdef CONFIG_X86_SGX
+int arch_memory_failure(unsigned long pfn, int flags);
+#define arch_memory_failure arch_memory_failure
+
+bool arch_is_platform_page(u64 paddr);
+#define arch_is_platform_page arch_is_platform_page
+#endif
+
 #endif /* _ASM_X86_PROCESSOR_H */
diff --git a/arch/x86/include/asm/set_memory.h b/arch/x86/include/asm/set_memory.h
index 43fa081a1adb..ce8dd215f5b3 100644
--- a/arch/x86/include/asm/set_memory.h
+++ b/arch/x86/include/asm/set_memory.h
@@ -2,6 +2,7 @@
 #ifndef _ASM_X86_SET_MEMORY_H
 #define _ASM_X86_SET_MEMORY_H
 
+#include <linux/mm.h>
 #include <asm/page.h>
 #include <asm-generic/set_memory.h>
 
@@ -98,6 +99,9 @@ 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);
diff --git a/include/linux/mm.h b/include/linux/mm.h
index 73a52aba448f..62b199ed5ec6 100644
--- a/include/linux/mm.h
+++ b/include/linux/mm.h
@@ -3284,5 +3284,19 @@ static inline int seal_check_future_write(int seals, struct vm_area_struct *vma)
 	return 0;
 }
 
+#ifndef arch_memory_failure
+static inline int arch_memory_failure(unsigned long pfn, int flags)
+{
+	return -ENXIO;
+}
+#endif
+
+#ifndef arch_is_platform_page
+static inline bool arch_is_platform_page(u64 paddr)
+{
+	return false;
+}
+#endif
+
 #endif /* __KERNEL__ */
 #endif /* _LINUX_MM_H */
diff --git a/mm/memory-failure.c b/mm/memory-failure.c
index 3e6449f2102a..b1cbf9845c19 100644
--- a/mm/memory-failure.c
+++ b/mm/memory-failure.c
@@ -1632,21 +1632,28 @@ int memory_failure(unsigned long pfn, int flags)
 	if (!sysctl_memory_failure_recovery)
 		panic("Memory failure on page %lx", pfn);
 
+	mutex_lock(&mf_mutex);
+
 	p = pfn_to_online_page(pfn);
 	if (!p) {
+		res = arch_memory_failure(pfn, flags);
+		if (res == 0)
+			goto unlock_mutex;
+
 		if (pfn_valid(pfn)) {
 			pgmap = get_dev_pagemap(pfn, NULL);
-			if (pgmap)
-				return memory_failure_dev_pagemap(pfn, flags,
-								  pgmap);
+			if (pgmap) {
+				res = memory_failure_dev_pagemap(pfn, flags,
+								 pgmap);
+				goto unlock_mutex;
+			}
 		}
 		pr_err("Memory failure: %#lx: memory outside kernel control\n",
 			pfn);
-		return -ENXIO;
+		res = -ENXIO;
+		goto unlock_mutex;
 	}
 
-	mutex_lock(&mf_mutex);
-
 try_again:
 	if (PageHuge(p)) {
 		res = memory_failure_hugetlb(pfn, flags);
-- 
2.31.1


  parent reply	other threads:[~2021-10-11 18:59 UTC|newest]

Thread overview: 96+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <20210827195543.1667168-1-tony.luck@intel.com>
2021-09-17 21:38 ` [PATCH v5 0/7] Basic recovery for machine checks inside SGX Tony Luck
2021-09-17 21:38   ` [PATCH v5 1/7] x86/sgx: Provide indication of life-cycle of EPC pages Tony Luck
2021-09-21 21:28     ` Jarkko Sakkinen
2021-09-21 21:34       ` Luck, Tony
2021-09-22  5:17         ` Jarkko Sakkinen
2021-09-21 22:15       ` Dave Hansen
2021-09-22  5:27         ` Jarkko Sakkinen
2021-09-17 21:38   ` [PATCH v5 2/7] x86/sgx: Add infrastructure to identify SGX " Tony Luck
2021-09-21 20:23     ` Dave Hansen
2021-09-21 20:50       ` Luck, Tony
2021-09-21 22:32         ` Dave Hansen
2021-09-21 23:48           ` Luck, Tony
2021-09-21 23:50             ` Dave Hansen
2021-09-17 21:38   ` [PATCH v5 3/7] x86/sgx: Initial poison handling for dirty and free pages Tony Luck
2021-09-17 21:38   ` [PATCH v5 4/7] x86/sgx: Add SGX infrastructure to recover from poison Tony Luck
2021-09-17 21:38   ` [PATCH v5 5/7] x86/sgx: Hook arch_memory_failure() into mainline code Tony Luck
2021-09-17 21:38   ` [PATCH v5 6/7] x86/sgx: Add hook to error injection address validation Tony Luck
2021-09-17 21:38   ` [PATCH v5 7/7] x86/sgx: Add check for SGX pages to ghes_do_memory_failure() Tony Luck
2021-09-22 18:21   ` [PATCH v6 0/7] Basic recovery for machine checks inside SGX Tony Luck
2021-09-22 18:21     ` [PATCH v6 1/7] x86/sgx: Provide indication of life-cycle of EPC pages Tony Luck
2021-09-23 20:21       ` Jarkko Sakkinen
2021-09-23 20:24         ` Jarkko Sakkinen
2021-09-23 20:46           ` Luck, Tony
2021-09-23 22:11             ` Luck, Tony
2021-09-28  2:13               ` Jarkko Sakkinen
2021-09-22 18:21     ` [PATCH v6 2/7] x86/sgx: Add infrastructure to identify SGX " Tony Luck
2021-09-22 18:21     ` [PATCH v6 3/7] x86/sgx: Initial poison handling for dirty and free pages Tony Luck
2021-09-22 18:21     ` [PATCH v6 4/7] x86/sgx: Add SGX infrastructure to recover from poison Tony Luck
2021-09-22 18:21     ` [PATCH v6 5/7] x86/sgx: Hook arch_memory_failure() into mainline code Tony Luck
2021-09-22 18:21     ` [PATCH v6 6/7] x86/sgx: Add hook to error injection address validation Tony Luck
2021-09-22 18:21     ` [PATCH v6 7/7] x86/sgx: Add check for SGX pages to ghes_do_memory_failure() Tony Luck
2021-09-27 21:34     ` [PATCH v7 0/7] Basic recovery for machine checks inside SGX Tony Luck
2021-09-27 21:34       ` [PATCH v7 1/7] x86/sgx: Add new sgx_epc_page flag bit to mark in-use pages Tony Luck
2021-09-28  2:28         ` Jarkko Sakkinen
2021-09-27 21:34       ` [PATCH v7 2/7] x86/sgx: Add infrastructure to identify SGX EPC pages Tony Luck
2021-09-28  2:30         ` Jarkko Sakkinen
2021-09-27 21:34       ` [PATCH v7 3/7] x86/sgx: Initial poison handling for dirty and free pages Tony Luck
2021-09-28  2:46         ` Jarkko Sakkinen
2021-09-28 15:41           ` Luck, Tony
2021-09-28 20:11             ` Jarkko Sakkinen
2021-09-28 20:53               ` Luck, Tony
2021-09-30 14:40                 ` Jarkko Sakkinen
2021-09-30 18:02                   ` Luck, Tony
2021-09-27 21:34       ` [PATCH v7 4/7] x86/sgx: Add SGX infrastructure to recover from poison Tony Luck
2021-09-27 21:34       ` [PATCH v7 5/7] x86/sgx: Hook arch_memory_failure() into mainline code Tony Luck
2021-09-27 21:34       ` [PATCH v7 6/7] x86/sgx: Add hook to error injection address validation Tony Luck
2021-09-27 21:34       ` [PATCH v7 7/7] x86/sgx: Add check for SGX pages to ghes_do_memory_failure() Tony Luck
2021-10-01 16:47       ` [PATCH v8 0/7] Basic recovery for machine checks inside SGX Tony Luck
2021-10-01 16:47         ` [PATCH v8 1/7] x86/sgx: Add new sgx_epc_page flag bit to mark in-use pages Tony Luck
2021-10-01 16:47         ` [PATCH v8 2/7] x86/sgx: Add infrastructure to identify SGX EPC pages Tony Luck
2021-10-01 16:47         ` [PATCH v8 3/7] x86/sgx: Initial poison handling for dirty and free pages Tony Luck
2021-10-04 23:24           ` Jarkko Sakkinen
2021-10-01 16:47         ` [PATCH v8 4/7] x86/sgx: Add SGX infrastructure to recover from poison Tony Luck
2021-10-04 23:30           ` Jarkko Sakkinen
2021-10-01 16:47         ` [PATCH v8 5/7] x86/sgx: Hook arch_memory_failure() into mainline code Tony Luck
2021-10-01 16:47         ` [PATCH v8 6/7] x86/sgx: Add hook to error injection address validation Tony Luck
2021-10-01 16:47         ` [PATCH v8 7/7] x86/sgx: Add check for SGX pages to ghes_do_memory_failure() Tony Luck
2021-10-04 21:56         ` [PATCH v8 0/7] Basic recovery for machine checks inside SGX Reinette Chatre
2021-10-11 18:59         ` [PATCH v9 " Tony Luck
2021-10-11 18:59           ` [PATCH v9 1/7] x86/sgx: Add new sgx_epc_page flag bit to mark in-use pages Tony Luck
2021-10-15 22:57             ` Sean Christopherson
2021-10-11 18:59           ` [PATCH v9 2/7] x86/sgx: Add infrastructure to identify SGX EPC pages Tony Luck
2021-10-22 10:43             ` kernel test robot
2021-10-11 18:59           ` [PATCH v9 3/7] x86/sgx: Initial poison handling for dirty and free pages Tony Luck
2021-10-15 23:07             ` Sean Christopherson
2021-10-15 23:32               ` Luck, Tony
2021-10-11 18:59           ` [PATCH v9 4/7] x86/sgx: Add SGX infrastructure to recover from poison Tony Luck
2021-10-15 23:10             ` Sean Christopherson
2021-10-15 23:19               ` Luck, Tony
2021-10-11 18:59           ` Tony Luck [this message]
2021-10-12 16:49             ` [PATCH v9 5/7] x86/sgx: Hook arch_memory_failure() into mainline code Jarkko Sakkinen
2021-10-11 18:59           ` [PATCH v9 6/7] x86/sgx: Add hook to error injection address validation Tony Luck
2021-10-12 16:50             ` Jarkko Sakkinen
2021-10-11 18:59           ` [PATCH v9 7/7] x86/sgx: Add check for SGX pages to ghes_do_memory_failure() Tony Luck
2021-10-12 16:51             ` Jarkko Sakkinen
2021-10-12 16:48           ` [PATCH v9 0/7] Basic recovery for machine checks inside SGX Jarkko Sakkinen
2021-10-12 17:57             ` Luck, Tony
2021-10-18 20:25           ` [PATCH v10 " Tony Luck
2021-10-18 20:25             ` [PATCH v10 1/7] x86/sgx: Add new sgx_epc_page flag bit to mark free pages Tony Luck
2021-10-18 20:25             ` [PATCH v10 2/7] x86/sgx: Add infrastructure to identify SGX EPC pages Tony Luck
2021-10-18 20:25             ` [PATCH v10 3/7] x86/sgx: Initial poison handling for dirty and free pages Tony Luck
2021-10-18 20:25             ` [PATCH v10 4/7] x86/sgx: Add SGX infrastructure to recover from poison Tony Luck
2021-10-18 20:25             ` [PATCH v10 5/7] x86/sgx: Hook arch_memory_failure() into mainline code Tony Luck
2021-10-20  9:06               ` Naoya Horiguchi
2021-10-20 17:04                 ` Luck, Tony
2021-10-18 20:25             ` [PATCH v10 6/7] x86/sgx: Add hook to error injection address validation Tony Luck
2021-10-18 20:25             ` [PATCH v10 7/7] x86/sgx: Add check for SGX pages to ghes_do_memory_failure() Tony Luck
2021-10-26 22:00             ` [PATCH v11 0/7] Basic recovery for machine checks inside SGX Tony Luck
2021-10-26 22:00               ` [PATCH v11 1/7] x86/sgx: Add new sgx_epc_page flag bit to mark free pages Tony Luck
2021-10-26 22:00               ` [PATCH v11 2/7] x86/sgx: Add infrastructure to identify SGX EPC pages Tony Luck
2021-10-26 22:00               ` [PATCH v11 3/7] x86/sgx: Initial poison handling for dirty and free pages Tony Luck
2021-10-26 22:00               ` [PATCH v11 4/7] x86/sgx: Add SGX infrastructure to recover from poison Tony Luck
2021-10-26 22:00               ` [PATCH v11 5/7] x86/sgx: Hook arch_memory_failure() into mainline code Tony Luck
2021-10-26 22:00               ` [PATCH v11 6/7] x86/sgx: Add hook to error injection address validation Tony Luck
2021-10-26 22:00               ` [PATCH v11 7/7] x86/sgx: Add check for SGX pages to ghes_do_memory_failure() Tony Luck
2021-10-29 18:39                 ` Rafael J. Wysocki

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=20211011185924.374213-6-tony.luck@intel.com \
    --to=tony.luck@intel.com \
    --cc=akpm@linux-foundation.org \
    --cc=cathy.zhang@intel.com \
    --cc=dave.hansen@intel.com \
    --cc=jarkko@kernel.org \
    --cc=linux-acpi@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=linux-sgx@vger.kernel.org \
    --cc=naoya.horiguchi@nec.com \
    --cc=rafael.j.wysocki@intel.com \
    --cc=reinette.chatre@intel.com \
    --cc=seanjc@google.com \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).