From: Kris Van Hees Date: Tue, 17 Dec 2013 23:08:17 +0000 (-0500) Subject: dtrace: vtimestamp implementation X-Git-Tag: v4.1.12-111.0.20170907_2225~3^2~3^2~102 X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=406d4c28ee994660cc2f19a463fdfcda978c59b8;p=users%2Fjedix%2Flinux-maple.git 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 --- diff --git a/dtrace/dtrace_dif.c b/dtrace/dtrace_dif.c index d39a0a61f63b1..0d0020bb9f3ec 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 524b4d2516dbc..3fa816bbb59ef 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 d0741217e7fcc..bfbf3b46d8806 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 48ddf39b12dc7..73a8b7d160ca2 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 49a8bbf2b959a..39327155f21dc 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 978cdc0bc4408..be23a34fc902e 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) /*