Patch "mm/memory_hotplug.c: check for missing sections in test_pages_in_a_zone()" has been added to the 3.10-stable tree
Subsystems (3)
This is a note to let you know that I've just added the patch titled
mm/memory_hotplug.c: check for missing sections in test_pages_in_a_zone()
to the 3.10-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:
mm-memory_hotplug.c-check-for-missing-sections-in-test_pages_in_a_zone.patch
and it can be found in the queue-3.10 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
5f0f2887f4de9508dcf438deab28f1de8070c271Mon Sep 17 00:00:00 2001
From: Andrew Banman <[email protected]>
Date: Tue, 29 Dec 2015 14:54:25 -0800
Subject: mm/memory_hotplug.c: check for missing sections in test_pages_in_a_zone()
From: Andrew Banman <[email protected]>
commit 5f0f2887f4de9508dcf438deab28f1de8070c271 upstream.
test_pages_in_a_zone() does not account for the possibility of missing sections in the given pfn range. pfn_valid_within always returns 1 when CONFIG_HOLES_IN_ZONE is not set, allowing invalid pfns from missing sections to pass the test, leading to a kernel oops.
Wrap an additional pfn loop with PAGES_PER_SECTION granularity to check for missing sections before proceeding into the zone-check code.
This also prevents a crash from offlining memory devices with missing sections. Despite this, it may be a good idea to keep the related patch '[PATCH 3/3] drivers: memory: prohibit offlining of memory blocks with missing sections' because missing sections in a memory block may lead to other problems not covered by the scope of this fix.
--- mm/memory_hotplug.c | 31 +++++++++++++++++++------------ 1 file changed, 19 insertions(+), 12 deletions(-)
mm/memory_hotplug.c +19 -12
@@ -1209,23 +1209,30 @@ int is_mem_section_removable(unsigned lo*/ static int test_pages_in_a_zone (unsigned long start_pfn,unsigned long end_pfn) { -unsigned long pfn; +unsigned long pfn, sec_end_pfn;struct zone *zone =NULL ;struct page *page;int i; -for (pfn = start_pfn; +for (pfn = start_pfn, sec_end_pfn =SECTION_ALIGN_UP (start_pfn); pfn < end_pfn; - pfn +=MAX_ORDER_NR_PAGES ) { - i =0 ; -/* This is just a CONFIG_HOLES_IN_ZONE check.*/ -while ((i <MAX_ORDER_NR_PAGES ) && !pfn_valid_within (pfn + i)) - i++; -if (i ==MAX_ORDER_NR_PAGES ) + pfn = sec_end_pfn +1 , sec_end_pfn +=PAGES_PER_SECTION ) { +/* Make sure the memory section is present first */ +if (!present_section_nr (pfn_to_section_nr (pfn)))continue ; - page =pfn_to_page (pfn + i); -if (zone &&page_zone (page) != zone) -return 0 ; - zone =page_zone (page); +for (; pfn < sec_end_pfn && pfn < end_pfn; + pfn +=MAX_ORDER_NR_PAGES ) { + i =0 ; +/* This is just a CONFIG_HOLES_IN_ZONE check.*/ +while ((i <MAX_ORDER_NR_PAGES ) && + !pfn_valid_within (pfn + i)) + i++; +if (i ==MAX_ORDER_NR_PAGES ) +continue ; + page =pfn_to_page (pfn + i); +if (zone &&page_zone (page) != zone) +return 0 ; + zone =page_zone (page); + } }return 1 ; }
Patches currently in stable-queue which might be from [email protected] are
queue-3.10/mm-memory_hotplug.c-check-for-missing-sections-in-test_pages_in_a_zone.patch