diff options
Diffstat (limited to 'drivers/base/memory.c')
| -rw-r--r-- | drivers/base/memory.c | 23 | 
1 files changed, 22 insertions, 1 deletions
diff --git a/drivers/base/memory.c b/drivers/base/memory.c index 14f964a7719b..c0436f46cfb7 100644 --- a/drivers/base/memory.c +++ b/drivers/base/memory.c @@ -188,6 +188,7 @@ static int memory_block_online(struct memory_block *mem)  	unsigned long start_pfn = section_nr_to_pfn(mem->start_section_nr);  	unsigned long nr_pages = PAGES_PER_SECTION * sections_per_block;  	unsigned long nr_vmemmap_pages = 0; +	struct memory_notify arg;  	struct zone *zone;  	int ret; @@ -207,9 +208,19 @@ static int memory_block_online(struct memory_block *mem)  	if (mem->altmap)  		nr_vmemmap_pages = mem->altmap->free; +	arg.altmap_start_pfn = start_pfn; +	arg.altmap_nr_pages = nr_vmemmap_pages; +	arg.start_pfn = start_pfn + nr_vmemmap_pages; +	arg.nr_pages = nr_pages - nr_vmemmap_pages;  	mem_hotplug_begin(); +	ret = memory_notify(MEM_PREPARE_ONLINE, &arg); +	ret = notifier_to_errno(ret); +	if (ret) +		goto out_notifier; +  	if (nr_vmemmap_pages) { -		ret = mhp_init_memmap_on_memory(start_pfn, nr_vmemmap_pages, zone); +		ret = mhp_init_memmap_on_memory(start_pfn, nr_vmemmap_pages, +						zone, mem->altmap->inaccessible);  		if (ret)  			goto out;  	} @@ -231,7 +242,11 @@ static int memory_block_online(struct memory_block *mem)  					  nr_vmemmap_pages);  	mem->zone = zone; +	mem_hotplug_done(); +	return ret;  out: +	memory_notify(MEM_FINISH_OFFLINE, &arg); +out_notifier:  	mem_hotplug_done();  	return ret;  } @@ -244,6 +259,7 @@ static int memory_block_offline(struct memory_block *mem)  	unsigned long start_pfn = section_nr_to_pfn(mem->start_section_nr);  	unsigned long nr_pages = PAGES_PER_SECTION * sections_per_block;  	unsigned long nr_vmemmap_pages = 0; +	struct memory_notify arg;  	int ret;  	if (!mem->zone) @@ -275,6 +291,11 @@ static int memory_block_offline(struct memory_block *mem)  		mhp_deinit_memmap_on_memory(start_pfn, nr_vmemmap_pages);  	mem->zone = NULL; +	arg.altmap_start_pfn = start_pfn; +	arg.altmap_nr_pages = nr_vmemmap_pages; +	arg.start_pfn = start_pfn + nr_vmemmap_pages; +	arg.nr_pages = nr_pages - nr_vmemmap_pages; +	memory_notify(MEM_FINISH_OFFLINE, &arg);  out:  	mem_hotplug_done();  	return ret;  | 
