|
@@ -399,7 +399,8 @@ static int __ref get_nid_for_pfn(unsigned long pfn)
|
|
|
}
|
|
|
|
|
|
/* register memory section under specified node if it spans that node */
|
|
|
-int register_mem_sect_under_node(struct memory_block *mem_blk, int nid)
|
|
|
+int register_mem_sect_under_node(struct memory_block *mem_blk, int nid,
|
|
|
+ bool check_nid)
|
|
|
{
|
|
|
int ret;
|
|
|
unsigned long pfn, sect_start_pfn, sect_end_pfn;
|
|
@@ -425,11 +426,18 @@ int register_mem_sect_under_node(struct memory_block *mem_blk, int nid)
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
- page_nid = get_nid_for_pfn(pfn);
|
|
|
- if (page_nid < 0)
|
|
|
- continue;
|
|
|
- if (page_nid != nid)
|
|
|
- continue;
|
|
|
+ /*
|
|
|
+ * We need to check if page belongs to nid only for the boot
|
|
|
+ * case, during hotplug we know that all pages in the memory
|
|
|
+ * block belong to the same node.
|
|
|
+ */
|
|
|
+ if (check_nid) {
|
|
|
+ page_nid = get_nid_for_pfn(pfn);
|
|
|
+ if (page_nid < 0)
|
|
|
+ continue;
|
|
|
+ if (page_nid != nid)
|
|
|
+ continue;
|
|
|
+ }
|
|
|
ret = sysfs_create_link_nowarn(&node_devices[nid]->dev.kobj,
|
|
|
&mem_blk->dev.kobj,
|
|
|
kobject_name(&mem_blk->dev.kobj));
|
|
@@ -504,7 +512,7 @@ int link_mem_sections(int nid, unsigned long start_pfn, unsigned long nr_pages)
|
|
|
|
|
|
mem_blk = find_memory_block_hinted(mem_sect, mem_blk);
|
|
|
|
|
|
- ret = register_mem_sect_under_node(mem_blk, nid);
|
|
|
+ ret = register_mem_sect_under_node(mem_blk, nid, true);
|
|
|
if (!err)
|
|
|
err = ret;
|
|
|
|