From 406d4c28ee994660cc2f19a463fdfcda978c59b8 Mon Sep 17 00:00:00 2001 From: Kris Van Hees Date: Tue, 17 Dec 2013 18:08:17 -0500 Subject: [PATCH] dtrace: vtimestamp implementation This commit adds DTrace vtimestamp support. It keeps track of how much time a task has spent actually processing on a CPU. The time is set to zero at task creation, and is updated whenever the task leaves a CPU (gets scheduled off), and when the dtrace_probe() function is entered, to enusre that the most recent value of consumed time is reported. Some code got moved around for consistency of the implementation. Orabug: 17741477 Reviewed-by: Dan Duval Signed-off-by: Kris Van Hees --- dtrace/dtrace_dif.c | 2 +- dtrace/dtrace_probe.c | 5 +-- dtrace/dtrace_util.c | 48 --------------------- dtrace/include/dtrace/dtrace_impl.h | 10 +---- dtrace/include/dtrace/dtrace_impl_defines.h | 7 --- dtrace/include/dtrace/types.h | 1 - 6 files changed, 5 insertions(+), 68 deletions(-) diff --git a/dtrace/dtrace_dif.c b/dtrace/dtrace_dif.c index d39a0a61f63b..0d0020bb9f3e 100644 --- a/dtrace/dtrace_dif.c +++ b/dtrace/dtrace_dif.c @@ -47,7 +47,7 @@ size_t dtrace_global_maxsize = 16 * 1024; */ const char dtrace_zero[256] = { 0, }; -static uint64_t dtrace_vtime_references; +uint64_t dtrace_vtime_references; static int dtrace_difo_err(uint_t pc, const char *format, ...) { diff --git a/dtrace/dtrace_probe.c b/dtrace/dtrace_probe.c index 524b4d2516db..3fa816bbb59e 100644 --- a/dtrace/dtrace_probe.c +++ b/dtrace/dtrace_probe.c @@ -45,7 +45,6 @@ dtrace_genid_t dtrace_probegen; struct kmem_cache *dtrace_probe_cachep; static struct idr dtrace_probe_idr; -static uint64_t dtrace_vtime_references; static struct task_struct *dtrace_panicked; @@ -630,12 +629,12 @@ void dtrace_probe(dtrace_id_t id, uintptr_t arg0, uintptr_t arg1, #endif now = dtrace_gethrtime(); - vtime = dtrace_vtime_references != 0; + vtime = (dtrace_vtime_references > 0); if (vtime && ktime_nz(current->dtrace_start)) current->dtrace_vtime = ktime_add(current->dtrace_vtime, - ktime_sub(now,current->dtrace_start)); + ktime_sub(now, current->dtrace_start)); mstate.dtms_difo = NULL; mstate.dtms_probe = probe; diff --git a/dtrace/dtrace_util.c b/dtrace/dtrace_util.c index d0741217e7fc..bfbf3b46d880 100644 --- a/dtrace/dtrace_util.c +++ b/dtrace/dtrace_util.c @@ -30,8 +30,6 @@ #include "dtrace.h" -dtrace_vtime_state_t dtrace_vtime_active = 0; - int dtrace_badattr(const dtrace_attribute_t *a) { return a->dtat_name > DTRACE_STABILITY_MAX || @@ -176,49 +174,3 @@ void dtrace_cred2priv(const cred_t *cr, uint32_t *privp, uid_t *uidp) } #endif } - -void dtrace_vtime_enable(void) -{ - dtrace_vtime_state_t state, nstate = 0; - - do { - state = dtrace_vtime_active; - - switch (state) { - case DTRACE_VTIME_INACTIVE: - nstate = DTRACE_VTIME_ACTIVE; - break; - case DTRACE_VTIME_INACTIVE_TNF: - nstate = DTRACE_VTIME_ACTIVE_TNF; - break; - case DTRACE_VTIME_ACTIVE: - case DTRACE_VTIME_ACTIVE_TNF: - panic("DTrace virtual time already enabled"); - /*NOTREACHED*/ - } - } while (cmpxchg((uint32_t *)&dtrace_vtime_active, state, nstate) != - state); -} - -void dtrace_vtime_disable(void) -{ - dtrace_vtime_state_t state, nstate = 0; - - do { - state = dtrace_vtime_active; - - switch (state) { - case DTRACE_VTIME_ACTIVE: - nstate = DTRACE_VTIME_INACTIVE; - break; - case DTRACE_VTIME_ACTIVE_TNF: - nstate = DTRACE_VTIME_INACTIVE_TNF; - break; - case DTRACE_VTIME_INACTIVE: - case DTRACE_VTIME_INACTIVE_TNF: - panic("DTrace virtual time already disabled"); - /*NOTREACHED*/ - } - } while (cmpxchg((uint32_t *)&dtrace_vtime_active, state, nstate) != - state); -} diff --git a/dtrace/include/dtrace/dtrace_impl.h b/dtrace/include/dtrace/dtrace_impl.h index 48ddf39b12dc..73a8b7d160ca 100644 --- a/dtrace/include/dtrace/dtrace_impl.h +++ b/dtrace/include/dtrace/dtrace_impl.h @@ -552,6 +552,8 @@ extern dtrace_difo_t * dtrace_difo_duplicate(dtrace_difo_t *, dtrace_vstate_t *); extern void dtrace_difo_release(dtrace_difo_t *, dtrace_vstate_t *); +extern uint64_t dtrace_vtime_references; + extern uint64_t dtrace_dif_emulate(dtrace_difo_t *, dtrace_mstate_t *, dtrace_vstate_t *, dtrace_state_t *); @@ -866,14 +868,6 @@ extern int dtrace_getipl(void); extern ktime_t dtrace_gethrestime(void); -extern dtrace_vtime_state_t dtrace_vtime_active; - -extern void dtrace_vtime_enable(void); -extern void dtrace_vtime_disable(void); - -extern ktime_t dtrace_gethrtime(void); -extern ktime_t dtrace_getwalltime(void); - extern dtrace_icookie_t dtrace_interrupt_disable(void); extern void dtrace_interrupt_enable(dtrace_icookie_t); diff --git a/dtrace/include/dtrace/dtrace_impl_defines.h b/dtrace/include/dtrace/dtrace_impl_defines.h index 49a8bbf2b959..39327155f21d 100644 --- a/dtrace/include/dtrace/dtrace_impl_defines.h +++ b/dtrace/include/dtrace/dtrace_impl_defines.h @@ -153,13 +153,6 @@ typedef enum dtrace_speculation_state { *((type *)((uintptr_t)(tomax) + (uintptr_t)(offset))) = (type)(what); \ } while (0) -typedef enum dtrace_vtime_state { - DTRACE_VTIME_INACTIVE = 0, /* No DTrace, no TNF */ - DTRACE_VTIME_ACTIVE, /* DTrace virtual time, no TNF */ - DTRACE_VTIME_INACTIVE_TNF, /* No DTrace, TNF active */ - DTRACE_VTIME_ACTIVE_TNF /* DTrace virtual time _and_ TNF */ -} dtrace_vtime_state_t; - #define KERNELBASE (uintptr_t)_text /* diff --git a/dtrace/include/dtrace/types.h b/dtrace/include/dtrace/types.h index 978cdc0bc440..be23a34fc902 100644 --- a/dtrace/include/dtrace/types.h +++ b/dtrace/include/dtrace/types.h @@ -125,7 +125,6 @@ typedef enum { #define ktime_le(t0, t1) ((t0).tv64 <= (t1).tv64) #define ktime_ge(t0, t1) ((t0).tv64 >= (t1).tv64) #define ktime_gt(t0, t1) ((t0).tv64 > (t1).tv64) -#define ktime_nz(t0) ((t0).tv64 != 0LL) #define ktime_cp(t0, t1) ((t0).tv64 = (t1).tv64) /* -- 2.50.1