x86, mm: introduce vmem_altmap to augment vmemmap_populate()
In support of providing struct page for large persistent memory capacities, use struct vmem_altmap to change the default policy for allocating memory for the memmap array. The default vmemmap_populate() allocates page table storage area from the page allocator. Given persistent memory capacities relative to DRAM it may not be feasible to store the memmap in 'System Memory'. Instead vmem_altmap represents pre-allocated "device pages" to satisfy vmemmap_alloc_block_buf() requests. Signed-off-by: Dan Williams <dan.j.williams@intel.com> Reported-by: kbuild test robot <lkp@intel.com> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: Ingo Molnar <mingo@redhat.com> Cc: "H. Peter Anvin" <hpa@zytor.com> Cc: Dave Hansen <dave.hansen@linux.intel.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:

committed by
Linus Torvalds

parent
9476df7d80
commit
4b94ffdc41
@@ -178,7 +178,8 @@ static struct pmem_device *pmem_alloc(struct device *dev,
|
||||
|
||||
pmem->pfn_flags = PFN_DEV;
|
||||
if (pmem_should_map_pages(dev)) {
|
||||
pmem->virt_addr = (void __pmem *) devm_memremap_pages(dev, res);
|
||||
pmem->virt_addr = (void __pmem *) devm_memremap_pages(dev, res,
|
||||
NULL);
|
||||
pmem->pfn_flags |= PFN_MAP;
|
||||
} else
|
||||
pmem->virt_addr = (void __pmem *) devm_memremap(dev,
|
||||
@@ -387,7 +388,8 @@ static int nvdimm_namespace_attach_pfn(struct nd_namespace_common *ndns)
|
||||
/* establish pfn range for lookup, and switch to direct map */
|
||||
pmem = dev_get_drvdata(dev);
|
||||
devm_memunmap(dev, (void __force *) pmem->virt_addr);
|
||||
pmem->virt_addr = (void __pmem *) devm_memremap_pages(dev, &nsio->res);
|
||||
pmem->virt_addr = (void __pmem *) devm_memremap_pages(dev, &nsio->res,
|
||||
NULL);
|
||||
pmem->pfn_flags |= PFN_MAP;
|
||||
if (IS_ERR(pmem->virt_addr)) {
|
||||
rc = PTR_ERR(pmem->virt_addr);
|
||||
|
Reference in New Issue
Block a user