[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