Sorry for late reply. (2013/04/30 4:51), Vivek Goyal wrote: > On Sat, Apr 13, 2013 at 09:21:46AM +0900, HATAYAMA Daisuke wrote: >> Treat memory chunks referenced by PT_LOAD program header entries in >> page-size boundary in vmcore_list. Formally, for each range [start, >> end], we set up the corresponding vmcore object in vmcore_list to >> [rounddown(start, PAGE_SIZE), roundup(end, PAGE_SIZE)]. >> >> This change affects layout of /proc/vmcore. The gaps generated by the >> rearrangement are newly made visible to applications as >> holes. Concretely, they are two ranges [rounddown(start, PAGE_SIZE), >> start] and [end, roundup(end, PAGE_SIZE)]. > > Sorry did not understand this part. So if end is not page aligned, then > we roundup(end, PAGE_SIZE) and increase the PT_LOAD size accordingly? > Similarly for start, we do roundown(). > > - Can you really rounddown() start? Then you will have to change start > virtual address in program header and that's not really a good idea. > No, there's no need to change paddr in program header. Pleaes notice that difference between what objects in vc_list refer to and what PT_LOAD program headers refer to. The former covers not only kernel memory but also the extra memory, while the latter the kernel memory only. > - So this extra memory for end, we read from old memory and not fill > with zeros? Yes. The extra memory is not covered by any program header, i.e. hole. The extra memory is not modified at all, exported with no change; if it is used by BIOS, users can see BIOS data there. This design comes from the discussion with Erick. > >> >> Signed-off-by: HATAYAMA Daisuke <d.hatayama at jp.fujitsu.com> >> --- >> >> fs/proc/vmcore.c | 26 ++++++++++++++++++++------ >> 1 files changed, 20 insertions(+), 6 deletions(-) >> >> diff --git a/fs/proc/vmcore.c b/fs/proc/vmcore.c >> index 029bdc0..cd0f9d9 100644 >> --- a/fs/proc/vmcore.c >> +++ b/fs/proc/vmcore.c >> @@ -477,16 +477,23 @@ static int __init process_ptload_program_headers_elf64(char *elfptr, >> vmcore_off = elfsz + roundup(phdr_ptr->p_memsz, PAGE_SIZE); >> >> for (i = 0; i < ehdr_ptr->e_phnum; i++, phdr_ptr++) { >> + u64 paddr, start, end, size; >> + >> if (phdr_ptr->p_type != PT_LOAD) >> continue; >> >> + paddr = phdr_ptr->p_offset; >> + start = rounddown(paddr, PAGE_SIZE); >> + end = roundup(paddr + phdr_ptr->p_memsz, PAGE_SIZE); >> + size = end - start; >> + >> /* Add this contiguous chunk of memory to vmcore list.*/ >> - if (vmcore_add(vc_list, phdr_ptr->p_offset, phdr_ptr->p_memsz)) >> + if (vmcore_add(vc_list, start, size)) >> return -ENOMEM; >> >> /* Update the program header offset. */ >> - phdr_ptr->p_offset = vmcore_off; >> - vmcore_off = vmcore_off + phdr_ptr->p_memsz; >> + phdr_ptr->p_offset = vmcore_off + (paddr - start); > > What's paddr-start. Why following is not sufficient. > > phdr_ptr->p_offset = vmcore_off > (paddr - start) is offset of the memory program header refers to, from which kernel memory starts. Pictrically: vmcore_off +----------------------+ | extra memory | | (non kernel memory) | phdr->p_offset = +----------------------+ vmcore_off + (paddr - start) | |\ | kernel memory | phdr->p_memsz | |/ +----------------------+ | extra memory | | (non kernel memory) | vmcore_off + size +----------------------+ -- Thanks. HATAYAMA, Daisuke