tracing: Treat recording comm for idle task as a success
PATCH 1/3 tracing: Treat recording comm for idle task as a success
Currently we stop recording comm for non-idle tasks when switching from/to idle task since we treat that as a record failure. Fix that by treat recording of comm for idle task as a success.
--- kernel/trace/trace.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
kernel/trace/trace.c +5 -1
@@ -1916,7 +1916,11 @@ static int trace_save_cmdline(struct task_struct *tsk) {unsigned pid, idx; -if (!tsk->pid ||unlikely (tsk->pid >PID_MAX_DEFAULT )) +/* treat recording of idle task as a success */ +if (!tsk->pid) +return 1 ; + +if (unlikely (tsk->pid >PID_MAX_DEFAULT ))return 0 ;/*
Signature · 1 line
2.13.2.725.g09c95d1e9-goog
PATCH 2/3 tracing: Treat recording tgid for idle task as a success
Currently we stop recording tgid for non-idle tasks when switching from/to idle task since we treat that as a record failure. Fix that by treat recording of tgid for idle task as a success.
--- kernel/trace/trace.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
kernel/trace/trace.c +5 -1
@@ -2006,7 +2006,11 @@ int trace_find_tgid(int pid)static int trace_save_tgid (struct task_struct *tsk) { -if (unlikely (!tgid_map || !tsk->pid || tsk->pid >PID_MAX_DEFAULT )) +/* treat recording of idle task as a success */ +if (!tsk->pid) +return 1 ; + +if (unlikely (!tgid_map || tsk->pid >PID_MAX_DEFAULT ))return 0 ; tgid_map[tsk->pid] = tsk->tgid;
Signature · 1 line
2.13.2.725.g09c95d1e9-goog
PATCH 3/3 tracing: Attempt to record other information even if some fail
In reply to Joel FernandesIn 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.
--- kernel/trace/trace.c | 32 ++++++++++++++++++++++++-------- 1 file changed, 24 insertions(+), 8 deletions(-)
kernel/trace/trace.c +24 -8
@@ -2037,11 +2037,20 @@ static bool tracing_record_taskinfo_skip(int flags)*/ void tracing_record_taskinfo (struct task_struct *task,int flags) { +bool done; +if (tracing_record_taskinfo_skip (flags))return ; -if ((flags &TRACE_RECORD_CMDLINE ) && !trace_save_cmdline (task)) -return ; -if ((flags &TRACE_RECORD_TGID ) && !trace_save_tgid (task)) + +/* +* Record as much task information as possible. If some fail, continue +* to try to record the others. +*/ + done = !(flags &TRACE_RECORD_CMDLINE ) ||trace_save_cmdline (task); + done &= !(flags &TRACE_RECORD_TGID ) ||trace_save_tgid (task); + +/* If recording any information failed, retry again soon. */ +if (!done)return ;__this_cpu_write (trace_taskinfo_save, false);
@@ -2058,15 +2067,22 @@ void tracing_record_taskinfo(struct task_struct *task, int flags)void tracing_record_taskinfo_sched_switch (struct task_struct *prev,struct task_struct *next,int flags) { +bool done; +if (tracing_record_taskinfo_skip (flags))return ; -if ((flags &TRACE_RECORD_CMDLINE ) && - (!trace_save_cmdline (prev) || !trace_save_cmdline (next))) -return ; +/* +* Record as much task information as possible. If some fail, continue +* to try to record the others. +*/ + done = !(flags &TRACE_RECORD_CMDLINE ) ||trace_save_cmdline (prev); + done &= !(flags &TRACE_RECORD_CMDLINE ) ||trace_save_cmdline (next); + done &= !(flags &TRACE_RECORD_TGID ) ||trace_save_tgid (prev); + done &= !(flags &TRACE_RECORD_TGID ) ||trace_save_tgid (next); -if ((flags &TRACE_RECORD_TGID ) && - (!trace_save_tgid (prev) || !trace_save_tgid (next))) +/* If recording any information failed, retry again soon. */ +if (!done)return ;__this_cpu_write (trace_taskinfo_save, false);
Signature · 1 line
2.13.2.725.g09c95d1e9-goog