aboutsummaryrefslogtreecommitdiffstats
path: root/kernel
diff options
context:
space:
mode:
authorJoel Fernandes <joelaf@google.com>2017-07-06 19:00:23 -0400
committerSteven Rostedt (VMware) <rostedt@goodmis.org>2017-07-07 09:11:34 -0400
commit29b1a8ad7df4528b862a79e3d5fb0936f4d199c7 (patch)
tree9f48435538efa531c87892c454a0832de3e3053a /kernel
parentbd45d34d25720a820021c8ea45de5cd607eace64 (diff)
tracing: Attempt to record other information even if some fail
In recent patches where we record comm and tgid at the same time, we skip continuing to record if any fail. Fix that by trying to record as many things as we can even if some couldn't be recorded. If any information isn't recorded, then we don't set trace_taskinfo_save as before. Link: http://lkml.kernel.org/r/20170706230023.17942-3-joelaf@google.com Cc: kernel-team@android.com Cc: Ingo Molnar <mingo@redhat.com> Signed-off-by: Joel Fernandes <joelaf@google.com> Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
Diffstat (limited to 'kernel')
-rw-r--r--kernel/trace/trace.c32
1 files changed, 24 insertions, 8 deletions
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c
index aee11e3a394f..92af8fd1429b 100644
--- a/kernel/trace/trace.c
+++ b/kernel/trace/trace.c
@@ -2037,11 +2037,20 @@ static bool tracing_record_taskinfo_skip(int flags)
2037 */ 2037 */
2038void tracing_record_taskinfo(struct task_struct *task, int flags) 2038void tracing_record_taskinfo(struct task_struct *task, int flags)
2039{ 2039{
2040 bool done;
2041
2040 if (tracing_record_taskinfo_skip(flags)) 2042 if (tracing_record_taskinfo_skip(flags))
2041 return; 2043 return;
2042 if ((flags & TRACE_RECORD_CMDLINE) && !trace_save_cmdline(task)) 2044
2043 return; 2045 /*
2044 if ((flags & TRACE_RECORD_TGID) && !trace_save_tgid(task)) 2046 * Record as much task information as possible. If some fail, continue
2047 * to try to record the others.
2048 */
2049 done = !(flags & TRACE_RECORD_CMDLINE) || trace_save_cmdline(task);
2050 done &= !(flags & TRACE_RECORD_TGID) || trace_save_tgid(task);
2051
2052 /* If recording any information failed, retry again soon. */
2053 if (!done)
2045 return; 2054 return;
2046 2055
2047 __this_cpu_write(trace_taskinfo_save, false); 2056 __this_cpu_write(trace_taskinfo_save, false);
@@ -2058,15 +2067,22 @@ void tracing_record_taskinfo(struct task_struct *task, int flags)
2058void tracing_record_taskinfo_sched_switch(struct task_struct *prev, 2067void tracing_record_taskinfo_sched_switch(struct task_struct *prev,
2059 struct task_struct *next, int flags) 2068 struct task_struct *next, int flags)
2060{ 2069{
2070 bool done;
2071
2061 if (tracing_record_taskinfo_skip(flags)) 2072 if (tracing_record_taskinfo_skip(flags))
2062 return; 2073 return;
2063 2074
2064 if ((flags & TRACE_RECORD_CMDLINE) && 2075 /*
2065 (!trace_save_cmdline(prev) || !trace_save_cmdline(next))) 2076 * Record as much task information as possible. If some fail, continue
2066 return; 2077 * to try to record the others.
2078 */
2079 done = !(flags & TRACE_RECORD_CMDLINE) || trace_save_cmdline(prev);
2080 done &= !(flags & TRACE_RECORD_CMDLINE) || trace_save_cmdline(next);
2081 done &= !(flags & TRACE_RECORD_TGID) || trace_save_tgid(prev);
2082 done &= !(flags & TRACE_RECORD_TGID) || trace_save_tgid(next);
2067 2083
2068 if ((flags & TRACE_RECORD_TGID) && 2084 /* If recording any information failed, retry again soon. */
2069 (!trace_save_tgid(prev) || !trace_save_tgid(next))) 2085 if (!done)
2070 return; 2086 return;
2071 2087
2072 __this_cpu_write(trace_taskinfo_save, false); 2088 __this_cpu_write(trace_taskinfo_save, false);