int __meminit arch_remove_memory(int nid, u64 start, u64 size, struct vmem_altmap *altmap) { unsigned long start_pfn = start >> PAGE_SHIFT; unsigned long nr_pages = size >> PAGE_SHIFT; struct page *page; int ret; /* * If we have an altmap then we need to skip over any reserved PFNs * when querying the zone. */ page = pfn_to_page(start_pfn); if (altmap) page += vmem_altmap_offset(altmap); ret = __remove_pages(page_zone(page), start_pfn, nr_pages, altmap); if (ret) return ret; /* Remove htab bolted mappings for this section of memory */ start = (unsigned long)__va(start); flush_inval_dcache_range(start, start + size); ret = remove_section_mapping(start, start + size); /* Ensure all vmalloc mappings are flushed in case they also * hit that section of memory */ vm_unmap_aliases(); resize_hpt_for_hotplug(memblock_phys_mem_size()); return ret; }
static unsigned long pfn_first(struct page_map *page_map) { struct dev_pagemap *pgmap = &page_map->pgmap; const struct resource *res = &page_map->res; struct vmem_altmap *altmap = pgmap->altmap; unsigned long pfn; pfn = res->start >> PAGE_SHIFT; if (altmap) pfn += vmem_altmap_offset(altmap); return pfn; }