• Baoquan He's avatar
    kexec: align crash_notes allocation to make it be inside one physical page · bbb78b8f
    Baoquan He authored
    People reported that crash_notes in /proc/vmcore were corrupted and this
    cause crash kdump failure.  With code debugging and log we got the root
    cause.  This is because percpu variable crash_notes are allocated in 2
    vmalloc pages.  Currently percpu is based on vmalloc by default.  Vmalloc
    can't guarantee 2 continuous vmalloc pages are also on 2 continuous
    physical pages.  So when 1st kernel exports the starting address and size
    of crash_notes through sysfs like below:
    
    /sys/devices/system/cpu/cpux/crash_notes
    /sys/devices/system/cpu/cpux/crash_notes_size
    
    kdump kernel use them to get the content of crash_notes.  However the 2nd
    part may not be in the next neighbouring physical page as we expected if
    crash_notes are allocated accross 2 vmalloc pages.  That's why
    nhdr_ptr->n_namesz or nhdr_ptr->n_descsz could be very huge in
    update_note_header_size_elf64() and cause note header merging failure or
    some warnings.
    
    In this patch change to call __alloc_percpu() to passed in the align value
    by rounding crash_notes_size up to the nearest power of two.  This makes
    sure the crash_notes is allocated inside one physical page since
    sizeof(note_buf_t) in all ARCHS is smaller than PAGE_SIZE.  Meanwhile add
    a BUILD_BUG_ON to break compile if size is bigger than PAGE_SIZE since
    crash_notes definitely will be in 2 pages.  That need be avoided, and need
    be reported if it's unavoidable.
    
    [akpm@linux-foundation.org: use correct comment layout]
    Signed-off-by: default avatarBaoquan He <bhe@redhat.com>
    Cc: Eric W. Biederman <ebiederm@xmission.com>
    Cc: Vivek Goyal <vgoyal@redhat.com>
    Cc: Dave Young <dyoung@redhat.com>
    Cc: Lisa Mitchell <lisa.mitchell@hp.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    bbb78b8f
kexec_core.c 37.9 KB