* [PATCH 0/3] libnvdimm: fix memmap in pmem support
@ 2016-01-30 18:42 Dan Williams
2016-01-30 18:42 ` [PATCH 1/3] libnvdimm: fix mode determination for e820 devices Dan Williams
` (2 more replies)
0 siblings, 3 replies; 4+ messages in thread
From: Dan Williams @ 2016-01-30 18:42 UTC (permalink / raw)
To: linux-nvdimm; +Cc: Andrew Morton, Jeff Moyer, linux-kernel
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(-)
^ permalink raw reply [flat|nested] 4+ messages in thread* [PATCH 1/3] libnvdimm: fix mode determination for e820 devices 2016-01-30 18:42 [PATCH 0/3] libnvdimm: fix memmap in pmem support Dan Williams @ 2016-01-30 18:42 ` Dan Williams 2016-01-30 18:42 ` [PATCH 2/3] libnvdimm, pfn: fix restoring memmap location Dan Williams 2016-01-30 18:42 ` [PATCH 3/3] devm_memremap_pages: fix vmem_altmap lifetime + alignment handling Dan Williams 2 siblings, 0 replies; 4+ messages in thread From: Dan Williams @ 2016-01-30 18:42 UTC (permalink / raw) To: linux-nvdimm; +Cc: linux-kernel 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); ^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH 2/3] libnvdimm, pfn: fix restoring memmap location 2016-01-30 18:42 [PATCH 0/3] libnvdimm: fix memmap in pmem support Dan Williams 2016-01-30 18:42 ` [PATCH 1/3] libnvdimm: fix mode determination for e820 devices Dan Williams @ 2016-01-30 18:42 ` Dan Williams 2016-01-30 18:42 ` [PATCH 3/3] devm_memremap_pages: fix vmem_altmap lifetime + alignment handling Dan Williams 2 siblings, 0 replies; 4+ messages in thread From: Dan Williams @ 2016-01-30 18:42 UTC (permalink / raw) To: linux-nvdimm; +Cc: Jeff Moyer, linux-kernel 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; } ^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH 3/3] devm_memremap_pages: fix vmem_altmap lifetime + alignment handling 2016-01-30 18:42 [PATCH 0/3] libnvdimm: fix memmap in pmem support Dan Williams 2016-01-30 18:42 ` [PATCH 1/3] libnvdimm: fix mode determination for e820 devices Dan Williams 2016-01-30 18:42 ` [PATCH 2/3] libnvdimm, pfn: fix restoring memmap location Dan Williams @ 2016-01-30 18:42 ` Dan Williams 2 siblings, 0 replies; 4+ messages in thread From: Dan Williams @ 2016-01-30 18:42 UTC (permalink / raw) To: linux-nvdimm; +Cc: Andrew Morton, Jeff Moyer, linux-kernel 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; ^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2016-01-30 18:42 UTC | newest] Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2016-01-30 18:42 [PATCH 0/3] libnvdimm: fix memmap in pmem support Dan Williams 2016-01-30 18:42 ` [PATCH 1/3] libnvdimm: fix mode determination for e820 devices Dan Williams 2016-01-30 18:42 ` [PATCH 2/3] libnvdimm, pfn: fix restoring memmap location Dan Williams 2016-01-30 18:42 ` [PATCH 3/3] devm_memremap_pages: fix vmem_altmap lifetime + alignment handling Dan Williams
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®