diff options
-rw-r--r-- | mm/memremap.c | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/mm/memremap.c b/mm/memremap.c index 68204912cc0a..03ccbdfeb697 100644 --- a/mm/memremap.c +++ b/mm/memremap.c | |||
@@ -103,6 +103,7 @@ static void dev_pagemap_cleanup(struct dev_pagemap *pgmap) | |||
103 | void memunmap_pages(struct dev_pagemap *pgmap) | 103 | void memunmap_pages(struct dev_pagemap *pgmap) |
104 | { | 104 | { |
105 | struct resource *res = &pgmap->res; | 105 | struct resource *res = &pgmap->res; |
106 | struct page *first_page; | ||
106 | unsigned long pfn; | 107 | unsigned long pfn; |
107 | int nid; | 108 | int nid; |
108 | 109 | ||
@@ -111,14 +112,16 @@ void memunmap_pages(struct dev_pagemap *pgmap) | |||
111 | put_page(pfn_to_page(pfn)); | 112 | put_page(pfn_to_page(pfn)); |
112 | dev_pagemap_cleanup(pgmap); | 113 | dev_pagemap_cleanup(pgmap); |
113 | 114 | ||
115 | /* make sure to access a memmap that was actually initialized */ | ||
116 | first_page = pfn_to_page(pfn_first(pgmap)); | ||
117 | |||
114 | /* pages are dead and unused, undo the arch mapping */ | 118 | /* pages are dead and unused, undo the arch mapping */ |
115 | nid = page_to_nid(pfn_to_page(PHYS_PFN(res->start))); | 119 | nid = page_to_nid(first_page); |
116 | 120 | ||
117 | mem_hotplug_begin(); | 121 | mem_hotplug_begin(); |
118 | if (pgmap->type == MEMORY_DEVICE_PRIVATE) { | 122 | if (pgmap->type == MEMORY_DEVICE_PRIVATE) { |
119 | pfn = PHYS_PFN(res->start); | 123 | __remove_pages(page_zone(first_page), PHYS_PFN(res->start), |
120 | __remove_pages(page_zone(pfn_to_page(pfn)), pfn, | 124 | PHYS_PFN(resource_size(res)), NULL); |
121 | PHYS_PFN(resource_size(res)), NULL); | ||
122 | } else { | 125 | } else { |
123 | arch_remove_memory(nid, res->start, resource_size(res), | 126 | arch_remove_memory(nid, res->start, resource_size(res), |
124 | pgmap_altmap(pgmap)); | 127 | pgmap_altmap(pgmap)); |