[PATCHv2 2/2] [fs] proc/vmcore: check the dummy place holder for offline cpu to avoid warning
Dave Young
dyoung at redhat.com
Sun Dec 18 18:40:18 PST 2016
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
More information about the kexec
mailing list