The Linux Kernel Mailing List
 help / color / mirror / Atom feed
From: "Suzuki K. Poulose" <suzuki@in.ibm.com>
To: linux-kernel@vger.kernel.org
Cc: "Suzuki K. Poulose" <suzuki@in.ibm.com>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Christoph Hellwig <hch@lst.de>,
	Masami Hiramatsu <mhiramat@redhat.com>,
	Ananth N Mavinakayanahalli <ananth@in.ibm.com>,
	Daisuke HATAYAMA <d.hatayama@jp.fujitsu.com>,
	Andi Kleen <andi@firstfloor.org>,
	Roland McGrath <roland@redhat.com>,
	Amerigo Wang <amwang@redhat.com>,
	Linus Torvalds <torvalds@linux-foundation.org>,
	KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>,
	KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>,
	Oleg Nesterov <oleg@redhat.com>,
	Andrew Morton <akpm@linux-foundation.org>
Subject: [Patch 3/21] Make vma_dump_size() generic
Date: Tue, 14 Dec 2010 15:30:13 +0530	[thread overview]
Message-ID: <20101214153013.07878e76@suzukikp> (raw)
In-Reply-To: <20101214152259.67896960@suzukikp>

vma_dump_size calculates the file size of a vma area in the core file. It 
assumes the vma belongs to the "current". Make it generic to work for any task.
This will be reused by application core dump infrastructure.

Signed-off-by: Suzuki K. Poulose <suzuki@in.ibm.com>
---
 fs/binfmt_elf.c                  |    6 +++---
 fs/elfcore-common.c              |   21 ++++++++++++++-------
 include/linux/elfcore-internal.h |    4 ++--
 3 files changed, 19 insertions(+), 12 deletions(-)

Index: linux-2.6.36-rc7/fs/binfmt_elf.c
===================================================================
--- linux-2.6.36-rc7.orig/fs/binfmt_elf.c
+++ linux-2.6.36-rc7/fs/binfmt_elf.c
@@ -1735,7 +1735,7 @@ static size_t elf_core_vma_data_size(str
 
 	for (vma = first_vma(current, gate_vma); vma != NULL;
 	     vma = next_vma(vma, gate_vma))
-		size += vma_dump_size(vma, mm_flags);
+		size += vma_dump_size(current, vma, mm_flags);
 	return size;
 }
 
@@ -1860,7 +1860,7 @@ static int elf_core_dump(struct coredump
 		phdr.p_offset = offset;
 		phdr.p_vaddr = vma->vm_start;
 		phdr.p_paddr = 0;
-		phdr.p_filesz = vma_dump_size(vma, cprm->mm_flags);
+		phdr.p_filesz = vma_dump_size(current, vma, cprm->mm_flags);
 		phdr.p_memsz = vma->vm_end - vma->vm_start;
 		offset += phdr.p_filesz;
 		phdr.p_flags = vma->vm_flags & VM_READ ? PF_R : 0;
@@ -1895,7 +1895,7 @@ static int elf_core_dump(struct coredump
 		unsigned long addr;
 		unsigned long end;
 
-		end = vma->vm_start + vma_dump_size(vma, cprm->mm_flags);
+		end = vma->vm_start + vma_dump_size(current, vma, cprm->mm_flags);
 
 		for (addr = vma->vm_start; addr < end; addr += PAGE_SIZE) {
 			struct page *page;
Index: linux-2.6.36-rc7/fs/elfcore-common.c
===================================================================
--- linux-2.6.36-rc7.orig/fs/elfcore-common.c
+++ linux-2.6.36-rc7/fs/elfcore-common.c
@@ -50,8 +50,8 @@ struct vm_area_struct *next_vma(struct v
 /*
  * Decide what to dump of a segment, part, all or none.
  */
-unsigned long vma_dump_size(struct vm_area_struct *vma,
-					 unsigned long mm_flags)
+unsigned long vma_dump_size(struct task_struct *p, struct vm_area_struct *vma,
+				unsigned long mm_flags)
 {
 #define FILTER(type)	(mm_flags & (1UL << MMF_DUMP_##type))
 
@@ -97,7 +97,6 @@ unsigned long vma_dump_size(struct vm_ar
 	    vma->vm_pgoff == 0 && (vma->vm_flags & VM_READ)) {
 		u32 __user *header = (u32 __user *) vma->vm_start;
 		u32 word;
-		mm_segment_t fs = get_fs();
 		/*
 		 * Doing it this way gets the constant folded by GCC.
 		 */
@@ -114,10 +113,18 @@ unsigned long vma_dump_size(struct vm_ar
 		 * Switch to the user "segment" for get_user(),
 		 * then put back what elf_core_dump() had in place.
 		 */
-		set_fs(USER_DS);
-		if (unlikely(get_user(word, header)))
-			word = 0;
-		set_fs(fs);
+		if (p->group_leader == current->group_leader) {
+			mm_segment_t fs = get_fs();
+			set_fs(USER_DS);
+			if (unlikely(get_user(word, header)))
+				word = 0;
+			set_fs(fs);
+		} else {
+			int bytes = access_process_vm(p, (unsigned long)header,
+						&word, sizeof (word), 0);
+			if (bytes != sizeof(word))
+				word = 0;
+		}
 		if (word == magic.cmp)
 			return PAGE_SIZE;
 	}
Index: linux-2.6.36-rc7/include/linux/elfcore-internal.h
===================================================================
--- linux-2.6.36-rc7.orig/include/linux/elfcore-internal.h
+++ linux-2.6.36-rc7/include/linux/elfcore-internal.h
@@ -37,8 +37,8 @@ extern struct vm_area_struct *first_vma(
 					struct vm_area_struct *gate_vma);
 extern struct vm_area_struct *next_vma(struct vm_area_struct *this_vma,
 					struct vm_area_struct *gate_vma);
-extern unsigned long vma_dump_size(struct vm_area_struct *vma,
-					 unsigned long mm_flags);
+extern unsigned long vma_dump_size(struct task_struct *task,
+			struct vm_area_struct *vma, unsigned long mm_flags);
 
 #endif
 #endif

  parent reply	other threads:[~2010-12-14 10:00 UTC|newest]

Thread overview: 53+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-12-14  9:52 [RFC] [Patch 0/21] Non disruptive application core dump infrastructure Suzuki K. Poulose
2010-12-14  9:54 ` [Patch 1/21] Reuse freezable() predicate Suzuki K. Poulose
2010-12-14  9:57 ` [Patch 2/21] Create elfcore-common.c for ELF class independent core generation helpers Suzuki K. Poulose
2010-12-14 10:00 ` Suzuki K. Poulose [this message]
2010-12-14 15:53   ` [Patch 3/21] Make vma_dump_size() generic Oleg Nesterov
2010-12-14 10:01 ` [Patch 4/21] Make fill_psinfo generic Suzuki K. Poulose
2010-12-14 15:53   ` Oleg Nesterov
2010-12-14 15:55   ` Linus Torvalds
2010-12-15  2:22     ` Suzuki K. Poulose
2010-12-14 10:03 ` [Patch 5/21] Rename compat versions of the reusable core generation routines Suzuki K. Poulose
2010-12-14 15:57   ` Oleg Nesterov
2010-12-15  2:30     ` Suzuki K. Poulose
2010-12-14 10:04 ` [Patch 6/21] Export the reusable ELF " Suzuki K. Poulose
2010-12-14 10:05 ` [Patch 7/21] Define API for reading arch specif Program Headers for Core Suzuki K. Poulose
2010-12-14 10:08 ` [Patch 8/21] ia64 Implementation of elf_core_copy_extra_phdrs() Suzuki K. Poulose
2010-12-14 10:09 ` [Patch 9/21] UML (i386) " Suzuki K. Poulose
2010-12-14 10:11 ` [Patch 10/21] Create /proc/pid/core entry Suzuki K. Poulose
2010-12-14 10:36   ` Cong Wang
2010-12-14 15:02     ` Suzuki K. Poulose
2010-12-14 10:12 ` [Patch 11/21] Track the core generation requests Suzuki K. Poulose
2010-12-14 10:51   ` Alexey Dobriyan
2010-12-14 16:04   ` Oleg Nesterov
2010-12-14 10:13 ` [Patch 12/21] Check if the process is an ELF executable Suzuki K. Poulose
2010-12-14 16:05   ` Oleg Nesterov
2010-12-14 10:15 ` [Patch 13/21] Freeze / Thaw threads Suzuki K. Poulose
2010-12-14 16:17   ` Oleg Nesterov
2010-12-14 10:16 ` [Patch 14/21] Create ELF header Suzuki K. Poulose
2010-12-14 16:24   ` Oleg Nesterov
2010-12-14 10:17 ` [Patch 15/21] Collect ELF Core notes data Suzuki K. Poulose
2010-12-14 16:37   ` Oleg Nesterov
2010-12-14 10:19 ` [Patch 16/21] Wait for threads to freeze Suzuki K. Poulose
2010-12-14 16:42   ` Oleg Nesterov
2010-12-14 10:20 ` [Patch 17/21] Calculate the size of the core file Suzuki K. Poulose
2010-12-14 10:22 ` [Patch 18/21] Generate the data sections for ELF Core Suzuki K. Poulose
2010-12-15  7:19   ` Cong Wang
2010-12-15 12:46     ` Suzuki K. Poulose
2010-12-16  2:14       ` Cong Wang
2010-12-14 10:24 ` [Patch 19/21] Identify the ELF class of the process Suzuki K. Poulose
2010-12-14 10:26 ` [Patch 20/21] Add supporting for compat ELF class data structures Suzuki K. Poulose
2010-12-14 10:27 ` [Patch 21/21] Compat ELF class Core generation support Suzuki K. Poulose
2010-12-14 10:54 ` [RFC] [Patch 0/21] Non disruptive application core dump infrastructure Alexey Dobriyan
2010-12-14 14:59   ` Suzuki K. Poulose
2010-12-14 15:49 ` Linus Torvalds
2010-12-14 16:03   ` Tejun Heo
2010-12-14 16:19     ` Linus Torvalds
2010-12-14 16:28       ` Tejun Heo
2010-12-15  5:34   ` Suzuki K. Poulose
2010-12-15  9:37     ` Tejun Heo
2010-12-15 11:26       ` Suzuki K. Poulose
2010-12-15 11:51         ` Andi Kleen
2010-12-16  7:57           ` Suzuki K. Poulose
2010-12-15  1:04 ` KAMEZAWA Hiroyuki
2010-12-15  5:24   ` Suzuki K. Poulose

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20101214153013.07878e76@suzukikp \
    --to=suzuki@in.ibm.com \
    --cc=akpm@linux-foundation.org \
    --cc=amwang@redhat.com \
    --cc=ananth@in.ibm.com \
    --cc=andi@firstfloor.org \
    --cc=d.hatayama@jp.fujitsu.com \
    --cc=hch@lst.de \
    --cc=jeremy.fitzhardinge@citrix.com \
    --cc=kamezawa.hiroyu@jp.fujitsu.com \
    --cc=kosaki.motohiro@jp.fujitsu.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mhiramat@redhat.com \
    --cc=oleg@redhat.com \
    --cc=roland@redhat.com \
    --cc=torvalds@linux-foundation.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox