diff mbox

mm: use early_pfn_to_nid in register_page_bootmem_info_node

Message ID 1464210007-30930-1-git-send-email-yang.shi@linaro.org
State Accepted
Commit f65e91df25aa426289cbcb580ca3183e24979fb1
Headers show

Commit Message

Yang Shi May 25, 2016, 9 p.m. UTC
register_page_bootmem_info_node() is invoked in mem_init(), so it will be
called before page_alloc_init_late() if CONFIG_DEFERRED_STRUCT_PAGE_INIT
is enabled. But, pfn_to_nid() depends on memmap which won't be fully setup
until page_alloc_init_late() is done, so replace pfn_to_nid() by
early_pfn_to_nid().

Signed-off-by: Yang Shi <yang.shi@linaro.org>

---
 mm/memory_hotplug.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

-- 
2.0.2

Comments

Yang Shi May 25, 2016, 10:36 p.m. UTC | #1
On 5/25/2016 3:23 PM, Andrew Morton wrote:
> On Wed, 25 May 2016 14:00:07 -0700 Yang Shi <yang.shi@linaro.org> wrote:

>

>> register_page_bootmem_info_node() is invoked in mem_init(), so it will be

>> called before page_alloc_init_late() if CONFIG_DEFERRED_STRUCT_PAGE_INIT

>> is enabled. But, pfn_to_nid() depends on memmap which won't be fully setup

>> until page_alloc_init_late() is done, so replace pfn_to_nid() by

>> early_pfn_to_nid().

>

> What are the runtime effects of this fix?


I didn't experience any problem without the fix. During working on the 
page_ext_init() fix (replace to early_pfn_to_nid()), I added printk 
before each pfn_to_nid() calls to check which one might be called before 
page_alloc_init_late(), then this one is caught.

 From the code perspective, it sounds not right since 
register_page_bootmem_info_section() may miss some pfns when 
CONFIG_DEFERRED_STRUCT_PAGE_INIT is enabled, just like the problem 
happened in page_ext_init().

Thanks,
Yang


>
diff mbox

Patch

diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c
index caf2a14..b8ee080 100644
--- a/mm/memory_hotplug.c
+++ b/mm/memory_hotplug.c
@@ -300,7 +300,7 @@  void register_page_bootmem_info_node(struct pglist_data *pgdat)
 		 * multiple nodes we check that this pfn does not already
 		 * reside in some other nodes.
 		 */
-		if (pfn_valid(pfn) && (pfn_to_nid(pfn) == node))
+		if (pfn_valid(pfn) && (early_pfn_to_nid(pfn) == node))
 			register_page_bootmem_info_section(pfn);
 	}
 }