* [PATCH v2] dax/pmem: fix unaligned compound devmap initialization
@ 2026-11-07 3:01 Muchun Song
2026-11-09 1:57 ` Ritesh Harjani
0 siblings, 1 reply; 2+ messages in thread
From: Muchun Song @ 2026-11-07 3:01 UTC (permalink / raw)
To: Dan Williams, Vishal Verma, Dave Jiang, Alison Schofield
Cc: Andrew Morton, Joao Martins, Ritesh Harjani, Pavithra Prakash,
Muchun Song, stable, nvdimm, linux-cxl, linux-kernel,
Muchun Song
Static pmem Device DAX namespaces reserve space for namespace metadata
before the user-visible data range, and may also include padding needed
to satisfy the Device DAX alignment. __dax_pmem_probe() adjusts the
dax_region range to start at the data range, but the dev_pagemap range
still starts at the beginning of the namespace.
That is not valid for compound devmap mappings whose memmap is stored in
system RAM. Compound page initialization requires the start PFN to be
naturally aligned to the compound page size, because the head and tail
struct pages are initialized according to that geometry. If the pgmap
starts before the aligned data range, memmap_init_zone_device() can build
compound page metadata from an unaligned PFN.
The resulting struct page layout is inconsistent with the Device DAX
mapping. A later mmap fault can then resolve the user-visible PFN through
invalid compound page metadata and hit a kernel panic while inserting the
DAX folio.
Fix this by rounding the pgmap start up to the Device DAX alignment for
non-altmap mappings. This gives compound mappings the required naturally
aligned start while retaining full-section vmemmap savings when the
original start is already aligned. The altmap path remains unchanged
because memmap_init_zone_device() skips the altmap reservation itself.
Fixes: 14606001efb4 ("device-dax: compound devmap support")
Cc: <stable@vger.kernel.org>
Signed-off-by: Muchun Song <songmuchun@bytedance.com>
Reported-by: Ritesh Harjani (IBM) <ritesh.list@gmail.com>
Closes: https://lore.kernel.org/r/wlrkqqvg.ritesh.list@gmail.com
---
v2:
- Round the pgmap start up to the Device DAX alignment to retain
full-section vmemmap savings (suggested by Alison Schofield)
- Update the commit message to describe the alignment approach
v1: https://lore.kernel.org/20261016054914.2601510-1-songmuchun@bytedance.com/
---
drivers/dax/pmem.c | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/drivers/dax/pmem.c b/drivers/dax/pmem.c
index bee93066a849..d54d23f1cc58 100644
--- a/drivers/dax/pmem.c
+++ b/drivers/dax/pmem.c
@@ -51,6 +51,12 @@ static struct dev_dax *__dax_pmem_probe(struct device *dev)
/* adjust the dax_region range to the start of data */
range = pgmap.range;
range.start += offset;
+ /*
+ * When the memmap is stored in RAM, compound page initialization
+ * must start at a naturally aligned address.
+ */
+ if (!pgmap_altmap(&pgmap))
+ pgmap.range.start = ALIGN(pgmap.range.start, nd_pfn->align);
dax_region = alloc_dax_region(dev, region_id, &range,
nd_region->target_node, le32_to_cpu(pfn_sb->align),
IORESOURCE_DAX_STATIC);
base-commit: a91337fb5e8e0127c8b5be87be9f3027f95b48bc
--
2.54.0
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: [PATCH v2] dax/pmem: fix unaligned compound devmap initialization
2026-11-07 3:01 [PATCH v2] dax/pmem: fix unaligned compound devmap initialization Muchun Song
@ 2026-11-09 1:57 ` Ritesh Harjani
0 siblings, 0 replies; 2+ messages in thread
From: Ritesh Harjani @ 2026-11-09 1:57 UTC (permalink / raw)
To: Muchun Song, Dan Williams, Vishal Verma, Dave Jiang, Alison Schofield
Cc: Andrew Morton, Joao Martins, Pavithra Prakash, Muchun Song,
stable, nvdimm, linux-cxl, linux-kernel, Muchun Song,
linuxppc-dev
Muchun Song <songmuchun@bytedance.com> writes:
> Static pmem Device DAX namespaces reserve space for namespace metadata
> before the user-visible data range, and may also include padding needed
> to satisfy the Device DAX alignment. __dax_pmem_probe() adjusts the
> dax_region range to start at the data range, but the dev_pagemap range
> still starts at the beginning of the namespace.
>
> That is not valid for compound devmap mappings whose memmap is stored in
> system RAM. Compound page initialization requires the start PFN to be
> naturally aligned to the compound page size, because the head and tail
> struct pages are initialized according to that geometry. If the pgmap
> starts before the aligned data range, memmap_init_zone_device() can build
> compound page metadata from an unaligned PFN.
>
> The resulting struct page layout is inconsistent with the Device DAX
> mapping. A later mmap fault can then resolve the user-visible PFN through
> invalid compound page metadata and hit a kernel panic while inserting the
> DAX folio.
>
> Fix this by rounding the pgmap start up to the Device DAX alignment for
> non-altmap mappings. This gives compound mappings the required naturally
> aligned start while retaining full-section vmemmap savings when the
> original start is already aligned. The altmap path remains unchanged
> because memmap_init_zone_device() skips the altmap reservation itself.
>
> Fixes: 14606001efb4 ("device-dax: compound devmap support")
> Cc: <stable@vger.kernel.org>
> Signed-off-by: Muchun Song <songmuchun@bytedance.com>
> Reported-by: Ritesh Harjani (IBM) <ritesh.list@gmail.com>
> Closes: https://lore.kernel.org/r/wlrkqqvg.ritesh.list@gmail.com
Tested v2 also on my Power dev test setup. With this patch the reported
problem is fixed. I am no more hitting the following warning and crash:
[ 3.071811][ T1] WARNING: mm/mm_init.c:1175 at memmap_init_zone_device+0x144/0x470, CPU#0: swapper/0/1
[ 3.082276][ T1] NIP [c000000000596604] memmap_init_zone_device+0x144/0x470
[ 3.082763][ T1] LR [c0000000006d72b8] memremap_pages+0x3b0/0x974
[ 3.083345][ T1] Call Trace:
[ 3.083629][ T1] [c000000006d86e00] [c000000006d86e40] 0xc000000006d86e40 (unreliable)
[ 3.084975][ T1] [c000000006d86f10] [c0000000006d72b8] memremap_pages+0x3b0/0x974
[ 3.085449][ T1] [c000000006d86fe0] [c0000000006d78b8] devm_memremap_pages+0x3c/0xa4
[ 3.085891][ T1] [c000000006d87020] [c00000000125c084] dev_dax_probe+0x264/0x3d0
[ 3.086339][ T1] [c000000006d870c0] [c000000001259a28] dax_bus_probe+0x140/0x1c8
[ 3.086778][ T1] [c000000006d87110] [c0000000011ce640] really_probe+0x108/0x580
[ 3.087218][ T1] [c000000006d871a0] [c0000000011ceb84] __driver_probe_device+0xcc/0x284
[ 3.087668][ T1] [c000000006d87230] [c0000000011ceea0] driver_probe_device+0x5c/0x10c
[ 3.088123][ T1] [c000000006d87270] [c0000000011cf05c] __device_attach_driver+0x10c/0x1e8
[ 3.088582][ T1] [c000000006d872f0] [c0000000011cab70] bus_for_each_drv+0xc0/0x13c
[ 3.089035][ T1] [c000000006d87350] [c0000000011cf65c] __device_attach+0xdc/0x2b0
[ 3.089467][ T1] [c000000006d873f0] [c0000000011cfaac] device_initial_probe+0x80/0x98
[ 3.089910][ T1] [c000000006d87420] [c0000000011cac44] __bus_probe_device+0x58/0xf4
[ 3.090358][ T1] [c000000006d87470] [c0000000011c8030] device_add+0x850/0xa78
[ 3.090778][ T1] [c000000006d87530] [c00000000125b040] __devm_create_dev_dax+0x1c0/0x638
[ 3.091236][ T1] [c000000006d875d0] [c00000000125b6c8] devm_create_dev_dax+0x44/0x7c
[ 3.091676][ T1] [c000000006d87600] [c00000000125dbe8] __dax_pmem_probe+0x238/0x27c
[ 3.092120][ T1] [c000000006d87770] [c00000000125dc4c] dax_pmem_probe+0x20/0x44
[ 3.092542][ T1] [c000000006d87790] [c000000001237a14] nvdimm_bus_probe+0xcc/0x370
[ 3.093097][ T1] [c000000006d87830] [c0000000011ce640] really_probe+0x108/0x580
[ 3.093610][ T1] [c000000006d878c0] [c0000000011ceb84] __driver_probe_device+0xcc/0x284
<...>
[ 3.099405][ T1] ---- interrupt: 0 at 0x0
[ 3.099837][ T1] Code: 7c0802a6 fa8100b0 faa100b8 fb8100f0 7d574030 7d4a4030 f8010120 fbe10108 3917ffff 7d294038 3109ffff 7d284910 <0b090000> 3d2201c5 7bb53664 7ed607b4
[ 3.101209][ T1] ---[ end trace 0000000000000000 ]---
[ 3.104702][ T1] BUG: Unable to handle kernel data access on write at 0xc00c000000210000
[ 3.105209][ T1] Faulting instruction address: 0xc000000000596394
cpu 0x0: Vector: 300 (Data Access) at [c000000006d86aa0]
lr: c0000000005962c4: memmap_init_compound+0xac/0x2a8
sp: c000000006d86d40
msr: 8000000002009033
dar: c00c000000210000
dsisr: a000000
current = 0xc000000006d33e00
paca = 0xc000000005010000 irqmask: 0x03 irq_happened: 0x01
pid = 1, comm = swapper/0
Linux version 7.3.0-17056-gc0944ee4a2c4 (powerpc64le-linux-gnu-gcc (Debian 12.2.0-14) 12.2.0, GNU ld (GNU Binutils for Debian) 2.40) #111 SMP PREEMPT Mon Nov 9 07:25:29 IST 2026
enter ? for help
[c000000006d86e00] c0000000005968f8 memmap_init_zone_device+0x438/0x470
[c000000006d86f10] c0000000006d72b8 memremap_pages+0x3b0/0x974
[c000000006d86fe0] c0000000006d78b8 devm_memremap_pages+0x3c/0xa4
[c000000006d87020] c00000000125c084 dev_dax_probe+0x264/0x3d0
[c000000006d870c0] c000000001259a28 dax_bus_probe+0x140/0x1c8
[c000000006d87110] c0000000011ce640 really_probe+0x108/0x580
[c000000006d871a0] c0000000011ceb84 __driver_probe_device+0xcc/0x284
[c000000006d87230] c0000000011ceea0 driver_probe_device+0x5c/0x10c
[c000000006d87270] c0000000011cf05c __device_attach_driver+0x10c/0x1e8
[c000000006d872f0] c0000000011cab70 bus_for_each_drv+0xc0/0x13c
[c000000006d87350] c0000000011cf65c __device_attach+0xdc/0x2b0
[c000000006d873f0] c0000000011cfaac device_initial_probe+0x80/0x98
[c000000006d87420] c0000000011cac44 __bus_probe_device+0x58/0xf4
[c000000006d87470] c0000000011c8030 device_add+0x850/0xa78
[c000000006d87530] c00000000125b040 __devm_create_dev_dax+0x1c0/0x638
[c000000006d875d0] c00000000125b6c8 devm_create_dev_dax+0x44/0x7c
[c000000006d87600] c00000000125dbe8 __dax_pmem_probe+0x238/0x27c
[c000000006d87770] c00000000125dc4c dax_pmem_probe+0x20/0x44
[c000000006d87790] c000000001237a14 nvdimm_bus_probe+0xcc/0x370
[c000000006d87830] c0000000011ce640 really_probe+0x108/0x580
<...>
Feel free to add:
Tested-by: Ritesh Harjani (IBM) <ritesh.list@gmail.com>
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2026-11-09 2:03 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-11-07 3:01 [PATCH v2] dax/pmem: fix unaligned compound devmap initialization Muchun Song
2026-11-09 1:57 ` Ritesh Harjani
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®