Patch "x86/boot: Fix kdump, cleanup aborted E820_PRAM max_pfn manipulation" has been added to the 4.8-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
x86/boot: Fix kdump, cleanup aborted E820_PRAM max_pfn manipulation
to the 4.8-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
x86-boot-fix-kdump-cleanup-aborted-e820_pram-max_pfn-manipulation.patch
and it can be found in the queue-4.8 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
917db484dc6a69969d317b3e57add4208a8d9d42Mon Sep 17 00:00:00 2001
From: Dan Williams <[email protected]>
Date: Wed, 21 Sep 2016 12:50:45 -0700
Subject: x86/boot: Fix kdump, cleanup aborted E820_PRAM max_pfn manipulation
From: Dan Williams <[email protected]>
commit 917db484dc6a69969d317b3e57add4208a8d9d42 upstream.
In commit:
ec776ef6bbe1 ("x86/mm: Add support for the non-standard protected e820 type")
Christoph references the original patch I wrote implementing pmem support. The intent of the 'max_pfn' changes in that commit were to enable persistent memory ranges to be covered by the struct page memmap by default.
However, that approach was abandoned when Christoph ported the patches [1], and that functionality has since been replaced by devm_memremap_pages().
In the meantime, this max_pfn manipulation is confusing kdump [2] that assumes that everything covered by the max_pfn is "System RAM". This results in kdump hanging or crashing.
[1]: https://lists.01.org/pipermail/linux-nvdimm/2015-March/000348.html
[2]: https://bugzilla.redhat.com/show_bug.cgi?id=1351098
So fix it.
--- arch/x86/kernel/e820.c | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-)
arch/x86/kernel/e820.c +5 -9
@@ -348,7 +348,7 @@ int __init sanitize_e820_map(struct e820* continue building up new bios map based on this * information */ -if (current_type != last_type || current_type ==E820_PRAM ) { +if (current_type != last_type) {if (last_type !=0 ) { new_bios[new_bios_entry].size = change_point[chgidx]->addr - last_addr;
@@ -754,7 +754,7 @@ u64 __init early_reserve_e820(u64 size,/* * Find the highest page frame number we have available */ -static unsigned long __init e820_end_pfn (unsigned long limit_pfn) +static unsigned long __init e820_end_pfn (unsigned long limit_pfn,unsigned type) {int i;unsigned long last_pfn =0 ;
@@ -765,11 +765,7 @@ static unsigned long __init e820_end_pfnunsigned long start_pfn;unsigned long end_pfn; -/* -* Persistent memory is accounted as ram for purposes of -* establishing max_pfn and mem_map. -*/ -if (ei->type !=E820_RAM && ei->type !=E820_PRAM ) +if (ei->type != type)continue ; start_pfn = ei->addr >>PAGE_SHIFT ;
@@ -794,12 +790,12 @@ static unsigned long __init e820_end_pfn }unsigned long __init e820_end_of_ram_pfn (void ) { -return e820_end_pfn (MAX_ARCH_PFN ); +return e820_end_pfn (MAX_ARCH_PFN ,E820_RAM ); }unsigned long __init e820_end_of_low_ram_pfn (void ) { -return e820_end_pfn (1UL << (32 -PAGE_SHIFT )); +return e820_end_pfn (1UL << (32 -PAGE_SHIFT ),E820_RAM ); }static void early_panic (char *msg)
Patches currently in stable-queue which might be from [email protected] are
queue-4.8/x86-boot-fix-kdump-cleanup-aborted-e820_pram-max_pfn-manipulation.patch