Skip to content

Commit 0b17fc2

Browse files
maheshsalrarbab
authored andcommitted
external/mambo: pmem: make persistent memory disk mapping 2MB aligned
commit 0a6a2ff ("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 <[email protected]> Signed-off-by: Mahesh Salgaonkar <[email protected]> Signed-off-by: Reza Arbab <[email protected]>
1 parent 009fd09 commit 0b17fc2

File tree

1 file changed

+32
-0
lines changed

1 file changed

+32
-0
lines changed

external/mambo/skiboot.tcl

+32
Original file line numberDiff line numberDiff line change
@@ -368,6 +368,38 @@ foreach pmem_file $pmem_files { # PMEM_DISK
368368
puts "ERROR: pmem: 'mysim mmap' $err"
369369
exit
370370
}
371+
372+
# Linux requires the pmem size to be 2MB align.
373+
# If not then mmap remaining bytes as padding to align mamp to 2MB
374+
set pmem_map_align [expr 2 \* [expr 1024 \* 1024]]
375+
puts $pmem_map_align
376+
set pmem_remainder [expr $pmem_size % $pmem_map_align]
377+
if { $pmem_remainder != 0 } {
378+
set pmem_padding [expr $pmem_map_align - $pmem_remainder]
379+
if { $pmem_padding > $pmem_map_align } {
380+
puts "ERROR: pmem: Failed to calculate valid padding size"
381+
exit
382+
}
383+
puts "pmem_padding: $pmem_padding"
384+
385+
# Create pad file of remiaing size and map it.
386+
set pmem_pad_file [exec mktemp /tmp/pmem_padXXXXXX]
387+
puts "Pad file: $pmem_pad_file"
388+
if {[catch {exec dd if=/dev/zero of=$pmem_pad_file bs=$pmem_padding count=1 status=none} err]} {
389+
puts "ERROR: pmem: 'Failed to create paded file' $err"
390+
exec rm -f $pmem_pad_file
391+
exit
392+
}
393+
394+
set pmem_end [expr $pmem_start + $pmem_size]
395+
if {[catch {mysim memory mmap $pmem_end $pmem_padding $pmem_pad_file $pmem_mode} err]} {
396+
puts "ERROR: pmem: 'mysim mmap padding' $err"
397+
exit
398+
}
399+
exec rm -f $pmem_pad_file
400+
set pmem_size [expr $pmem_size + $pmem_padding]
401+
}
402+
371403
set pmem_start [pmem_node_add $pmem_root $pmem_start $pmem_size]
372404
set pmem_file_ix [expr $pmem_file_ix + 1]
373405
}

0 commit comments

Comments
 (0)