Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755287Ab3EPGIO (ORCPT ); Thu, 16 May 2013 02:08:14 -0400 Received: from cn.fujitsu.com ([222.73.24.84]:12192 "EHLO song.cn.fujitsu.com" rhost-flags-OK-FAIL-OK-OK) by vger.kernel.org with ESMTP id S1754571Ab3EPGIK convert rfc822-to-8bit (ORCPT ); Thu, 16 May 2013 02:08:10 -0400 X-IronPort-AV: E=Sophos;i="4.87,682,1363104000"; d="scan'208";a="7283465" Message-ID: <519475B6.7060706@cn.fujitsu.com> Date: Thu, 16 May 2013 13:59:18 +0800 From: Zhang Yanfei User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:10.0.8) Gecko/20121012 Thunderbird/10.0.8 MIME-Version: 1.0 To: HATAYAMA Daisuke CC: vgoyal@redhat.com, ebiederm@xmission.com, akpm@linux-foundation.org, cpw@sgi.com, kumagai-atsushi@mxc.nes.nec.co.jp, lisa.mitchell@hp.com, kexec@lists.infradead.org, linux-kernel@vger.kernel.org, jingbai.ma@hp.com, linux-mm@kvack.org, riel@redhat.com, walken@google.com, hughd@google.com, kosaki.motohiro@jp.fujitsu.com Subject: Re: [PATCH v6 3/8] vmcore: treat memory chunks referenced by PT_LOAD program header entries in page-size boundary in vmcore_list References: <20130515090507.28109.28956.stgit@localhost6.localdomain6> <20130515090557.28109.9991.stgit@localhost6.localdomain6> In-Reply-To: <20130515090557.28109.9991.stgit@localhost6.localdomain6> X-MIMETrack: Itemize by SMTP Server on mailserver/fnst(Release 8.5.3|September 15, 2011) at 2013/05/16 14:00:29, Serialize by Router on mailserver/fnst(Release 8.5.3|September 15, 2011) at 2013/05/16 14:06:56 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8BIT Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 4023 Lines: 113 于 2013年05月15日 17:05, HATAYAMA Daisuke 写道: > 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)]. > > Suppose variable m points at a vmcore object in vmcore_list, and > variable phdr points at the program header of PT_LOAD type the > variable m corresponds to. Then, pictorially: > > m->offset +---------------+ > | hole | > phdr->p_offset = +---------------+ > m->offset + (paddr - start) | |\ > | kernel memory | phdr->p_memsz > | |/ > +---------------+ > | hole | > m->offset + m->size +---------------+ > > where m->offset and m->offset + m->size are always page-size aligned. > > Signed-off-by: HATAYAMA Daisuke > Acked-by: Vivek Goyal > --- Acked-by: Zhang Yanfei > > fs/proc/vmcore.c | 30 ++++++++++++++++++++++-------- > 1 files changed, 22 insertions(+), 8 deletions(-) > > diff --git a/fs/proc/vmcore.c b/fs/proc/vmcore.c > index 48886e6..6cf7fbd 100644 > --- a/fs/proc/vmcore.c > +++ b/fs/proc/vmcore.c > @@ -406,20 +406,27 @@ 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.*/ > new = get_new_element(); > if (!new) > return -ENOMEM; > - new->paddr = phdr_ptr->p_offset; > - new->size = phdr_ptr->p_memsz; > + new->paddr = start; > + new->size = size; > list_add_tail(&new->list, vc_list); > > /* 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); > + vmcore_off = vmcore_off + size; > } > return 0; > } > @@ -441,20 +448,27 @@ static int __init process_ptload_program_headers_elf32(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.*/ > new = get_new_element(); > if (!new) > return -ENOMEM; > - new->paddr = phdr_ptr->p_offset; > - new->size = phdr_ptr->p_memsz; > + new->paddr = start; > + new->size = size; > list_add_tail(&new->list, vc_list); > > /* 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); > + vmcore_off = vmcore_off + size; > } > return 0; > } > > -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/