Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
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;
}