Module Name:    src
Committed By:   dsl
Date:           Fri Jan  3 21:12:18 UTC 2014

Modified Files:
        src/sys/kern: core_elf32.c core_netbsd.c
        src/sys/uvm: uvm_coredump.c uvm_extern.h

Log Message:
There is no need for uvm_coredump_walkmap() to explicity pass the proc_t
  pointer to the calller's function.
If the code needs the process its address can be placed in the caller's
  cookie.


To generate a diff of this commit:
cvs rdiff -u -r1.39 -r1.40 src/sys/kern/core_elf32.c
cvs rdiff -u -r1.20 -r1.21 src/sys/kern/core_netbsd.c
cvs rdiff -u -r1.4 -r1.5 src/sys/uvm/uvm_coredump.c
cvs rdiff -u -r1.187 -r1.188 src/sys/uvm/uvm_extern.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/kern/core_elf32.c
diff -u src/sys/kern/core_elf32.c:1.39 src/sys/kern/core_elf32.c:1.40
--- src/sys/kern/core_elf32.c:1.39	Fri Jan  3 20:52:47 2014
+++ src/sys/kern/core_elf32.c	Fri Jan  3 21:12:18 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: core_elf32.c,v 1.39 2014/01/03 20:52:47 dsl Exp $	*/
+/*	$NetBSD: core_elf32.c,v 1.40 2014/01/03 21:12:18 dsl Exp $	*/
 
 /*
  * Copyright (c) 2001 Wasabi Systems, Inc.
@@ -40,7 +40,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(1, "$NetBSD: core_elf32.c,v 1.39 2014/01/03 20:52:47 dsl Exp $");
+__KERNEL_RCSID(1, "$NetBSD: core_elf32.c,v 1.40 2014/01/03 21:12:18 dsl Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_coredump.h"
@@ -68,8 +68,9 @@ __KERNEL_RCSID(1, "$NetBSD: core_elf32.c
 
 struct writesegs_state {
 	Elf_Phdr *psections;
-	off_t	secoff;
-	size_t  npsections;
+	proc_t   *p;
+	off_t	 secoff;
+	size_t   npsections;
 };
 
 /*
@@ -88,8 +89,7 @@ struct note_state {
 	unsigned int     ns_offset;      /* Write point in last buffer */
 };
 
-static int	ELFNAMEEND(coredump_getseghdrs)(struct proc *,
-		    struct uvm_coredump_state *);
+static int	ELFNAMEEND(coredump_getseghdrs)(struct uvm_coredump_state *);
 
 static int	ELFNAMEEND(coredump_notes)(struct lwp *, struct note_state *);
 static int	ELFNAMEEND(coredump_note)(struct lwp *, struct note_state *);
@@ -265,7 +265,7 @@ ELFNAMEEND(coredump)(struct lwp *l, stru
 }
 
 static int
-ELFNAMEEND(coredump_getseghdrs)(struct proc *p, struct uvm_coredump_state *us)
+ELFNAMEEND(coredump_getseghdrs)(struct uvm_coredump_state *us)
 {
 	struct writesegs_state *ws = us->cookie;
 	Elf_Phdr phdr;
@@ -290,7 +290,7 @@ ELFNAMEEND(coredump_getseghdrs)(struct p
 		int i;
 
 		end -= slen;
-		if ((error = copyin_proc(p, (void *)end, buf, slen)) != 0)
+		if ((error = copyin_proc(ws->p, (void *)end, buf, slen)) != 0)
 			return error;
 
 		ep = (const long *) &buf[slen / sizeof(buf[0])];
@@ -397,18 +397,20 @@ ELFNAMEEND(coredump_notes)(struct lwp *l
 
 	/*
 	 * Now, for each LWP, write the register info and any other
-	 * per-LWP notes.  Since we're dumping core, we don't bother
-	 * locking.
+	 * per-LWP notes.
+	 * Lock in case this is a gcore requested dump.
 	 */
+	mutex_enter(p->p_lock);
 	LIST_FOREACH(l0, &p->p_lwps, l_sibling) {
 		if (l0 == l)		/* we've taken care of this thread */
 			continue;
 		error = ELFNAMEEND(coredump_note)(l0, ns);
 		if (error)
-			return (error);
+			break;
 	}
+	mutex_exit(p->p_lock);
 
-	return (0);
+	return error;
 }
 
 static int

Index: src/sys/kern/core_netbsd.c
diff -u src/sys/kern/core_netbsd.c:1.20 src/sys/kern/core_netbsd.c:1.21
--- src/sys/kern/core_netbsd.c:1.20	Fri Jan  3 15:15:02 2014
+++ src/sys/kern/core_netbsd.c	Fri Jan  3 21:12:18 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: core_netbsd.c,v 1.20 2014/01/03 15:15:02 dsl Exp $	*/
+/*	$NetBSD: core_netbsd.c,v 1.21 2014/01/03 21:12:18 dsl Exp $	*/
 
 /*
  * Copyright (c) 1997 Charles D. Cranor and Washington University.
@@ -45,7 +45,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: core_netbsd.c,v 1.20 2014/01/03 15:15:02 dsl Exp $");
+__KERNEL_RCSID(0, "$NetBSD: core_netbsd.c,v 1.21 2014/01/03 21:12:18 dsl Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_coredump.h"
@@ -74,8 +74,7 @@ struct coredump_state {
 	struct CORENAME(core) core;
 };
 
-static int	CORENAME(coredump_writesegs_netbsd)(struct proc *,
-		    struct uvm_coredump_state *);
+static int	CORENAME(coredump_writesegs_netbsd)(struct uvm_coredump_state *);
 
 int
 CORENAME(coredump_netbsd)(struct lwp *l, struct coredump_iostate *iocookie)
@@ -118,8 +117,7 @@ CORENAME(coredump_netbsd)(struct lwp *l,
 }
 
 static int
-CORENAME(coredump_writesegs_netbsd)(struct proc *p,
-    struct uvm_coredump_state *us)
+CORENAME(coredump_writesegs_netbsd)(struct uvm_coredump_state *us)
 {
 	struct coredump_state *cs = us->cookie;
 	struct CORENAME(coreseg) cseg;

Index: src/sys/uvm/uvm_coredump.c
diff -u src/sys/uvm/uvm_coredump.c:1.4 src/sys/uvm/uvm_coredump.c:1.5
--- src/sys/uvm/uvm_coredump.c:1.4	Fri Jan  3 15:15:02 2014
+++ src/sys/uvm/uvm_coredump.c	Fri Jan  3 21:12:18 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: uvm_coredump.c,v 1.4 2014/01/03 15:15:02 dsl Exp $	*/
+/*	$NetBSD: uvm_coredump.c,v 1.5 2014/01/03 21:12:18 dsl Exp $	*/
 
 /*
  * Copyright (c) 1997 Charles D. Cranor and Washington University.
@@ -62,7 +62,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uvm_coredump.c,v 1.4 2014/01/03 15:15:02 dsl Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uvm_coredump.c,v 1.5 2014/01/03 21:12:18 dsl Exp $");
 
 /*
  * uvm_coredump.c: glue functions for coredump
@@ -84,8 +84,8 @@ __KERNEL_RCSID(0, "$NetBSD: uvm_coredump
  */
 
 int
-uvm_coredump_walkmap(struct proc *p, int (*func)(struct proc *,
-    struct uvm_coredump_state *), void *cookie)
+uvm_coredump_walkmap(struct proc *p, int (*func)(struct uvm_coredump_state *),
+    void *cookie)
 {
 	struct uvm_coredump_state state;
 	struct vmspace *vm = p->p_vmspace;
@@ -191,7 +191,7 @@ uvm_coredump_walkmap(struct proc *p, int
 			continue;
 		
 		vm_map_unlock_read(map);
-		error = (*func)(p, &state);
+		error = (*func)(&state);
 		if (error)
 			return (error);
 		vm_map_lock_read(map);
@@ -202,7 +202,7 @@ uvm_coredump_walkmap(struct proc *p, int
 }
 
 static int
-count_segs(struct proc *p, struct uvm_coredump_state *s)
+count_segs(struct uvm_coredump_state *s)
 {
     (*(int *)s->cookie)++;
 

Index: src/sys/uvm/uvm_extern.h
diff -u src/sys/uvm/uvm_extern.h:1.187 src/sys/uvm/uvm_extern.h:1.188
--- src/sys/uvm/uvm_extern.h:1.187	Fri Jan  3 15:15:02 2014
+++ src/sys/uvm/uvm_extern.h	Fri Jan  3 21:12:18 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: uvm_extern.h,v 1.187 2014/01/03 15:15:02 dsl Exp $	*/
+/*	$NetBSD: uvm_extern.h,v 1.188 2014/01/03 21:12:18 dsl Exp $	*/
 
 /*
  * Copyright (c) 1997 Charles D. Cranor and Washington University.
@@ -590,9 +590,8 @@ void			uvm_chgkprot(void *, size_t, int)
 void			uvm_proc_fork(struct proc *, struct proc *, bool);
 void			uvm_lwp_fork(struct lwp *, struct lwp *,
 			    void *, size_t, void (*)(void *), void *);
-struct coredump_iostate;
-int			uvm_coredump_walkmap(struct proc *, int (*)(struct proc *,
-			    struct uvm_coredump_state *), void *);
+int			uvm_coredump_walkmap(struct proc *,
+			    int (*)(struct uvm_coredump_state *), void *);
 int			uvm_coredump_count_segs(struct proc *);
 void			uvm_proc_exit(struct proc *);
 void			uvm_lwp_exit(struct lwp *);

Reply via email to