From: Masayoshi Mizuma <msys.mizuma@gmail.com>
To: Borislav Petkov <bp@alien8.de>,
Thomas Gleixner <tglx@linutronix.de>,
Ingo Molnar <mingo@redhat.com>, "H. Peter Anvin" <hpa@zytor.com>,
x86@kernel.org, Baoquan He <bhe@redhat.com>
Cc: Masayoshi Mizuma <msys.mizuma@gmail.com>,
Masayoshi Mizuma <m.mizuma@jp.fujitsu.com>,
linux-kernel@vger.kernel.org
Subject: [PATCH v3 5/5] x86/mm/KASLR: Adjust the padding size for the direct mapping.
Date: Fri, 30 Aug 2019 17:47:07 -0400 [thread overview]
Message-ID: <20190830214707.1201-6-msys.mizuma@gmail.com> (raw)
In-Reply-To: <20190830214707.1201-1-msys.mizuma@gmail.com>
From: Masayoshi Mizuma <m.mizuma@jp.fujitsu.com>
The system sometimes crashes while memory hot-adding on KASLR
enabled system. The crash happens because the regions pointed by
kaslr_regions[].base are overwritten by the hot-added memory.
It happens because of the padding size for kaslr_regions[].base isn't
enough for the system whose physical memory layout has huge space for
memory hotplug. kaslr_regions[].base points "actual installed
memory size + padding" or higher address. So, if the "actual + padding"
is lower address than the maximum memory address, which means the memory
address reachable by memory hot-add, kaslr_regions[].base is destroyed by
the overwritten.
address
^
|------- maximum memory address (Hotplug)
| ^
|------- kaslr_regions[0].base | Hotadd-able region
| ^ |
| | padding |
| V V
|------- actual memory address (Installed on boot)
|
Fix it by getting the maximum memory address from SRAT and store
the value in boot_param, then set the padding size while KASLR
initializing if the default padding size isn't enough.
Signed-off-by: Masayoshi Mizuma <m.mizuma@jp.fujitsu.com>
---
arch/x86/mm/kaslr.c | 31 +++++++++++++++++++++++++++++--
1 file changed, 29 insertions(+), 2 deletions(-)
diff --git a/arch/x86/mm/kaslr.c b/arch/x86/mm/kaslr.c
index 8e5f3642e..a78844c57 100644
--- a/arch/x86/mm/kaslr.c
+++ b/arch/x86/mm/kaslr.c
@@ -70,6 +70,34 @@ static inline bool kaslr_memory_enabled(void)
return kaslr_enabled() && !IS_ENABLED(CONFIG_KASAN);
}
+static inline unsigned long phys_memmap_size(void)
+{
+ unsigned long padding = CONFIG_RANDOMIZE_MEMORY_PHYSICAL_PADDING;
+#ifdef CONFIG_MEMORY_HOTPLUG
+ unsigned long actual, maximum, base;
+
+ if (!boot_params.max_addr)
+ goto out;
+
+ /*
+ * The padding size should set to get for kaslr_regions[].base
+ * bigger address than the maximum memory address the system can
+ * have. kaslr_regions[].base points "actual size + padding" or
+ * higher address. If "actual size + padding" points the lower
+ * address than the maximum memory size, fix the padding size.
+ */
+ actual = roundup(PFN_PHYS(max_pfn), 1UL << TB_SHIFT);
+ maximum = roundup(boot_params.max_addr, 1UL << TB_SHIFT);
+ base = actual + (padding << TB_SHIFT);
+
+ if (maximum > base)
+ padding = (maximum - actual) >> TB_SHIFT;
+out:
+#endif
+ return DIV_ROUND_UP(max_pfn << PAGE_SHIFT, 1UL << TB_SHIFT) +
+ padding;
+}
+
/*
* Even though a huge virtual address space is reserved for the direct
* mapping of physical memory, e.g in 4-level paging mode, it's 64TB,
@@ -87,8 +115,7 @@ static inline unsigned long calc_direct_mapping_size(void)
* Update Physical memory mapping to available and
* add padding if needed (especially for memory hotplug support).
*/
- memory_tb = DIV_ROUND_UP(max_pfn << PAGE_SHIFT, 1UL << TB_SHIFT) +
- CONFIG_RANDOMIZE_MEMORY_PHYSICAL_PADDING;
+ memory_tb = phys_memmap_size();
size_tb = 1 << (MAX_PHYSMEM_BITS - TB_SHIFT);
--
2.18.1
next prev parent reply other threads:[~2019-08-30 21:48 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-08-30 21:47 [PATCH v3 0/5] Adjust the padding size for KASLR Masayoshi Mizuma
2019-08-30 21:47 ` [PATCH v3 1/5] x86/boot: Wrap up the SRAT traversing code into subtable_parse() Masayoshi Mizuma
2019-09-05 13:41 ` Baoquan He
2019-08-30 21:47 ` [PATCH v3 2/5] x86/boot: Add max_addr field in struct boot_params Masayoshi Mizuma
2019-09-05 13:43 ` Baoquan He
2019-08-30 21:47 ` [PATCH v3 3/5] x86/boot: Get the max address from SRAT Masayoshi Mizuma
2019-09-05 13:51 ` Baoquan He
2019-10-29 15:53 ` Masayoshi Mizuma
2019-08-30 21:47 ` [PATCH v3 4/5] x86/mm/KASLR: Cleanup calculation for direct mapping size Masayoshi Mizuma
2019-09-05 13:54 ` Baoquan He
2019-10-29 15:55 ` Masayoshi Mizuma
2019-08-30 21:47 ` Masayoshi Mizuma [this message]
2019-10-29 2:59 ` [PATCH v3 0/5] Adjust the padding size for KASLR Baoquan He
2019-10-29 15:58 ` Masayoshi Mizuma
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=20190830214707.1201-6-msys.mizuma@gmail.com \
--to=msys.mizuma@gmail.com \
--cc=bhe@redhat.com \
--cc=bp@alien8.de \
--cc=hpa@zytor.com \
--cc=linux-kernel@vger.kernel.org \
--cc=m.mizuma@jp.fujitsu.com \
--cc=mingo@redhat.com \
--cc=tglx@linutronix.de \
--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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®