diff options
author | jhb <jhb@FreeBSD.org> | 2001-06-25 23:09:31 +0000 |
---|---|---|
committer | jhb <jhb@FreeBSD.org> | 2001-06-25 23:09:31 +0000 |
commit | 46a0597e74ef57deedfef1131bba56e411d06364 (patch) | |
tree | e80fb607d138d94d5f5efd90d2af5be3a70c9014 /sys/kern/kern_ktr.c | |
parent | 56759fef37a868e1553f0359de10390691af5d1a (diff) | |
download | FreeBSD-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.c | 31 |
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); |