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 <dan.duval@oracle.com>
Signed-off-by: Kris Van Hees <kris.van.hees@oracle.com>
*/
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, ...)
{
struct kmem_cache *dtrace_probe_cachep;
static struct idr dtrace_probe_idr;
-static uint64_t dtrace_vtime_references;
static struct task_struct *dtrace_panicked;
#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;
#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 ||
}
#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);
-}
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 *);
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);
*((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
/*
#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)
/*