]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
sched/numa: Distinguish between the different task_numa_migrate() failure cases
authorMel Gorman <mgorman@techsingularity.net>
Mon, 24 Feb 2020 09:52:13 +0000 (09:52 +0000)
committerIngo Molnar <mingo@kernel.org>
Mon, 24 Feb 2020 10:36:33 +0000 (11:36 +0100)
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
include/trace/events/sched.h
kernel/sched/fair.c

index 420e80e56e55198449563c781e4c1dbe4aa6be6d..9c3ebb7c83a57ecc5ac72cd6a645cb4db4dd6921 100644 (file)
@@ -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.
  */
index f524ce3cea823299d10fc33be5b44d61abdc3285..5d9c23c134af2615f616c39a4e2d6d3acc1a7698 100644 (file)
@@ -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;
 }