[PATCH v7 6/8] vmcore: allocate ELF note segment in the 2nd kernel vmalloc memory
Vivek Goyal
vgoyal at redhat.com
Wed May 22 15:21:22 EDT 2013
On Wed, May 22, 2013 at 11:56:06AM +0900, HATAYAMA Daisuke wrote:
[..]
> -/* Merges all the PT_NOTE headers into one. */
> -static int __init merge_note_headers_elf64(char *elfptr, size_t *elfsz,
> - struct list_head *vc_list)
> +/**
> + * get_note_number_and_size_elf64 - get the number of PT_NOTE program
> + * headers and sum of real size of their ELF note segment headers and
> + * data.
> + *
> + * @ehdr_ptr: ELF header
> + * @nr_ptnotep: buffer for the number of PT_NOTE program headers
> + * @phdr_szp: buffer for size of unique PT_NOTE program header
How about calling them nr_ptnote and sz_ptnote respectively. Just feels
more readable to me.
[..]
> +static int __init copy_notes_elf64(const Elf64_Ehdr *ehdr_ptr, char *notes_buf)
> +{
> + int i, rc=0;
> + Elf64_Phdr *phdr_ptr;
> + Elf64_Nhdr *nhdr_ptr;
> + u64 phdr_sz = 0;
> +
> + phdr_ptr = (Elf64_Phdr*)(ehdr_ptr + 1);
> +
> + for (i = 0; i < ehdr_ptr->e_phnum; i++, phdr_ptr++) {
> + int j;
> + void *notes_section;
> + u64 offset, max_sz, sz, real_sz = 0;
> + if (phdr_ptr->p_type != PT_NOTE)
> + continue;
> + max_sz = phdr_ptr->p_memsz;
> + offset = phdr_ptr->p_offset;
> + notes_section = kmalloc(max_sz, GFP_KERNEL);
> + if (!notes_section)
> return -ENOMEM;
> + rc = read_from_oldmem(notes_section, max_sz, &offset, 0);
> + if (rc < 0) {
> + kfree(notes_section);
> + return rc;
> + }
> + nhdr_ptr = notes_section;
> + for (j = 0; j < max_sz; j += sz) {
> + if (nhdr_ptr->n_namesz == 0)
> + break;
> + sz = sizeof(Elf64_Nhdr) +
> + ((nhdr_ptr->n_namesz + 3) & ~3) +
> + ((nhdr_ptr->n_descsz + 3) & ~3);
> + real_sz += sz;
> + nhdr_ptr = (Elf64_Nhdr*)((char*)nhdr_ptr + sz);
> + }
> + offset = phdr_ptr->p_offset;
> + rc = read_from_oldmem(notes_buf + phdr_sz, real_sz,
> + &offset, 0);
We have already copied notes in notes_section. So there is no need to
do read_from_oldmem again.
Also going through notes size multiple times seems unnecessary. How
about writing a function which goes through notes once and updates
the size in PT_NOTE header p_memsz field. And then later
copy_notes_elf64() and get_note_number_and_size_elf64() can simply
make use of it.
Also copy_notes_elf64() does not have to cpy notes temporarily in
notes_section memory in that case.
So how about something like, update_note_header_size().
[..]
> + vm = find_vm_area(*notes_buf);
> + BUG_ON(!vm);
> + vm->flags |= VM_USERMAP;
> +
This code is new and is not related to copying of notes. Can you please
move it into a separate patch with explanation.
Thanks
Vivek
More information about the kexec
mailing list