Date: Sat, 5 Jan 2008 21:45:27 GMT From: John Birrell <jb@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 132584 for review Message-ID: <200801052145.m05LjRTL033696@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=132584 Change 132584 by jb@jb_freebsd1 on 2008/01/05 21:44:43 Implement DTrace's virtual time. Affected files ... .. //depot/projects/dtrace/src/sys/cddl/dev/dtrace/dtrace_load.c#24 edit .. //depot/projects/dtrace/src/sys/cddl/dev/dtrace/dtrace_unload.c#20 edit .. //depot/projects/dtrace/src/sys/cddl/dev/dtrace/dtrace_vtime.c#3 edit .. //depot/projects/dtrace/src/sys/kern/sched_4bsd.c#29 edit .. //depot/projects/dtrace/src/sys/kern/sched_ule.c#22 edit .. //depot/projects/dtrace/src/sys/sys/dtrace_bsd.h#11 edit .. //depot/projects/dtrace/src/sys/sys/proc.h#29 edit Differences ... ==== //depot/projects/dtrace/src/sys/cddl/dev/dtrace/dtrace_load.c#24 (text+ko) ==== @@ -50,10 +50,8 @@ /* Hook into the trap handler. */ dtrace_trap_func = dtrace_trap; -#ifdef DOODAD /* Hang our hook for thread switches. */ dtrace_vtime_switch_func = dtrace_vtime_switch; -#endif /* * XXX This is a short term hack to avoid having to comment ==== //depot/projects/dtrace/src/sys/cddl/dev/dtrace/dtrace_unload.c#20 (text+ko) ==== @@ -163,10 +163,8 @@ * Reset our hook for thread switches, but ensure that vtime isn't * active first. */ -#ifdef DOODAD dtrace_vtime_active = 0; dtrace_vtime_switch_func = NULL; -#endif /* Unhook from the trap handler. */ dtrace_trap_func = NULL; ==== //depot/projects/dtrace/src/sys/cddl/dev/dtrace/dtrace_vtime.c#3 (text+ko) ==== @@ -27,7 +27,6 @@ void dtrace_vtime_enable(void) { -#ifdef DOODAD dtrace_vtime_state_t state, nstate = 0; do { @@ -50,13 +49,11 @@ } while (dtrace_cas32((uint32_t *)&dtrace_vtime_active, state, nstate) != state); -#endif } void dtrace_vtime_disable(void) { -#ifdef DOODAD dtrace_vtime_state_t state, nstate = 0; do { @@ -79,34 +76,24 @@ } while (dtrace_cas32((uint32_t *)&dtrace_vtime_active, state, nstate) != state); -#endif } void dtrace_vtime_switch(kthread_t *next) { -#ifdef DOODAD dtrace_icookie_t cookie; hrtime_t ts; - if (tnf_tracing_active) { - tnf_thread_switch(next); - - if (dtrace_vtime_active == DTRACE_VTIME_INACTIVE_TNF) - return; - } - cookie = dtrace_interrupt_disable(); ts = dtrace_gethrtime(); - if (curthread->td_dtrace_start != 0) { - curthread->td_dtrace_vtime += ts - curthread->td_dtrace_start; - curthread->td_dtrace_start = 0; + if (curthread->t_dtrace_start != 0) { + curthread->t_dtrace_vtime += ts - curthread->t_dtrace_start; + curthread->t_dtrace_start = 0; } if (next != NULL) - next->td_dtrace_start = ts; + next->t_dtrace_start = ts; dtrace_interrupt_enable(cookie); -#endif } ==== //depot/projects/dtrace/src/sys/kern/sched_4bsd.c#29 (text+ko) ==== @@ -59,6 +59,10 @@ #include <sys/pmckern.h> #endif +#ifdef KDTRACE_HOOKS +#include <sys/dtrace_bsd.h> +#endif + /* * INVERSE_ESTCPU_WEIGHT is only suitable for statclock() frequencies in * the range 100-256 Hz (approximately). @@ -880,6 +884,16 @@ #endif /* I feel sleepy */ lock_profile_release_lock(&sched_lock.lock_object); +#ifdef KDTRACE + /* + * If DTrace has set the active vtime enum to anything + * other than INACTIVE (0), then it should have set the + * function to call. + */ + if (dtrace_vtime_active) + (*dtrace_vtime_switch_func)(newtd); +#endif + cpu_switch(td, newtd, td->td_lock); lock_profile_obtain_lock_success(&sched_lock.lock_object, 0, 0, __FILE__, __LINE__); ==== //depot/projects/dtrace/src/sys/kern/sched_ule.c#22 (text+ko) ==== @@ -68,6 +68,10 @@ #include <sys/pmckern.h> #endif +#ifdef KDTRACE_HOOKS +#include <sys/dtrace_bsd.h> +#endif + #include <machine/cpu.h> #include <machine/smp.h> @@ -1896,6 +1900,17 @@ #endif lock_profile_release_lock(&TDQ_LOCKPTR(tdq)->lock_object); TDQ_LOCKPTR(tdq)->mtx_lock = (uintptr_t)newtd; + +#ifdef KDTRACE + /* + * If DTrace has set the active vtime enum to anything + * other than INACTIVE (0), then it should have set the + * function to call. + */ + if (dtrace_vtime_active) + (*dtrace_vtime_switch_func)(newtd); +#endif + cpu_switch(td, newtd, mtx); /* * We may return from cpu_switch on a different cpu. However, ==== //depot/projects/dtrace/src/sys/sys/dtrace_bsd.h#11 (text+ko) ==== @@ -33,6 +33,7 @@ /* Forward definitions: */ struct trapframe; +struct thread; /* * Cyclic clock function type definition used to hook the cyclic @@ -65,6 +66,12 @@ /* Global variable in trap.c */ extern dtrace_invop_func_t dtrace_invop_func; +/* Virtual time hook function type. */ +typedef void (*dtrace_vtime_switch_func_t)(struct thread *); + +extern int dtrace_vtime_active; +extern dtrace_vtime_switch_func_t dtrace_vtime_switch_func; + /* * Functions which allow the dtrace module to check that the kernel * hooks have been compiled with sufficient space for it's private ==== //depot/projects/dtrace/src/sys/sys/proc.h#29 (text+ko) ==== @@ -445,11 +445,6 @@ #define TD_SET_RUNQ(td) (td)->td_state = TDS_RUNQ #define TD_SET_CAN_RUN(td) (td)->td_state = TDS_CAN_RUN -typedef void (*dtrace_vtime_switch_func_t)(struct thread *); - -extern int dtrace_vtime_active; -extern dtrace_vtime_switch_func_t dtrace_vtime_switch_func; - /* * An upcall is used when returning to userland. If a thread does not have * an upcall on return to userland the thread exports its context and exits.
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200801052145.m05LjRTL033696>