• Lee, Chun-Yi's avatar
    PM / hibernate: avoid unsafe pages in e820 reserved regions · 84c91b7a
    Lee, Chun-Yi authored
    When the machine doesn't well handle the e820 persistent when hibernate
    resuming, then it may cause page fault when writing image to snapshot
    buffer:
    
    [   17.929495] BUG: unable to handle kernel paging request at ffff880069d4f000
    [   17.933469] IP: [<ffffffff810a1cf0>] load_image_lzo+0x810/0xe40
    [   17.933469] PGD 2194067 PUD 77ffff067 PMD 2197067 PTE 0
    [   17.933469] Oops: 0002 [#1] SMP
    ...
    
    The ffff880069d4f000 page is in e820 reserved region of resume boot
    kernel:
    
    [    0.000000] BIOS-e820: [mem 0x0000000069d4f000-0x0000000069e12fff] reserved
    ...
    [    0.000000] PM: Registered nosave memory: [mem 0x69d4f000-0x69e12fff]
    
    So snapshot.c mark the pfn to forbidden pages map. But, this
    page is also in the memory bitmap in snapshot image because it's an
    original page used by image kernel, so it will also mark as an
    unsafe(free) page in prepare_image().
    
    That means the page in e820 when resuming mark as "forbidden" and
    "free", it causes get_buffer() treat it as an allocated unsafe page.
    Then snapshot_write_next() return this page to load_image, load_image
    writing content to this address, but this page didn't really allocated
    . So, we got page fault.
    
    Although the root cause is from BIOS, I think aggressive check and
    significant message in kernel will better then a page fault for
    issue tracking, especially when serial console unavailable.
    
    This patch adds code in mark_unsafe_pages() for check does free pages in
    nosave region. If so, then it print message and return fault to stop whole
    S4 resume process:
    
    [    8.166004] PM: Image loading progress:   0%
    [    8.658717] PM: 0x6796c000 in e820 nosave region: [mem 0x6796c000-0x6796cfff]
    [    8.918737] PM: Read 2511940 kbytes in 1.04 seconds (2415.32 MB/s)
    [    8.926633] PM: Error -14 resuming
    [    8.933534] PM: Failed to load hibernation image, recovering.
    Reviewed-by: default avatarTakashi Iwai <tiwai@suse.de>
    Acked-by: default avatarPavel Machek <pavel@ucw.cz>
    Signed-off-by: default avatarLee, Chun-Yi <jlee@suse.com>
    [rjw: Subject]
    Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
    84c91b7a
snapshot.c 67.5 KB