Message ID | 20160301025626.12812.4840.stgit@dwillia2-desk3.amr.corp.intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Hi Dan, [auto build test WARNING on v4.5-rc6] [also build test WARNING on next-20160229] [cannot apply to linux-nvdimm/libnvdimm-for-next] [if your patch is applied to the wrong git tree, please drop us a note to help improving the system] url: https://github.com/0day-ci/linux/commits/Dan-Williams/devm_memremap_pages-vs-section-misaligned-pmem/20160301-105936 config: i386-randconfig-x007-201609 (attached as .config) reproduce: # save the attached .config to linux build tree make ARCH=i386 All warnings (new ones prefixed by >>): drivers/nvdimm/pmem.c: In function 'init_altmap_reserve': >> drivers/nvdimm/pmem.c:375:16: warning: unused variable 'base_pfn' [-Wunused-variable] unsigned long base_pfn = __phys_to_pfn(base); ^ vim +/base_pfn +375 drivers/nvdimm/pmem.c 359 /* 360 * We hotplug memory at section granularity, pad the reserved area from 361 * the previous section base to the namespace base address. 362 */ 363 static unsigned long init_altmap_base(resource_size_t base) 364 { 365 unsigned long base_pfn = __phys_to_pfn(base); 366 367 #ifdef CONFIG_SPARSEMEM 368 base_pfn = SECTION_ALIGN_DOWN(base_pfn); 369 #endif 370 return base_pfn; 371 } 372 373 static unsigned long init_altmap_reserve(resource_size_t base) 374 { > 375 unsigned long base_pfn = __phys_to_pfn(base); 376 unsigned long reserve = __phys_to_pfn(SZ_8K); 377 378 #ifdef CONFIG_SPARSEMEM 379 reserve += base_pfn - SECTION_ALIGN_DOWN(base_pfn); 380 #endif 381 return reserve; 382 } 383 --- 0-DAY kernel test infrastructure Open Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation
diff --git a/drivers/nvdimm/pmem.c b/drivers/nvdimm/pmem.c index efc2a5e671c6..6a6283ab974c 100644 --- a/drivers/nvdimm/pmem.c +++ b/drivers/nvdimm/pmem.c @@ -356,6 +356,31 @@ static int nvdimm_namespace_detach_pfn(struct nd_namespace_common *ndns) return 0; } +/* + * We hotplug memory at section granularity, pad the reserved area from + * the previous section base to the namespace base address. + */ +static unsigned long init_altmap_base(resource_size_t base) +{ + unsigned long base_pfn = __phys_to_pfn(base); + +#ifdef CONFIG_SPARSEMEM + base_pfn = SECTION_ALIGN_DOWN(base_pfn); +#endif + return base_pfn; +} + +static unsigned long init_altmap_reserve(resource_size_t base) +{ + unsigned long base_pfn = __phys_to_pfn(base); + unsigned long reserve = __phys_to_pfn(SZ_8K); + +#ifdef CONFIG_SPARSEMEM + reserve += base_pfn - SECTION_ALIGN_DOWN(base_pfn); +#endif + return reserve; +} + static int nvdimm_namespace_attach_pfn(struct nd_namespace_common *ndns) { struct nd_namespace_io *nsio = to_nd_namespace_io(&ndns->dev); @@ -369,8 +394,8 @@ static int nvdimm_namespace_attach_pfn(struct nd_namespace_common *ndns) phys_addr_t offset; int rc; struct vmem_altmap __altmap = { - .base_pfn = __phys_to_pfn(nsio->res.start), - .reserve = __phys_to_pfn(SZ_8K), + .base_pfn = init_altmap_base(nsio->res.start), + .reserve = init_altmap_reserve(nsio->res.start), }; if (!nd_pfn->uuid || !nd_pfn->ndns)
The altmap for a section-misaligned namespace needs to arrange for the base_pfn to be section-aligned. As a result the 'reserve' region (pfns from base that do not have a struct page) must be increased. Otherwise we trip the altmap validation check in __add_pages: if (altmap->base_pfn != phys_start_pfn || vmem_altmap_offset(altmap) > nr_pages) { pr_warn_once("memory add fail, invalid altmap\n"); return -EINVAL; } Signed-off-by: Dan Williams <dan.j.williams@intel.com> --- drivers/nvdimm/pmem.c | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-)