Commit b2b2042b authored by Mel Gorman's avatar Mel Gorman Committed by Ingo Molnar

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: default avatarMel Gorman <mgorman@techsingularity.net>
[ Minor edits. ]
Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
Acked-by: default avatarPeter 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
parent f22aef4a
...@@ -487,7 +487,11 @@ TRACE_EVENT(sched_process_hang, ...@@ -487,7 +487,11 @@ TRACE_EVENT(sched_process_hang,
); );
#endif /* CONFIG_DETECT_HUNG_TASK */ #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), TP_PROTO(struct task_struct *tsk, int src_cpu, int dst_cpu),
...@@ -519,23 +523,7 @@ DECLARE_EVENT_CLASS(sched_move_task_template, ...@@ -519,23 +523,7 @@ DECLARE_EVENT_CLASS(sched_move_task_template,
__entry->dst_cpu, __entry->dst_nid) __entry->dst_cpu, __entry->dst_nid)
); );
/* DECLARE_EVENT_CLASS(sched_numa_pair_template,
* 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,
TP_PROTO(struct task_struct *src_tsk, int src_cpu, TP_PROTO(struct task_struct *src_tsk, int src_cpu,
struct task_struct *dst_tsk, int dst_cpu), struct task_struct *dst_tsk, int dst_cpu),
...@@ -561,11 +549,11 @@ TRACE_EVENT(sched_swap_numa, ...@@ -561,11 +549,11 @@ TRACE_EVENT(sched_swap_numa,
__entry->src_ngid = task_numa_group_id(src_tsk); __entry->src_ngid = task_numa_group_id(src_tsk);
__entry->src_cpu = src_cpu; __entry->src_cpu = src_cpu;
__entry->src_nid = cpu_to_node(src_cpu); __entry->src_nid = cpu_to_node(src_cpu);
__entry->dst_pid = task_pid_nr(dst_tsk); __entry->dst_pid = dst_tsk ? task_pid_nr(dst_tsk) : 0;
__entry->dst_tgid = task_tgid_nr(dst_tsk); __entry->dst_tgid = dst_tsk ? task_tgid_nr(dst_tsk) : 0;
__entry->dst_ngid = task_numa_group_id(dst_tsk); __entry->dst_ngid = dst_tsk ? task_numa_group_id(dst_tsk) : 0;
__entry->dst_cpu = dst_cpu; __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", 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, ...@@ -575,6 +563,23 @@ TRACE_EVENT(sched_swap_numa,
__entry->dst_cpu, __entry->dst_nid) __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. * Tracepoint for waking a polling cpu without an IPI.
*/ */
......
...@@ -1849,7 +1849,7 @@ static int task_numa_migrate(struct task_struct *p) ...@@ -1849,7 +1849,7 @@ static int task_numa_migrate(struct task_struct *p)
/* No better CPU than the current one was found. */ /* No better CPU than the current one was found. */
if (env.best_cpu == -1) { 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; return -EAGAIN;
} }
...@@ -1858,7 +1858,7 @@ static int task_numa_migrate(struct task_struct *p) ...@@ -1858,7 +1858,7 @@ static int task_numa_migrate(struct task_struct *p)
ret = migrate_task_to(p, env.best_cpu); ret = migrate_task_to(p, env.best_cpu);
WRITE_ONCE(best_rq->numa_migrate_on, 0); WRITE_ONCE(best_rq->numa_migrate_on, 0);
if (ret != 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; return ret;
} }
...@@ -1866,7 +1866,7 @@ static int task_numa_migrate(struct task_struct *p) ...@@ -1866,7 +1866,7 @@ static int task_numa_migrate(struct task_struct *p)
WRITE_ONCE(best_rq->numa_migrate_on, 0); WRITE_ONCE(best_rq->numa_migrate_on, 0);
if (ret != 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); put_task_struct(env.best_task);
return ret; return ret;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment