[Skiboot] [PATCH] external/mambo: pmem: make persistent memory disk mapping 2MB aligned

Mahesh Salgaonkar mahesh at linux.ibm.com
Tue Feb 4 01:36:54 AEDT 2025


commit 0a6a2ff30c9e ("mambo: Add persistent memory disk support") allows
user to map disk images persistent memory using PMEM_DISK ENV variable.

However, If the size of the disk image file passed is not 2MB align,
then the Linux kernel fails to detect pmem device with misaligned error.

    nd_pmem namespace0.0: [mem 0x20000000000-0x203fffe01ff flags 0x200]
    misaligned, unable to map
    nd_pmem namespace0.0: probe with driver nd_pmem failed with error -95

And then linux kernel fails to mount root fs from /dev/pmem0

    md: ... autorun DONE.
    /dev/root: Can't open blockdev
    VFS: Cannot open root device "/dev/pmem0" or unknown-block(0,0):
    error -6
    [...]
    Kernel panic - not syncing: VFS: Unable to mount root fs on
    unknown-block(0,0)

Fix this by adding remaining bytes as padding to make pmem device memory
map 2MB aligned.

Reported-by: Brad Thomasson <bthomas at us.ibm.com>
Signed-off-by: Mahesh Salgaonkar <mahesh at linux.ibm.com>
---
 external/mambo/skiboot.tcl | 32 ++++++++++++++++++++++++++++++++
 1 file changed, 32 insertions(+)

diff --git a/external/mambo/skiboot.tcl b/external/mambo/skiboot.tcl
index 6c0eb5a0d0..2914ecfea2 100644
--- a/external/mambo/skiboot.tcl
+++ b/external/mambo/skiboot.tcl
@@ -368,6 +368,38 @@ foreach pmem_file $pmem_files { # PMEM_DISK
 	puts "ERROR: pmem: 'mysim mmap' $err"
 	exit
     }
+
+    # Linux requires the pmem size to be 2MB align.
+    # If not then mmap remaining bytes as padding to align mamp to 2MB
+    set pmem_map_align [expr 2 \* [expr 1024 \* 1024]]
+    puts $pmem_map_align
+    set pmem_remainder [expr $pmem_size % $pmem_map_align]
+    if { $pmem_remainder != 0 } {
+	set pmem_padding [expr $pmem_map_align - $pmem_remainder]
+	if { $pmem_padding > $pmem_map_align } {
+		puts "ERROR: pmem: Failed to calculate valid padding size"
+		exit
+	}
+	puts "pmem_padding: $pmem_padding"
+
+	# Create pad file of remiaing size and map it.
+	set pmem_pad_file [exec mktemp /tmp/pmem_padXXXXXX]
+	puts "Pad file: $pmem_pad_file"
+	if {[catch {exec dd if=/dev/zero of=$pmem_pad_file bs=$pmem_padding count=1 status=none} err]} {
+		puts "ERROR: pmem: 'Failed to create paded file' $err"
+		exec rm -f $pmem_pad_file
+		exit
+	}
+
+	set pmem_end [expr $pmem_start + $pmem_size]
+	if {[catch {mysim memory mmap $pmem_end $pmem_padding $pmem_pad_file $pmem_mode} err]} {
+		puts "ERROR: pmem: 'mysim mmap padding' $err"
+		exit
+	}
+	exec rm -f $pmem_pad_file
+	set pmem_size [expr $pmem_size + $pmem_padding]
+    }
+
     set pmem_start [pmem_node_add $pmem_root $pmem_start $pmem_size]
     set pmem_file_ix [expr $pmem_file_ix + 1]
 }
-- 
2.48.1



More information about the Skiboot mailing list