Skip to content

Commit bfb3452

Browse files
committed
libnvdimm, pfn: fix memmap reservation size versus 4K alignment
When vmemmap_populate() allocates space for the memmap it does so in 2MB sized chunks. The libnvdimm-pfn driver incorrectly accounts for this when the alignment of the device is set to 4K. When this happens we trigger memory allocation failures in altmap_alloc_block_buf() and trigger warnings of the form: WARNING: CPU: 0 PID: 3376 at arch/x86/mm/init_64.c:656 arch_add_memory+0xe4/0xf0 [..] Call Trace: dump_stack+0x86/0xc3 __warn+0xcb/0xf0 warn_slowpath_null+0x1d/0x20 arch_add_memory+0xe4/0xf0 devm_memremap_pages+0x29b/0x4e0 Fixes: 315c562 ("libnvdimm, pfn: add 'align' attribute, default to HPAGE_SIZE") Cc: <[email protected]> Signed-off-by: Dan Williams <[email protected]>
1 parent e471486 commit bfb3452

File tree

1 file changed

+2
-5
lines changed

1 file changed

+2
-5
lines changed

drivers/nvdimm/pfn_devs.c

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -627,15 +627,12 @@ static int nd_pfn_init(struct nd_pfn *nd_pfn)
627627
size = resource_size(&nsio->res);
628628
npfns = (size - start_pad - end_trunc - SZ_8K) / SZ_4K;
629629
if (nd_pfn->mode == PFN_MODE_PMEM) {
630-
unsigned long memmap_size;
631-
632630
/*
633631
* vmemmap_populate_hugepages() allocates the memmap array in
634632
* HPAGE_SIZE chunks.
635633
*/
636-
memmap_size = ALIGN(64 * npfns, HPAGE_SIZE);
637-
offset = ALIGN(start + SZ_8K + memmap_size + dax_label_reserve,
638-
nd_pfn->align) - start;
634+
offset = ALIGN(start + SZ_8K + 64 * npfns + dax_label_reserve,
635+
max(nd_pfn->align, HPAGE_SIZE)) - start;
639636
} else if (nd_pfn->mode == PFN_MODE_RAM)
640637
offset = ALIGN(start + SZ_8K + dax_label_reserve,
641638
nd_pfn->align) - start;

0 commit comments

Comments
 (0)