diff mbox

[1/2] libnvdimm, pmem: fix 'pfn' support for section-misaligned namespaces

Message ID 20160301025626.12812.4840.stgit@dwillia2-desk3.amr.corp.intel.com (mailing list archive)
State New, archived
Headers show

Commit Message

Dan Williams March 1, 2016, 2:56 a.m. UTC
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(-)

Comments

kernel test robot March 1, 2016, 3:16 a.m. UTC | #1
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 mbox

Patch

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)