static void wakeup_cb(unsigned long ptr) { struct latency_tracker_event *data = (struct latency_tracker_event *) ptr; struct schedkey *key = (struct schedkey *) data->tkey.key; struct wakeup_tracker *wakeup_priv = (struct wakeup_tracker *) data->priv; struct task_struct *p; u64 delay; if (data->cb_flag != LATENCY_TRACKER_CB_NORMAL) return; delay = (data->end_ts - data->start_ts) / 1000; #ifdef SCHEDWORST usec_threshold = delay; #endif rcu_read_lock(); p = pid_task(find_vpid(key->pid), PIDTYPE_PID); if (!p) goto end_unlock; trace_wakeup_latency(p->comm, key->pid, data->end_ts - data->start_ts, data->cb_flag); printk("wakeup_latency: (%d) %s (%d), %llu us\n", data->cb_flag, p->comm, key->pid, delay); rcu_read_unlock(); cnt++; wakeup_handle_proc(wakeup_priv, data); goto end; end_unlock: rcu_read_unlock(); end: return; }
static void wakeup_cb(struct latency_tracker_event_ctx *ctx) { uint64_t end_ts = latency_tracker_event_ctx_get_end_ts(ctx); uint64_t start_ts = latency_tracker_event_ctx_get_start_ts(ctx); enum latency_tracker_cb_flag cb_flag = latency_tracker_event_ctx_get_cb_flag(ctx); struct schedkey *key = (struct schedkey *) latency_tracker_event_ctx_get_key(ctx)->key; struct wakeup_tracker *wakeup_priv = latency_tracker_event_ctx_get_priv(ctx); struct task_struct *p; u64 delay; if (cb_flag != LATENCY_TRACKER_CB_NORMAL) return; delay = (end_ts - start_ts) / 1000; #ifdef SCHEDWORST usec_threshold = delay; #endif rcu_read_lock(); p = pid_task(find_vpid(key->pid), PIDTYPE_PID); if (!p) goto end_unlock; trace_latency_tracker_wakeup(p->comm, key->pid, end_ts - start_ts, cb_flag); rcu_read_unlock(); cnt++; wakeup_handle_proc(wakeup_priv, end_ts); goto end; end_unlock: rcu_read_unlock(); end: return; }