Hi, Pingfan On 12/19/16 at 10:08am, Pingfan Liu wrote: > kexec-tools always allocates program headers for present cpus. But > when crashing, offline cpus have dummy headers. We do not copy these > dummy notes into ELF file, also have no need of warning on them. I still think it is not worth such a fix, if you feel a lot of warnings in case large cpu numbers, I think you can change the pr_warn to pr_warn_once, we do not care the null cpu notes if it has nothing bad to the vmcore. > > Signed-off-by: Pingfan Liu <piliu at redhat.com> > --- > fs/proc/vmcore.c | 46 ++++++++++++++++++++++++++++++++++++++-------- > 1 file changed, 38 insertions(+), 8 deletions(-) > > diff --git a/fs/proc/vmcore.c b/fs/proc/vmcore.c > index 8ab782d..fc6e352 100644 > --- a/fs/proc/vmcore.c > +++ b/fs/proc/vmcore.c > @@ -526,9 +526,10 @@ static u64 __init get_vmcore_size(size_t elfsz, size_t elfnotesegsz, > */ > static int __init update_note_header_size_elf64(const Elf64_Ehdr *ehdr_ptr) > { > - int i, rc=0; > + int i, j, rc = 0; > Elf64_Phdr *phdr_ptr; > - Elf64_Nhdr *nhdr_ptr; > + Elf64_Nhdr *nhdr_ptr, *prev_ptr; > + bool warn; > > phdr_ptr = (Elf64_Phdr *)(ehdr_ptr + 1); > for (i = 0; i < ehdr_ptr->e_phnum; i++, phdr_ptr++) { > @@ -536,6 +537,7 @@ static int __init update_note_header_size_elf64(const Elf64_Ehdr *ehdr_ptr) > u64 offset, max_sz, sz, real_sz = 0; > if (phdr_ptr->p_type != PT_NOTE) > continue; > + warn = true; > max_sz = phdr_ptr->p_memsz; > offset = phdr_ptr->p_offset; > notes_section = kmalloc(max_sz, GFP_KERNEL); > @@ -556,14 +558,27 @@ static int __init update_note_header_size_elf64(const Elf64_Ehdr *ehdr_ptr) > nhdr_ptr->n_namesz, nhdr_ptr->n_descsz); > break; > } > + prev_ptr = nhdr_ptr; > real_sz += sz; > nhdr_ptr = (Elf64_Nhdr*)((char*)nhdr_ptr + sz); > + if ((prev_ptr->n_type == NT_DUMMY) > + && !strncmp(KEXEC_CORE_NOTE_NAME, > + (char *)prev_ptr + sizeof(Elf64_Nhdr), > + strlen(KEXEC_CORE_NOTE_NAME))) { > + if (nhdr_ptr->n_namesz == 0) { > + /* do not copy this dummy note */ > + real_sz = 0; > + warn = false; > + } else > + pr_warn("Warning: Dummy PT_NOTE not overwritten\n"); > + } > } > + if (real_sz != 0) > + warn = false; > kfree(notes_section); > phdr_ptr->p_memsz = real_sz; > - if (real_sz == 0) { > + if (warn) > pr_warn("Warning: Zero PT_NOTE entries found\n"); > - } > } > > return 0; > @@ -712,9 +727,10 @@ static int __init merge_note_headers_elf64(char *elfptr, size_t *elfsz, > */ > static int __init update_note_header_size_elf32(const Elf32_Ehdr *ehdr_ptr) > { > - int i, rc=0; > + int i, j, rc = 0; > Elf32_Phdr *phdr_ptr; > - Elf32_Nhdr *nhdr_ptr; > + Elf32_Nhdr *nhdr_ptr, *prev_ptr; > + bool warn; > > phdr_ptr = (Elf32_Phdr *)(ehdr_ptr + 1); > for (i = 0; i < ehdr_ptr->e_phnum; i++, phdr_ptr++) { > @@ -722,6 +738,7 @@ static int __init update_note_header_size_elf32(const Elf32_Ehdr *ehdr_ptr) > u64 offset, max_sz, sz, real_sz = 0; > if (phdr_ptr->p_type != PT_NOTE) > continue; > + warn = true; > max_sz = phdr_ptr->p_memsz; > offset = phdr_ptr->p_offset; > notes_section = kmalloc(max_sz, GFP_KERNEL); > @@ -742,14 +759,27 @@ static int __init update_note_header_size_elf32(const Elf32_Ehdr *ehdr_ptr) > nhdr_ptr->n_namesz, nhdr_ptr->n_descsz); > break; > } > + prev_ptr = nhdr_ptr; > real_sz += sz; > nhdr_ptr = (Elf32_Nhdr*)((char*)nhdr_ptr + sz); > + if ((prev_ptr->n_type == NT_DUMMY) > + && !strncmp(KEXEC_CORE_NOTE_NAME, > + (char *)prev_ptr + sizeof(Elf32_Nhdr), > + strlen(KEXEC_CORE_NOTE_NAME))) { > + if (nhdr_ptr->n_namesz == 0) { > + /* do not copy this dummy note */ > + real_sz = 0; > + warn = false; > + } else > + pr_warn("Warning: Dummy PT_NOTE not overwritten\n"); > + } > } > + if (real_sz != 0) > + warn = false; > kfree(notes_section); > phdr_ptr->p_memsz = real_sz; > - if (real_sz == 0) { > + if (warn) > pr_warn("Warning: Zero PT_NOTE entries found\n"); > - } > } > > return 0; > -- > 2.7.4 > Thanks Dave