Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S967470Ab3DRJfX (ORCPT ); Thu, 18 Apr 2013 05:35:23 -0400 Received: from fgwmail5.fujitsu.co.jp ([192.51.44.35]:36941 "EHLO fgwmail5.fujitsu.co.jp" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S967442Ab3DRJfR (ORCPT ); Thu, 18 Apr 2013 05:35:17 -0400 From: HATAYAMA Daisuke Subject: [PATCH v4 7/8] vmcore: treat memory chunks referenced by PT_LOAD program header entries in page-size boundary in vmcore_list To: vgoyal@redhat.com, ebiederm@xmission.com, akpm@linux-foundation.org Cc: cpw@sgi.com, kumagai-atsushi@mxc.nes.nec.co.jp, lisa.mitchell@hp.com, kexec@lists.infradead.org, linux-kernel@vger.kernel.org, zhangyanfei@cn.fujitsu.com, jingbai.ma@hp.com Date: Sat, 13 Apr 2013 09:21:46 +0900 Message-ID: <20130413002145.18245.73180.stgit@localhost6.localdomain6> In-Reply-To: <20130413002000.18245.21513.stgit@localhost6.localdomain6> References: <20130413002000.18245.21513.stgit@localhost6.localdomain6> User-Agent: StGIT/0.14.3 MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2785 Lines: 80 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)]. Signed-off-by: HATAYAMA Daisuke --- 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); + vmcore_off = vmcore_off + size; } return 0; } @@ -507,16 +514,23 @@ 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.*/ - 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); + 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/