]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
dtrace: Make dynamic variable cleanup self-throtling
authorTomas Jedlicka <tomas.jedlicka@oracle.com>
Sun, 2 Jul 2017 19:06:10 +0000 (15:06 -0400)
committerKris Van Hees <kris.van.hees@oracle.com>
Fri, 14 Jul 2017 04:11:43 +0000 (00:11 -0400)
With addition of cyclic_reprogram() it is possible to make dynamic variable cleanup
self throtling by simply reprograming itself from within the handler.

Orabug: 26385177

Signed-off-by: Tomas Jedlicka <tomas.jedlicka@oracle.com>
Reviewed-by: Kris Van Hees <kris.van.hees@oracle.com>
dtrace/dtrace_state.c

index f0f4e128877edb342cf8eb2c4d5d2d5fd1e642d5..95455bd27b843cc6de14a643b361ba8ee322b3f3 100644 (file)
@@ -285,12 +285,17 @@ void dtrace_vstate_fini(dtrace_vstate_t *vstate)
 
 static void dtrace_state_clean(dtrace_state_t *state, ktime_t when)
 {
+       dtrace_optval_t         *opt = state->dts_options;
+
        if (state->dts_activity != DTRACE_ACTIVITY_ACTIVE &&
            state->dts_activity != DTRACE_ACTIVITY_DRAINING)
                return;
 
        dtrace_dynvar_clean(&state->dts_vstate.dtvs_dynvars);
        dtrace_speculation_clean(state);
+
+       cyclic_reprogram(state->dts_cleaner, ns_to_ktime(
+                                               opt[DTRACEOPT_CLEANRATE]));
 }
 
 static void dtrace_state_deadman(dtrace_state_t *state, ktime_t when)
@@ -774,9 +779,11 @@ int dtrace_state_go(dtrace_state_t *state, processorid_t *cpu)
        hdlr.cyh_level = CY_LOW_LEVEL;
 
        when.cyt_when = ktime_set(0, 0);
-       when.cyt_interval = ns_to_ktime(opt[DTRACEOPT_CLEANRATE]);
+       when.cyt_interval.tv64 = CY_INTERVAL_INF;
 
        state->dts_cleaner = cyclic_add(&hdlr, &when);
+       cyclic_reprogram(state->dts_cleaner, ns_to_ktime(
+                                               opt[DTRACEOPT_CLEANRATE]));
 
        hdlr.cyh_func = (cyc_func_t)dtrace_state_deadman;
        hdlr.cyh_arg = (uintptr_t)state;