PERFORCE change 182536 for review
John Baldwin
jhb at FreeBSD.org
Tue Aug 17 19:52:41 UTC 2010
http://p4web.freebsd.org/@@182536?ac=10
Change 182536 by jhb at jhb_fiver on 2010/08/17 19:51:45
Move ktrace logic for fork() and exec() into kern_ktrace.c.
Affected files ...
.. //depot/projects/smpng/sys/kern/kern_exec.c#131 edit
.. //depot/projects/smpng/sys/kern/kern_fork.c#126 edit
.. //depot/projects/smpng/sys/kern/kern_ktrace.c#74 edit
.. //depot/projects/smpng/sys/sys/ktrace.h#18 edit
Differences ...
==== //depot/projects/smpng/sys/kern/kern_exec.c#131 (text+ko) ====
@@ -661,16 +661,8 @@
setsugid(p);
#ifdef KTRACE
- if (p->p_tracevp != NULL &&
- priv_check_cred(oldcred, PRIV_DEBUG_DIFFCRED, 0)) {
- mtx_lock(&ktrace_mtx);
- p->p_traceflag = 0;
- tracevp = p->p_tracevp;
- p->p_tracevp = NULL;
- tracecred = p->p_tracecred;
- p->p_tracecred = NULL;
- mtx_unlock(&ktrace_mtx);
- }
+ if (priv_check_cred(oldcred, PRIV_DEBUG_DIFFCRED, 0))
+ ktrprocexec(p, &tracecred, &tracevp);
#endif
/*
* Close any file descriptors 0..2 that reference procfs,
==== //depot/projects/smpng/sys/kern/kern_fork.c#126 (text+ko) ====
@@ -645,21 +645,7 @@
callout_init(&p2->p_itcallout, CALLOUT_MPSAFE);
#ifdef KTRACE
- /*
- * Copy traceflag and tracefile if enabled.
- */
- mtx_lock(&ktrace_mtx);
- KASSERT(p2->p_tracevp == NULL, ("new process has a ktrace vnode"));
- if (p1->p_traceflag & KTRFAC_INHERIT) {
- p2->p_traceflag = p1->p_traceflag;
- if ((p2->p_tracevp = p1->p_tracevp) != NULL) {
- VREF(p2->p_tracevp);
- KASSERT(p1->p_tracecred != NULL,
- ("ktrace vnode with no cred"));
- p2->p_tracecred = crhold(p1->p_tracecred);
- }
- }
- mtx_unlock(&ktrace_mtx);
+ ktrprocfork(p1, p2);
#endif
/*
==== //depot/projects/smpng/sys/kern/kern_ktrace.c#74 (text+ko) ====
@@ -126,7 +126,7 @@
0, "Maximum size of genio event payload");
static int print_message = 1;
-struct mtx ktrace_mtx;
+static struct mtx ktrace_mtx;
static struct sx ktrace_sx;
static void ktrace_init(void *dummy);
@@ -467,7 +467,22 @@
}
/*
- * When a process exits drain per-process asynchronous trace records
+ * When a setuid process execs, disable tracing.
+ *
+ * XXX: We toss any pending asynchronous records.
+ */
+void
+ktrprocexec(struct proc *p, struct ucred **uc, struct vnode **vp)
+{
+
+ PROC_LOCK_ASSERT(p, MA_OWNED);
+ mtx_lock(&ktrace_mtx);
+ ktr_freeproc(p, uc, vp);
+ mtx_unlock(&ktrace_mtx);
+}
+
+/*
+ * When a process exits, drain per-process asynchronous trace records
* and disable tracing.
*/
void
@@ -502,6 +517,29 @@
}
/*
+ * When a process forks, enable tracing in the new process if needed.
+ */
+void
+ktrprocfork(struct proc *p1, struct proc *p2)
+{
+
+ PROC_LOCK_ASSERT(p1, MA_OWNED);
+ PROC_LOCK_ASSERT(p2, MA_OWNED);
+ mtx_lock(&ktrace_mtx);
+ KASSERT(p2->p_tracevp == NULL, ("new process has a ktrace vnode"));
+ if (p1->p_traceflag & KTRFAC_INHERIT) {
+ p2->p_traceflag = p1->p_traceflag;
+ if ((p2->p_tracevp = p1->p_tracevp) != NULL) {
+ VREF(p2->p_tracevp);
+ KASSERT(p1->p_tracecred != NULL,
+ ("ktrace vnode with no cred"));
+ p2->p_tracecred = crhold(p1->p_tracecred);
+ }
+ }
+ mtx_unlock(&ktrace_mtx);
+}
+
+/*
* When a thread returns, drain any asynchronous records generated by the
* system call.
*/
==== //depot/projects/smpng/sys/sys/ktrace.h#18 (text+ko) ====
@@ -73,10 +73,6 @@
if (KTRCHECKDRAIN(td)) \
ktruserret(td); \
} while (0)
-#define KTRPROCEXIT(td) do { \
- if (KTRCHECKDRAIN(td)) \
- ktrprocexit(td); \
-} while (0)
/*
* ktrace record types
@@ -195,8 +191,6 @@
#define KTRFAC_DROP 0x20000000 /* last event was dropped */
#ifdef _KERNEL
-extern struct mtx ktrace_mtx;
-
void ktrnamei(char *);
void ktrcsw(int, int);
void ktrpsig(int, sig_t, sigset_t *, int);
@@ -204,7 +198,9 @@
void ktrsyscall(int, int narg, register_t args[]);
void ktrsysctl(int *name, u_int namelen);
void ktrsysret(int, int, register_t);
+void ktrprocexec(struct proc *, struct ucred **, struct vnode **);
void ktrprocexit(struct thread *);
+void ktrprocfork(struct proc *, struct proc *);
void ktruserret(struct thread *);
void ktrstruct(const char *, void *, size_t);
#define ktrsockaddr(s) \
More information about the p4-projects
mailing list