Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1322488 > unrolled thread

[PATCH 0/3] libnvdimm: fix memmap in pmem support

Started byDan Williams <dan.j.williams@intel.com>
First post2016-01-30 19:50 +0100
Last post2016-01-30 19:50 +0100
Articles 4 — 1 participant

Back to article view | Back to linux.kernel


Contents

  [PATCH 0/3] libnvdimm: fix memmap in pmem support Dan Williams <dan.j.williams@intel.com> - 2016-01-30 19:50 +0100
    [PATCH 2/3] libnvdimm, pfn: fix restoring memmap location Dan Williams <dan.j.williams@intel.com> - 2016-01-30 19:50 +0100
    [PATCH 1/3] libnvdimm: fix mode determination for e820 devices Dan Williams <dan.j.williams@intel.com> - 2016-01-30 19:50 +0100
    [PATCH 3/3] devm_memremap_pages: fix vmem_altmap lifetime +  alignment handling Dan Williams <dan.j.williams@intel.com> - 2016-01-30 19:50 +0100

#1322488 — [PATCH 0/3] libnvdimm: fix memmap in pmem support

FromDan Williams <dan.j.williams@intel.com>
Date2016-01-30 19:50 +0100
Subject[PATCH 0/3] libnvdimm: fix memmap in pmem support
Message-ID<qWIKR-81s-3@gated-at.bofh.it>
Thanks to Jeff for pointing out a thinko in the ndctl implementation of
create-namespace.  That bug was covering up the fact that vmem_altmap
handling broke when 'pgmap_radix' was introduced to replace the list
based method [1].

The other two fixes fell out from further expanding the unit tests.

[1]: https://lists.01.org/pipermail/linux-nvdimm/2015-December/003608.html

---

Dan Williams (3):
      libnvdimm: fix mode determination for e820 devices
      libnvdimm, pfn: fix restoring memmap location
      devm_memremap_pages: fix vmem_altmap lifetime + alignment handling


 drivers/nvdimm/namespace_devs.c |    8 +++++---
 drivers/nvdimm/pfn_devs.c       |    4 +---
 kernel/memremap.c               |   18 +++++++++++-------
 3 files changed, 17 insertions(+), 13 deletions(-)

[toc] | [next] | [standalone]


#1322491 — [PATCH 2/3] libnvdimm, pfn: fix restoring memmap location

FromDan Williams <dan.j.williams@intel.com>
Date2016-01-30 19:50 +0100
Subject[PATCH 2/3] libnvdimm, pfn: fix restoring memmap location
Message-ID<qWIKS-81s-15@gated-at.bofh.it>
In reply to#1322488
This path was missed when turning on the memmap in pmem support.  Permit
'pmem' as a valid location for the map.

Reported-by: Jeff Moyer <jmoyer@redhat.com>
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
---
 drivers/nvdimm/pfn_devs.c |    4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/drivers/nvdimm/pfn_devs.c b/drivers/nvdimm/pfn_devs.c
index 0cc9048b86e2..ae81a2f1da50 100644
--- a/drivers/nvdimm/pfn_devs.c
+++ b/drivers/nvdimm/pfn_devs.c
@@ -301,10 +301,8 @@ int nd_pfn_validate(struct nd_pfn *nd_pfn)
 
 	switch (le32_to_cpu(pfn_sb->mode)) {
 	case PFN_MODE_RAM:
-		break;
 	case PFN_MODE_PMEM:
-		/* TODO: allocate from PMEM support */
-		return -ENOTTY;
+		break;
 	default:
 		return -ENXIO;
 	}

[toc] | [prev] | [next] | [standalone]


#1322492 — [PATCH 1/3] libnvdimm: fix mode determination for e820 devices

FromDan Williams <dan.j.williams@intel.com>
Date2016-01-30 19:50 +0100
Subject[PATCH 1/3] libnvdimm: fix mode determination for e820 devices
Message-ID<qWIKR-81s-7@gated-at.bofh.it>
In reply to#1322488
Correctly display "safe" mode when a btt is established on a e820/memmap
defined pmem namespace.

Signed-off-by: Dan Williams <dan.j.williams@intel.com>
---
 drivers/nvdimm/namespace_devs.c |    8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/drivers/nvdimm/namespace_devs.c b/drivers/nvdimm/namespace_devs.c
index 8ebfcaae3f5a..9edf7eb7d17c 100644
--- a/drivers/nvdimm/namespace_devs.c
+++ b/drivers/nvdimm/namespace_devs.c
@@ -1277,10 +1277,12 @@ static ssize_t mode_show(struct device *dev,
 
 	device_lock(dev);
 	claim = ndns->claim;
-	if (pmem_should_map_pages(dev) || (claim && is_nd_pfn(claim)))
-		mode = "memory";
-	else if (claim && is_nd_btt(claim))
+	if (claim && is_nd_btt(claim))
 		mode = "safe";
+	else if (claim && is_nd_pfn(claim))
+		mode = "memory";
+	else if (!claim && pmem_should_map_pages(dev))
+		mode = "memory";
 	else
 		mode = "raw";
 	rc = sprintf(buf, "%s\n", mode);

[toc] | [prev] | [next] | [standalone]


#1322493 — [PATCH 3/3] devm_memremap_pages: fix vmem_altmap lifetime + alignment handling

FromDan Williams <dan.j.williams@intel.com>
Date2016-01-30 19:50 +0100
Subject[PATCH 3/3] devm_memremap_pages: fix vmem_altmap lifetime + alignment handling
Message-ID<qWIKS-81s-17@gated-at.bofh.it>
In reply to#1322488
to_vmem_altmap() needs to return valid results until
arch_remove_memory() completes.  It also needs to be valid for any pfn
in a section regardless of whether that pfn maps to data.  This escape
was a result of a bug in the unit test.

The signature of this bug is that free_pagetable() fails to retrieve a
vmem_altmap and goes off into the weeds:

 BUG: unable to handle kernel NULL pointer dereference at           (null)
 IP: [<ffffffff811d2629>] get_pfnblock_flags_mask+0x49/0x60
 [..]
 Call Trace:
  [<ffffffff811d3477>] free_hot_cold_page+0x97/0x1d0
  [<ffffffff811d367a>] __free_pages+0x2a/0x40
  [<ffffffff8191e669>] free_pagetable+0x8c/0xd4
  [<ffffffff8191ef4e>] remove_pagetable+0x37a/0x808
  [<ffffffff8191b210>] vmemmap_free+0x10/0x20

Fixes: 4b94ffdc4163 ("x86, mm: introduce vmem_altmap to augment vmemmap_populate()")
Cc: Andrew Morton <akpm@linux-foundation.org>
Reported-by: Jeff Moyer <jmoyer@redhat.com>
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
---
 kernel/memremap.c |   18 +++++++++++-------
 1 file changed, 11 insertions(+), 7 deletions(-)

diff --git a/kernel/memremap.c b/kernel/memremap.c
index e517a16cb426..cbc3e97e2bb4 100644
--- a/kernel/memremap.c
+++ b/kernel/memremap.c
@@ -183,7 +183,11 @@ EXPORT_SYMBOL(put_zone_device_page);
 
 static void pgmap_radix_release(struct resource *res)
 {
-	resource_size_t key;
+	resource_size_t key, align_start, align_size, align_end;
+
+	align_start = res->start & ~(SECTION_SIZE - 1);
+	align_size = ALIGN(resource_size(res), SECTION_SIZE);
+	align_end = align_start + align_size - 1;
 
 	mutex_lock(&pgmap_lock);
 	for (key = res->start; key <= res->end; key += SECTION_SIZE)
@@ -226,12 +230,11 @@ static void devm_memremap_pages_release(struct device *dev, void *data)
 		percpu_ref_put(pgmap->ref);
 	}
 
-	pgmap_radix_release(res);
-
 	/* pages are dead and unused, undo the arch mapping */
 	align_start = res->start & ~(SECTION_SIZE - 1);
 	align_size = ALIGN(resource_size(res), SECTION_SIZE);
 	arch_remove_memory(align_start, align_size);
+	pgmap_radix_release(res);
 	dev_WARN_ONCE(dev, pgmap->altmap && pgmap->altmap->alloc,
 			"%s: failed to free all reserved pages\n", __func__);
 }
@@ -267,7 +270,7 @@ void *devm_memremap_pages(struct device *dev, struct resource *res,
 {
 	int is_ram = region_intersects(res->start, resource_size(res),
 			"System RAM");
-	resource_size_t key, align_start, align_size;
+	resource_size_t key, align_start, align_size, align_end;
 	struct dev_pagemap *pgmap;
 	struct page_map *page_map;
 	unsigned long pfn;
@@ -309,7 +312,10 @@ void *devm_memremap_pages(struct device *dev, struct resource *res,
 
 	mutex_lock(&pgmap_lock);
 	error = 0;
-	for (key = res->start; key <= res->end; key += SECTION_SIZE) {
+	align_start = res->start & ~(SECTION_SIZE - 1);
+	align_size = ALIGN(resource_size(res), SECTION_SIZE);
+	align_end = align_start + align_size - 1;
+	for (key = align_start; key <= align_end; key += SECTION_SIZE) {
 		struct dev_pagemap *dup;
 
 		rcu_read_lock();
@@ -336,8 +342,6 @@ void *devm_memremap_pages(struct device *dev, struct resource *res,
 	if (nid < 0)
 		nid = numa_mem_id();
 
-	align_start = res->start & ~(SECTION_SIZE - 1);
-	align_size = ALIGN(resource_size(res), SECTION_SIZE);
 	error = arch_add_memory(nid, align_start, align_size, true);
 	if (error)
 		goto err_add_memory;

[toc] | [prev] | [standalone]


Back to top | Article view | linux.kernel


csiph-web