summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Schwidefsky <schwidefsky@de.ibm.com>2015-04-16 14:47:33 +0200
committerJiri Slaby <jslaby@suse.cz>2015-08-04 16:51:58 +0200
commit6c1ad037a144bb56db6e70b00a4108ce7ff7c950 (patch)
treed80651feedca13d94f5ddf98ccbb5cbaae6b864f
parentcbe04187a6cac63ce4c6277b9759d370de68cb00 (diff)
kexec: allocate the kexec control page with KEXEC_CONTROL_MEMORY_GFP
commit 7e01b5acd88b3f3108d8c4ce44e3205d67437202 upstream. Introduce KEXEC_CONTROL_MEMORY_GFP to allow the architecture code to override the gfp flags of the allocation for the kexec control page. The loop in kimage_alloc_normal_control_pages allocates pages with GFP_KERNEL until a page is found that happens to have an address smaller than the KEXEC_CONTROL_MEMORY_LIMIT. On systems with a large memory size but a small KEXEC_CONTROL_MEMORY_LIMIT the loop will keep allocating memory until the oom killer steps in. Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com> Signed-off-by: Jiri Slaby <jslaby@suse.cz>
-rw-r--r--arch/s390/include/asm/kexec.h3
-rw-r--r--include/linux/kexec.h4
-rw-r--r--kernel/kexec.c2
3 files changed, 8 insertions, 1 deletions
diff --git a/arch/s390/include/asm/kexec.h b/arch/s390/include/asm/kexec.h
index 694bcd6bd927..2f924bc30e35 100644
--- a/arch/s390/include/asm/kexec.h
+++ b/arch/s390/include/asm/kexec.h
@@ -26,6 +26,9 @@
/* Not more than 2GB */
#define KEXEC_CONTROL_MEMORY_LIMIT (1UL<<31)
+/* Allocate control page with GFP_DMA */
+#define KEXEC_CONTROL_MEMORY_GFP GFP_DMA
+
/* Maximum address we can use for the crash control pages */
#define KEXEC_CRASH_CONTROL_MEMORY_LIMIT (-1UL)
diff --git a/include/linux/kexec.h b/include/linux/kexec.h
index 5fd33dc1fe3a..66e3687b401b 100644
--- a/include/linux/kexec.h
+++ b/include/linux/kexec.h
@@ -26,6 +26,10 @@
#error KEXEC_CONTROL_MEMORY_LIMIT not defined
#endif
+#ifndef KEXEC_CONTROL_MEMORY_GFP
+#define KEXEC_CONTROL_MEMORY_GFP GFP_KERNEL
+#endif
+
#ifndef KEXEC_CONTROL_PAGE_SIZE
#error KEXEC_CONTROL_PAGE_SIZE not defined
#endif
diff --git a/kernel/kexec.c b/kernel/kexec.c
index 4c9dcffd1750..316216c38fb9 100644
--- a/kernel/kexec.c
+++ b/kernel/kexec.c
@@ -432,7 +432,7 @@ static struct page *kimage_alloc_normal_control_pages(struct kimage *image,
do {
unsigned long pfn, epfn, addr, eaddr;
- pages = kimage_alloc_pages(GFP_KERNEL, order);
+ pages = kimage_alloc_pages(KEXEC_CONTROL_MEMORY_GFP, order);
if (!pages)
break;
pfn = page_to_pfn(pages);