| From 79c6f448c8b79c321e4a1f31f98194e4f6b6cae7 Mon Sep 17 00:00:00 2001 |
| From: "Steven Rostedt (VMware)" <rostedt@goodmis.org> |
| Date: Mon, 30 Jan 2017 19:27:10 -0500 |
| Subject: tracing: Fix hwlat kthread migration |
| |
| From: Steven Rostedt (VMware) <rostedt@goodmis.org> |
| |
| commit 79c6f448c8b79c321e4a1f31f98194e4f6b6cae7 upstream. |
| |
| The hwlat tracer creates a kernel thread at start of the tracer. It is |
| pinned to a single CPU and will move to the next CPU after each period of |
| running. If the user modifies the migration thread's affinity, it will not |
| change after that happens. |
| |
| The original code created the thread at the first instance it was called, |
| but later was changed to destroy the thread after the tracer was finished, |
| and would not be created until the next instance of the tracer was |
| established. The code that initialized the affinity was only called on the |
| initial instantiation of the tracer. After that, it was not initialized, and |
| the previous affinity did not match the current newly created one, making |
| it appear that the user modified the thread's affinity when it did not, and |
| the thread failed to migrate again. |
| |
| Fixes: 0330f7aa8ee6 ("tracing: Have hwlat trace migrate across tracing_cpumask CPUs") |
| Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| kernel/trace/trace_hwlat.c | 8 +++++--- |
| 1 file changed, 5 insertions(+), 3 deletions(-) |
| |
| --- a/kernel/trace/trace_hwlat.c |
| +++ b/kernel/trace/trace_hwlat.c |
| @@ -266,7 +266,7 @@ out: |
| static struct cpumask save_cpumask; |
| static bool disable_migrate; |
| |
| -static void move_to_next_cpu(void) |
| +static void move_to_next_cpu(bool initmask) |
| { |
| static struct cpumask *current_mask; |
| int next_cpu; |
| @@ -275,7 +275,7 @@ static void move_to_next_cpu(void) |
| return; |
| |
| /* Just pick the first CPU on first iteration */ |
| - if (!current_mask) { |
| + if (initmask) { |
| current_mask = &save_cpumask; |
| get_online_cpus(); |
| cpumask_and(current_mask, cpu_online_mask, tracing_buffer_mask); |
| @@ -330,10 +330,12 @@ static void move_to_next_cpu(void) |
| static int kthread_fn(void *data) |
| { |
| u64 interval; |
| + bool initmask = true; |
| |
| while (!kthread_should_stop()) { |
| |
| - move_to_next_cpu(); |
| + move_to_next_cpu(initmask); |
| + initmask = false; |
| |
| local_irq_disable(); |
| get_sample(); |