sched/numa: Distinguish between the different task_numa_migrate() failure cases
sched:sched_stick_numa is meant to fire when a task is unable to migrate to the preferred node but from the trace, it's possibile to tell the difference between "no CPU found", "migration to idle CPU failed" and "tasks could not be swapped". Extend the tracepoint accordingly. Signed-off-by: Mel Gorman <mgorman@techsingularity.net> [ Minor edits. ] Signed-off-by: Ingo Molnar <mingo@kernel.org> Acked-by: Peter Zijlstra <a.p.zijlstra@chello.nl> Cc: Steven Rostedt <rostedt@goodmis.org> Cc: Vincent Guittot <vincent.guittot@linaro.org> Cc: Juri Lelli <juri.lelli@redhat.com> Cc: Dietmar Eggemann <dietmar.eggemann@arm.com> Cc: Valentin Schneider <valentin.schneider@arm.com> Cc: Phil Auld <pauld@redhat.com> Cc: Hillf Danton <hdanton@sina.com> Link: https://lore.kernel.org/r/20200224095223.13361-4-mgorman@techsingularity.net
This commit is contained in:
parent
f22aef4afb
commit
b2b2042b20
|
@ -487,7 +487,11 @@ TRACE_EVENT(sched_process_hang,
|
|||
);
|
||||
#endif /* CONFIG_DETECT_HUNG_TASK */
|
||||
|
||||
DECLARE_EVENT_CLASS(sched_move_task_template,
|
||||
/*
|
||||
* Tracks migration of tasks from one runqueue to another. Can be used to
|
||||
* detect if automatic NUMA balancing is bouncing between nodes.
|
||||
*/
|
||||
TRACE_EVENT(sched_move_numa,
|
||||
|
||||
TP_PROTO(struct task_struct *tsk, int src_cpu, int dst_cpu),
|
||||
|
||||
|
@ -519,23 +523,7 @@ DECLARE_EVENT_CLASS(sched_move_task_template,
|
|||
__entry->dst_cpu, __entry->dst_nid)
|
||||
);
|
||||
|
||||
/*
|
||||
* Tracks migration of tasks from one runqueue to another. Can be used to
|
||||
* detect if automatic NUMA balancing is bouncing between nodes
|
||||
*/
|
||||
DEFINE_EVENT(sched_move_task_template, sched_move_numa,
|
||||
TP_PROTO(struct task_struct *tsk, int src_cpu, int dst_cpu),
|
||||
|
||||
TP_ARGS(tsk, src_cpu, dst_cpu)
|
||||
);
|
||||
|
||||
DEFINE_EVENT(sched_move_task_template, sched_stick_numa,
|
||||
TP_PROTO(struct task_struct *tsk, int src_cpu, int dst_cpu),
|
||||
|
||||
TP_ARGS(tsk, src_cpu, dst_cpu)
|
||||
);
|
||||
|
||||
TRACE_EVENT(sched_swap_numa,
|
||||
DECLARE_EVENT_CLASS(sched_numa_pair_template,
|
||||
|
||||
TP_PROTO(struct task_struct *src_tsk, int src_cpu,
|
||||
struct task_struct *dst_tsk, int dst_cpu),
|
||||
|
@ -561,11 +549,11 @@ TRACE_EVENT(sched_swap_numa,
|
|||
__entry->src_ngid = task_numa_group_id(src_tsk);
|
||||
__entry->src_cpu = src_cpu;
|
||||
__entry->src_nid = cpu_to_node(src_cpu);
|
||||
__entry->dst_pid = task_pid_nr(dst_tsk);
|
||||
__entry->dst_tgid = task_tgid_nr(dst_tsk);
|
||||
__entry->dst_ngid = task_numa_group_id(dst_tsk);
|
||||
__entry->dst_pid = dst_tsk ? task_pid_nr(dst_tsk) : 0;
|
||||
__entry->dst_tgid = dst_tsk ? task_tgid_nr(dst_tsk) : 0;
|
||||
__entry->dst_ngid = dst_tsk ? task_numa_group_id(dst_tsk) : 0;
|
||||
__entry->dst_cpu = dst_cpu;
|
||||
__entry->dst_nid = cpu_to_node(dst_cpu);
|
||||
__entry->dst_nid = dst_cpu >= 0 ? cpu_to_node(dst_cpu) : -1;
|
||||
),
|
||||
|
||||
TP_printk("src_pid=%d src_tgid=%d src_ngid=%d src_cpu=%d src_nid=%d dst_pid=%d dst_tgid=%d dst_ngid=%d dst_cpu=%d dst_nid=%d",
|
||||
|
@ -575,6 +563,23 @@ TRACE_EVENT(sched_swap_numa,
|
|||
__entry->dst_cpu, __entry->dst_nid)
|
||||
);
|
||||
|
||||
DEFINE_EVENT(sched_numa_pair_template, sched_stick_numa,
|
||||
|
||||
TP_PROTO(struct task_struct *src_tsk, int src_cpu,
|
||||
struct task_struct *dst_tsk, int dst_cpu),
|
||||
|
||||
TP_ARGS(src_tsk, src_cpu, dst_tsk, dst_cpu)
|
||||
);
|
||||
|
||||
DEFINE_EVENT(sched_numa_pair_template, sched_swap_numa,
|
||||
|
||||
TP_PROTO(struct task_struct *src_tsk, int src_cpu,
|
||||
struct task_struct *dst_tsk, int dst_cpu),
|
||||
|
||||
TP_ARGS(src_tsk, src_cpu, dst_tsk, dst_cpu)
|
||||
);
|
||||
|
||||
|
||||
/*
|
||||
* Tracepoint for waking a polling cpu without an IPI.
|
||||
*/
|
||||
|
|
|
@ -1849,7 +1849,7 @@ static int task_numa_migrate(struct task_struct *p)
|
|||
|
||||
/* No better CPU than the current one was found. */
|
||||
if (env.best_cpu == -1) {
|
||||
trace_sched_stick_numa(p, env.src_cpu, -1);
|
||||
trace_sched_stick_numa(p, env.src_cpu, NULL, -1);
|
||||
return -EAGAIN;
|
||||
}
|
||||
|
||||
|
@ -1858,7 +1858,7 @@ static int task_numa_migrate(struct task_struct *p)
|
|||
ret = migrate_task_to(p, env.best_cpu);
|
||||
WRITE_ONCE(best_rq->numa_migrate_on, 0);
|
||||
if (ret != 0)
|
||||
trace_sched_stick_numa(p, env.src_cpu, env.best_cpu);
|
||||
trace_sched_stick_numa(p, env.src_cpu, NULL, env.best_cpu);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -1866,7 +1866,7 @@ static int task_numa_migrate(struct task_struct *p)
|
|||
WRITE_ONCE(best_rq->numa_migrate_on, 0);
|
||||
|
||||
if (ret != 0)
|
||||
trace_sched_stick_numa(p, env.src_cpu, task_cpu(env.best_task));
|
||||
trace_sched_stick_numa(p, env.src_cpu, env.best_task, env.best_cpu);
|
||||
put_task_struct(env.best_task);
|
||||
return ret;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue