summaryrefslogtreecommitdiffstats
path: root/sys/kern/kern_ktr.c
diff options
context:
space:
mode:
authorjhb <jhb@FreeBSD.org>2001-06-25 23:09:31 +0000
committerjhb <jhb@FreeBSD.org>2001-06-25 23:09:31 +0000
commit46a0597e74ef57deedfef1131bba56e411d06364 (patch)
treee80fb607d138d94d5f5efd90d2af5be3a70c9014 /sys/kern/kern_ktr.c
parent56759fef37a868e1553f0359de10390691af5d1a (diff)
downloadFreeBSD-src-46a0597e74ef57deedfef1131bba56e411d06364.zip
FreeBSD-src-46a0597e74ef57deedfef1131bba56e411d06364.tar.gz
- Replace the unused KTR_IDLELOOP trace class with a new KTR_WITNESS trace
class to trace witness events. - Make the ktr_cpu field of ktr_entry be a standard field rather than one present only in the KTR_EXTEND case. - Move the default definition of KTR_ENTRIES from sys/ktr.h to kern/kern_ktr.c. It has not been needed in the header file since KTR was un-inlined. - Minor include cleanup in kern/kern_ktr.c. - Fiddle with the ktr_cpumask in ktr_tracepoint() to disable KTR events on the current CPU while we are processing an event. - Set the current CPU inside of the critical section to ensure we don't migrate CPU's after the critical section but before we set the CPU.
Diffstat (limited to 'sys/kern/kern_ktr.c')
-rw-r--r--sys/kern/kern_ktr.c31
1 files changed, 17 insertions, 14 deletions
diff --git a/sys/kern/kern_ktr.c b/sys/kern/kern_ktr.c
index 8902ca5..06372b9 100644
--- a/sys/kern/kern_ktr.c
+++ b/sys/kern/kern_ktr.c
@@ -38,19 +38,22 @@
#include "opt_ktr.h"
#include <sys/param.h>
-#include <sys/types.h>
#include <sys/cons.h>
-#include <sys/time.h>
#include <sys/kernel.h>
#include <sys/ktr.h>
#include <sys/libkern.h>
#include <sys/sysctl.h>
#include <sys/systm.h>
+#include <sys/time.h>
#include <machine/globals.h>
#include <machine/stdarg.h>
#include <ddb/ddb.h>
+#ifndef KTR_ENTRIES
+#define KTR_ENTRIES 1024
+#endif
+
#ifndef KTR_MASK
#define KTR_MASK (KTR_GEN)
#endif
@@ -126,30 +129,30 @@ ktr_tracepoint(u_int mask, const char *format, u_long arg1, u_long arg2,
return;
if ((ktr_mask & mask) == 0)
return;
-#ifdef KTR_EXTEND
- if (((1 << KTR_CPU) & ktr_cpumask) == 0)
- return;
-#endif
savecrit = critical_enter();
+ if (((1 << KTR_CPU) & ktr_cpumask) == 0) {
+ critical_exit(savecrit);
+ return;
+ }
+ atomic_clear_int(&ktr_cpumask, 1 << KTR_CPU);
do {
saveindex = ktr_idx;
newindex = (saveindex + 1) & (KTR_ENTRIES - 1);
} while (atomic_cmpset_rel_int(&ktr_idx, saveindex, newindex) == 0);
entry = &ktr_buf[saveindex];
- critical_exit(savecrit);
- if (ktr_mask & KTR_LOCK)
- /*
- * We can't use nanotime with KTR_LOCK, it would cause
- * endless recursion, at least under the Intel
- * architecture.
- */
+ /*
+ * XXX: The ktr_cpumask atomic ops should make this unnecessary.
+ */
+ if ((ktr_mask & (KTR_LOCK | KTR_WITNESS)) != 0)
getnanotime(&entry->ktr_tv);
else
nanotime(&entry->ktr_tv);
+ atomic_set_int(&ktr_cpumask, 1 << KTR_CPU);
+ entry->ktr_cpu = KTR_CPU;
+ critical_exit(savecrit);
#ifdef KTR_EXTEND
entry->ktr_filename = filename;
entry->ktr_line = line;
- entry->ktr_cpu = KTR_CPU;
va_start(ap, format);
vsnprintf(entry->ktr_desc, KTRDESCSIZE, format, ap);
va_end(ap);
OpenPOWER on IntegriCloud