]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
dtrace: vtimestamp implementation
authorKris Van Hees <kris.van.hees@oracle.com>
Tue, 17 Dec 2013 23:08:17 +0000 (18:08 -0500)
committerKris Van Hees <kris.van.hees@oracle.com>
Fri, 20 Dec 2013 12:01:36 +0000 (07:01 -0500)
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>
dtrace/dtrace_dif.c
dtrace/dtrace_probe.c
dtrace/dtrace_util.c
dtrace/include/dtrace/dtrace_impl.h
dtrace/include/dtrace/dtrace_impl_defines.h
dtrace/include/dtrace/types.h

index d39a0a61f63b14965298aaf43b27d6608d415740..0d0020bb9f3ec42f2dfdd7b34a5c5f8f44025035 100644 (file)
@@ -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, ...)
 {
index 524b4d2516dbc8c75ab17a97d9a017f2040ca67c..3fa816bbb59ef14ad3b5a075717a72c12c77f1b7 100644 (file)
@@ -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;
index d0741217e7fcc41b380d05f2b140ec09e3ab27f1..bfbf3b46d88068c556646524a2bccb7fe02193a9 100644 (file)
@@ -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);
-}
index 48ddf39b12dc78bac88190b29254c7b8d36797e6..73a8b7d160ca2f1b408fd64bf0f88c4e15dd7a1a 100644 (file)
@@ -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);
 
index 49a8bbf2b959a5e7bbfda3e96e410cec3ca3b1ec..39327155f21dc3facb3e84850f3fbfe5854ef25e 100644 (file)
@@ -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
 
 /*
index 978cdc0bc44085140f2fbeac314a0e690b82aa04..be23a34fc902ef66ee5b1d9ee744510a2b41b98d 100644 (file)
@@ -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)
 
 /*