*/
 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);
 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);