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