PERFORCE change 102310 for review
John Baldwin
jhb at FreeBSD.org
Mon Jul 24 20:20:08 UTC 2006
http://perforce.freebsd.org/chv.cgi?CH=102310
Change 102310 by jhb at jhb_mutex on 2006/07/24 20:19:06
Synchronize syscall() routines:
- Add KTR_SYSC tracing to amd64/ia32, ia64/ia32, and ia64.
- Add PTRACESTOP invocations to amd64/ia32, ia64/ia32, and powerpc.
Expand and synchronize locking checks for all platforms to keep the
WITNESS_WARN, add KASSERT()'s checking td_critnest and td_locks,
and remove mtx_assert()'s for sched_lock and Giant.
Affected files ...
.. //depot/projects/smpng/sys/amd64/amd64/trap.c#45 edit
.. //depot/projects/smpng/sys/amd64/ia32/ia32_syscall.c#12 edit
.. //depot/projects/smpng/sys/arm/arm/trap.c#18 edit
.. //depot/projects/smpng/sys/i386/i386/trap.c#94 edit
.. //depot/projects/smpng/sys/ia64/ia32/ia32_trap.c#7 edit
.. //depot/projects/smpng/sys/ia64/ia64/trap.c#81 edit
.. //depot/projects/smpng/sys/powerpc/powerpc/trap.c#49 edit
.. //depot/projects/smpng/sys/sparc64/sparc64/trap.c#68 edit
Differences ...
==== //depot/projects/smpng/sys/amd64/amd64/trap.c#45 (text+ko) ====
@@ -874,6 +874,19 @@
}
/*
+ * Check for misbehavior.
+ */
+ KASSERT(td->td_critnest == 0,
+ ("System call %s returning in a critical section",
+ (code >= 0 && code < SYS_MAXSYSCALL) ? syscallnames[code] : "???"));
+ KASSERT(td->td_locks == 0,
+ ("System call %s returning with %d locks held",
+ (code >= 0 && code < SYS_MAXSYSCALL) ? syscallnames[code] : "???",
+ td->td_locks));
+ WITNESS_WARN(WARN_PANIC, NULL, "System call %s returning",
+ (code >= 0 && code < SYS_MAXSYSCALL) ? syscallnames[code] : "???");
+
+ /*
* Handle reschedule and other end-of-syscall issues
*/
userret(td, &frame);
@@ -894,9 +907,4 @@
STOPEVENT(p, S_SCX, code);
PTRACESTOP_SC(p, td, S_PT_SCX);
-
- WITNESS_WARN(WARN_PANIC, NULL, "System call %s returning",
- (code >= 0 && code < SYS_MAXSYSCALL) ? syscallnames[code] : "???");
- mtx_assert(&sched_lock, MA_NOTOWNED);
- mtx_assert(&Giant, MA_NOTOWNED);
}
==== //depot/projects/smpng/sys/amd64/ia32/ia32_syscall.c#12 (text+ko) ====
@@ -171,6 +171,9 @@
if (KTRPOINT(td, KTR_SYSCALL))
ktrsyscall(code, narg, args64);
#endif
+ CTR4(KTR_SYSC, "syscall enter thread %p pid %d proc %s code %d", td,
+ td->td_proc->p_pid, td->td_proc->p_comm, code);
+
/*
* Try to run the syscall without Giant if the syscall
* is MP safe.
@@ -184,6 +187,8 @@
STOPEVENT(p, S_SCE, narg);
+ PTRACESTOP_SC(p, td, S_PT_SCE);
+
AUDIT_SYSCALL_ENTER(code, td);
error = (*callp->sy_call)(td, args64);
AUDIT_SYSCALL_EXIT(error, td);
@@ -238,10 +243,25 @@
}
/*
+ * Check for misbehavior.
+ */
+ KASSERT(td->td_critnest == 0,
+ ("System call %s returning in a critical section",
+ (code >= 0 && code < SYS_MAXSYSCALL) ? freebsd32_syscallnames[code] : "???"));
+ KASSERT(td->td_locks == 0,
+ ("System call %s returning with %d locks held",
+ (code >= 0 && code < SYS_MAXSYSCALL) ? freebsd32_syscallnames[code] : "???",
+ td->td_locks));
+ WITNESS_WARN(WARN_PANIC, NULL, "System call %s returning",
+ (code >= 0 && code < SYS_MAXSYSCALL) ? freebsd32_syscallnames[code] : "???");
+
+ /*
* Handle reschedule and other end-of-syscall issues
*/
userret(td, &frame);
+ CTR4(KTR_SYSC, "syscall exit thread %p pid %d proc %s code %d", td,
+ td->td_proc->p_pid, td->td_proc->p_comm, code);
#ifdef KTRACE
if (KTRPOINT(td, KTR_SYSRET))
ktrsysret(code, error, td->td_retval[0]);
@@ -254,10 +274,7 @@
*/
STOPEVENT(p, S_SCX, code);
- WITNESS_WARN(WARN_PANIC, NULL, "System call %s returning",
- (code >= 0 && code < SYS_MAXSYSCALL) ? freebsd32_syscallnames[code] : "???");
- mtx_assert(&sched_lock, MA_NOTOWNED);
- mtx_assert(&Giant, MA_NOTOWNED);
+ PTRACESTOP_SC(p, td, S_PT_SCX);
}
==== //depot/projects/smpng/sys/arm/arm/trap.c#18 (text+ko) ====
@@ -979,8 +979,17 @@
}
if (locked && (callp->sy_narg & SYF_MPSAFE) == 0)
mtx_unlock(&Giant);
-
-
+
+ KASSERT(td->td_critnest == 0,
+ ("System call %s returning in a critical section",
+ (code >= 0 && code < SYS_MAXSYSCALL) ? syscallnames[code] : "???"));
+ KASSERT(td->td_locks == 0,
+ ("System call %s returning with %d locks held",
+ (code >= 0 && code < SYS_MAXSYSCALL) ? syscallnames[code] : "???",
+ td->td_locks));
+ WITNESS_WARN(WARN_PANIC, NULL, "System call %s returning",
+ (code >= 0 && code < SYS_MAXSYSCALL) ? syscallnames[code] : "???");
+
userret(td, frame);
CTR4(KTR_SYSC, "syscall exit thread %p pid %d proc %s code %d", td,
td->td_proc->p_pid, td->td_proc->p_comm, code);
@@ -991,8 +1000,6 @@
if (KTRPOINT(td, KTR_SYSRET))
ktrsysret(code, error, td->td_retval[0]);
#endif
- mtx_assert(&sched_lock, MA_NOTOWNED);
- mtx_assert(&Giant, MA_NOTOWNED);
}
void
==== //depot/projects/smpng/sys/i386/i386/trap.c#94 (text+ko) ====
@@ -1065,6 +1065,19 @@
}
/*
+ * Check for misbehavior.
+ */
+ KASSERT(td->td_critnest == 0,
+ ("System call %s returning in a critical section",
+ (code >= 0 && code < SYS_MAXSYSCALL) ? syscallnames[code] : "???"));
+ KASSERT(td->td_locks == 0,
+ ("System call %s returning with %d locks held",
+ (code >= 0 && code < SYS_MAXSYSCALL) ? syscallnames[code] : "???",
+ td->td_locks));
+ WITNESS_WARN(WARN_PANIC, NULL, "System call %s returning",
+ (code >= 0 && code < SYS_MAXSYSCALL) ? syscallnames[code] : "???");
+
+ /*
* Handle reschedule and other end-of-syscall issues
*/
userret(td, &frame);
@@ -1085,10 +1098,5 @@
STOPEVENT(p, S_SCX, code);
PTRACESTOP_SC(p, td, S_PT_SCX);
-
- WITNESS_WARN(WARN_PANIC, NULL, "System call %s returning",
- (code >= 0 && code < SYS_MAXSYSCALL) ? syscallnames[code] : "???");
- mtx_assert(&sched_lock, MA_NOTOWNED);
- mtx_assert(&Giant, MA_NOTOWNED);
}
==== //depot/projects/smpng/sys/ia64/ia32/ia32_trap.c#7 (text+ko) ====
@@ -112,6 +112,9 @@
if (KTRPOINT(td, KTR_SYSCALL))
ktrsyscall(code, narg, args64);
#endif
+ CTR4(KTR_SYSC, "syscall enter thread %p pid %d proc %s code %d", td,
+ td->td_proc->p_pid, td->td_proc->p_comm, code);
+
/*
* Try to run the syscall without Giant if the syscall
* is MP safe.
@@ -125,6 +128,8 @@
STOPEVENT(p, S_SCE, narg);
+ PTRACESTOP_SC(p, td, S_PT_SCE);
+
error = (*callp->sy_call)(td, args64);
}
@@ -176,6 +181,24 @@
trapsignal(td, &ksi);
}
+ /*
+ * Check for misbehavior.
+ */
+ KASSERT(td->td_critnest == 0,
+ ("System call %s returning in a critical section",
+ (code >= 0 && code < SYS_MAXSYSCALL) ? syscallnames[code] : "???"));
+ KASSERT(td->td_locks == 0,
+ ("System call %s returning with %d locks held",
+ (code >= 0 && code < SYS_MAXSYSCALL) ? syscallnames[code] : "???",
+ td->td_locks));
+ WITNESS_WARN(WARN_PANIC, NULL, "System call %s returning",
+ (code >= 0 && code < SYS_MAXSYSCALL) ? syscallnames[code] : "???");
+
+ /*
+ * End of syscall tracing.
+ */
+ CTR4(KTR_SYSC, "syscall exit thread %p pid %d proc %s code %d", td,
+ td->td_proc->p_pid, td->td_proc->p_comm, code);
#ifdef KTRACE
if (KTRPOINT(td, KTR_SYSRET))
ktrsysret(code, error, td->td_retval[0]);
@@ -188,10 +211,7 @@
*/
STOPEVENT(p, S_SCX, code);
- WITNESS_WARN(WARN_PANIC, NULL, "System call %s returning",
- (code >= 0 && code < SYS_MAXSYSCALL) ? syscallnames[code] : "???");
- mtx_assert(&sched_lock, MA_NOTOWNED);
- mtx_assert(&Giant, MA_NOTOWNED);
+ PTRACESTOP_SC(p, td, S_PT_SCX);
}
/*
==== //depot/projects/smpng/sys/ia64/ia64/trap.c#81 (text+ko) ====
@@ -1007,6 +1007,8 @@
if (KTRPOINT(td, KTR_SYSCALL))
ktrsyscall(code, (callp->sy_narg & SYF_ARGMASK), args);
#endif
+ CTR4(KTR_SYSC, "syscall enter thread %p pid %d proc %s code %d", td,
+ td->td_proc->p_pid, td->td_proc->p_comm, code);
td->td_retval[0] = 0;
td->td_retval[1] = 0;
@@ -1046,8 +1048,26 @@
}
}
+ /*
+ * Check for misbehavior.
+ */
+ KASSERT(td->td_critnest == 0,
+ ("System call %s returning in a critical section",
+ (code >= 0 && code < SYS_MAXSYSCALL) ? syscallnames[code] : "???"));
+ KASSERT(td->td_locks == 0,
+ ("System call %s returning with %d locks held",
+ (code >= 0 && code < SYS_MAXSYSCALL) ? syscallnames[code] : "???",
+ td->td_locks));
+ WITNESS_WARN(WARN_PANIC, NULL, "System call %s returning",
+ (code >= 0 && code < SYS_MAXSYSCALL) ? syscallnames[code] : "???");
+
+ /*
+ * Handle reschedule and other end-of-syscall issues
+ */
userret(td, tf);
+ CTR4(KTR_SYSC, "syscall exit thread %p pid %d proc %s code %d", td,
+ td->td_proc->p_pid, td->td_proc->p_comm, code);
#ifdef KTRACE
if (KTRPOINT(td, KTR_SYSRET))
ktrsysret(code, error, td->td_retval[0]);
@@ -1062,10 +1082,5 @@
PTRACESTOP_SC(p, td, S_PT_SCX);
- WITNESS_WARN(WARN_PANIC, NULL, "System call %s returning",
- (code >= 0 && code < SYS_MAXSYSCALL) ? syscallnames[code] : "???");
- mtx_assert(&sched_lock, MA_NOTOWNED);
- mtx_assert(&Giant, MA_NOTOWNED);
-
return (error);
}
==== //depot/projects/smpng/sys/powerpc/powerpc/trap.c#49 (text+ko) ====
@@ -420,6 +420,8 @@
STOPEVENT(p, S_SCE, narg);
+ PTRACESTOP_SC(p, td, S_PT_SCE);
+
error = (*callp->sy_call)(td, params);
CTR3(KTR_SYSC, "syscall: p=%s %s ret=%x", p->p_comm,
@@ -467,6 +469,19 @@
if ((callp->sy_narg & SYF_MPSAFE) == 0)
mtx_unlock(&Giant);
+ /*
+ * Check for misbehavior.
+ */
+ KASSERT(td->td_critnest == 0,
+ ("System call %s returning in a critical section",
+ (code >= 0 && code < SYS_MAXSYSCALL) ? syscallnames[code] : "???"));
+ KASSERT(td->td_locks == 0,
+ ("System call %s returning with %d locks held",
+ (code >= 0 && code < SYS_MAXSYSCALL) ? syscallnames[code] : "???",
+ td->td_locks));
+ WITNESS_WARN(WARN_PANIC, NULL, "System call %s returning",
+ (code >= 0 && code < SYS_MAXSYSCALL) ? syscallnames[code] : "???");
+
#ifdef KTRACE
if (KTRPOINT(td, KTR_SYSRET))
ktrsysret(code, error, td->td_retval[0]);
@@ -477,10 +492,7 @@
*/
STOPEVENT(p, S_SCX, code);
- WITNESS_WARN(WARN_PANIC, NULL, "System call %s returning",
- (code >= 0 && code < SYS_MAXSYSCALL) ? syscallnames[code] : "???");
- mtx_assert(&sched_lock, MA_NOTOWNED);
- mtx_assert(&Giant, MA_NOTOWNED);
+ PTRACESTOP_SC(p, td, S_PT_SCX);
}
static int
==== //depot/projects/smpng/sys/sparc64/sparc64/trap.c#68 (text+ko) ====
@@ -648,6 +648,19 @@
mtx_unlock(&Giant);
/*
+ * Check for misbehavior.
+ */
+ KASSERT(td->td_critnest == 0,
+ ("System call %s returning in a critical section",
+ (code >= 0 && code < SYS_MAXSYSCALL) ? syscallnames[code] : "???"));
+ KASSERT(td->td_locks == 0,
+ ("System call %s returning with %d locks held",
+ (code >= 0 && code < SYS_MAXSYSCALL) ? syscallnames[code] : "???",
+ td->td_locks));
+ WITNESS_WARN(WARN_PANIC, NULL, "System call %s returning",
+ (code >= 0 && code < SYS_MAXSYSCALL) ? syscallnames[code] : "???");
+
+ /*
* Handle reschedule and other end-of-syscall issues
*/
userret(td, tf);
@@ -664,9 +677,4 @@
STOPEVENT(p, S_SCX, code);
PTRACESTOP_SC(p, td, S_PT_SCX);
-
- WITNESS_WARN(WARN_PANIC, NULL, "System call %s returning",
- (code >= 0 && code < SYS_MAXSYSCALL) ? syscallnames[code] : "???");
- mtx_assert(&sched_lock, MA_NOTOWNED);
- mtx_assert(&Giant, MA_NOTOWNED);
}
More information about the p4-projects
mailing list