LT_PROBE_DEFINE(sched_waking, struct task_struct *p, int success) #endif { struct schedkey key; int i; enum latency_tracker_event_in_ret ret; if (!latency_tracker_get_tracking_on(tracker)) return; if (!p || !p->pid) return; /* * Make sure we won't wait for a process already running on another CPU. */ for (i = 0; i < NR_CPUS; i++) if (current_pid[i] == p->pid) return; key.pid = p->pid; ret = latency_tracker_event_in(tracker, &key, sizeof(key), 1, latency_tracker_get_priv(tracker)); if (ret == LATENCY_TRACKER_FULL) { // printk("latency_tracker sched: no more free events, consider " // "increasing the max_events parameter\n"); } else if (ret) { // printk("latency_tracker sched: error adding event\n"); } }
static void probe_sched_wakeup(void *ignore, struct task_struct *p, int success) { struct schedkey key; u64 thresh, timeout; int i; enum latency_tracker_event_in_ret ret; if (!p || !p->pid) return; /* * Make sure we won't wait for a process already running on another CPU. */ for (i = 0; i < NR_CPUS; i++) if (current_pid[i] == p->pid) return; key.pid = p->pid; thresh = usec_threshold * 1000; timeout = usec_timeout * 1000; ret = latency_tracker_event_in(tracker, &key, sizeof(key), thresh, wakeup_cb, timeout, 1, latency_tracker_get_priv(tracker)); if (ret == LATENCY_TRACKER_FULL) { // printk("latency_tracker sched: no more free events, consider " // "increasing the max_events parameter\n"); } else if (ret) { printk("latency_tracker sched: error adding event\n"); } }
static void __exit wakeup_latency_exit(void) { uint64_t skipped; struct wakeup_tracker *wakeup_priv; lttng_wrapper_tracepoint_probe_unregister("sched_waking", probe_sched_waking, NULL); lttng_wrapper_tracepoint_probe_unregister("sched_switch", probe_sched_switch, NULL); tracepoint_synchronize_unregister(); skipped = latency_tracker_skipped_count(tracker); wakeup_priv = latency_tracker_get_priv(tracker); wakeup_destroy_priv(wakeup_priv); latency_tracker_destroy(tracker); printk("Missed events : %llu\n", skipped); printk("Total wakeup alerts : %d\n", cnt); }