Commit d760afd4d2570653891f94e13b848e97150dc5a6
Committed by
Linus Torvalds
1 parent
587af308cc
Exists in
master
and in
20 other branches
memory-hotplug: suppress "Trying to free nonexistent resource <XXXXXXXXXXXXXXXX-…
…YYYYYYYYYYYYYYYY>" warning When our x86 box calls __remove_pages(), release_mem_region() shows many warnings. And x86 box cannot unregister iomem_resource. "Trying to free nonexistent resource <XXXXXXXXXXXXXXXX-YYYYYYYYYYYYYYYY>" release_mem_region() has been changed to be called in each PAGES_PER_SECTION by commit de7f0cba9678 ("memory hotplug: release memory regions in PAGES_PER_SECTION chunks"). Because powerpc registers iomem_resource in each PAGES_PER_SECTION chunk. But when I hot add memory on x86 box, iomem_resource is register in each _CRS not PAGES_PER_SECTION chunk. So x86 box unregisters iomem_resource. The patch fixes the problem. Signed-off-by: Yasuaki Ishimatsu <isimatu.yasuaki@jp.fujitsu.com> Cc: David Rientjes <rientjes@google.com> Cc: Jiang Liu <liuj97@gmail.com> Cc: Len Brown <len.brown@intel.com> Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org> Cc: Paul Mackerras <paulus@samba.org> Cc: Christoph Lameter <cl@linux.com> Cc: Minchan Kim <minchan.kim@gmail.com> Cc: Andrew Morton <akpm@linux-foundation.org> Cc: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com> Cc: Wen Congyang <wency@cn.fujitsu.com> Cc: Dave Hansen <dave@linux.vnet.ibm.com> Cc: Nathan Fontenot <nfont@austin.ibm.com> Cc: Badari Pulavarty <pbadari@us.ibm.com> Cc: Yasunori Goto <y-goto@jp.fujitsu.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Showing 2 changed files with 11 additions and 6 deletions Side-by-side Diff
arch/powerpc/platforms/pseries/hotplug-memory.c
... | ... | @@ -77,7 +77,8 @@ |
77 | 77 | { |
78 | 78 | unsigned long start, start_pfn; |
79 | 79 | struct zone *zone; |
80 | - int ret; | |
80 | + int i, ret; | |
81 | + int sections_to_remove; | |
81 | 82 | |
82 | 83 | start_pfn = base >> PAGE_SHIFT; |
83 | 84 | |
... | ... | @@ -97,9 +98,13 @@ |
97 | 98 | * to sysfs "state" file and we can't remove sysfs entries |
98 | 99 | * while writing to it. So we have to defer it to here. |
99 | 100 | */ |
100 | - ret = __remove_pages(zone, start_pfn, memblock_size >> PAGE_SHIFT); | |
101 | - if (ret) | |
102 | - return ret; | |
101 | + sections_to_remove = (memblock_size >> PAGE_SHIFT) / PAGES_PER_SECTION; | |
102 | + for (i = 0; i < sections_to_remove; i++) { | |
103 | + unsigned long pfn = start_pfn + i * PAGES_PER_SECTION; | |
104 | + ret = __remove_pages(zone, start_pfn, PAGES_PER_SECTION); | |
105 | + if (ret) | |
106 | + return ret; | |
107 | + } | |
103 | 108 | |
104 | 109 | /* |
105 | 110 | * Update memory regions for memory remove |
mm/memory_hotplug.c
... | ... | @@ -369,11 +369,11 @@ |
369 | 369 | BUG_ON(phys_start_pfn & ~PAGE_SECTION_MASK); |
370 | 370 | BUG_ON(nr_pages % PAGES_PER_SECTION); |
371 | 371 | |
372 | + release_mem_region(phys_start_pfn << PAGE_SHIFT, nr_pages * PAGE_SIZE); | |
373 | + | |
372 | 374 | sections_to_remove = nr_pages / PAGES_PER_SECTION; |
373 | 375 | for (i = 0; i < sections_to_remove; i++) { |
374 | 376 | unsigned long pfn = phys_start_pfn + i*PAGES_PER_SECTION; |
375 | - release_mem_region(pfn << PAGE_SHIFT, | |
376 | - PAGES_PER_SECTION << PAGE_SHIFT); | |
377 | 377 | ret = __remove_section(zone, __pfn_to_section(pfn)); |
378 | 378 | if (ret) |
379 | 379 | break; |