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 *);