FAILED: patch "[PATCH] taskstats: Cleanup the use of task->exit_code" failed to apply to 4.19-stable tree
[email protected]
maintainerThe patch below does not apply to the 4.19-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 1b5a42d9c85f0e731f01c8d1129001fd8531a8a0 Mon Sep 17 00:00:00 2001
From: "Eric W. Biederman" <[email protected]>
Date: Mon, 3 Jan 2022 11:32:36 -0600
Subject: [PATCH] taskstats: Cleanup the use of task->exit_code
In the function bacct_add_task the code reading task->exit_code was introduced in commit f3cef7a99469 ("[PATCH] csa: basic accounting over taskstats"), and it is not entirely clear what the taskstats interface is trying to return as only returning the exit_code of the first task in a process doesn't make a lot of sense.
As best as I can figure the intent is to return task->exit_code after a task exits. The field is returned with per task fields, so the exit_code of the entire process is not wanted. Only the value of the first task is returned so this is not a useful way to get the per task ptrace stop code. The ordinary case of returning this value is returning after a task exits, which also precludes use for getting a ptrace value.
It is common to for the first task of a process to also be the last task of a process so this field may have done something reasonable by accident in testing.
Make ac_exitcode a reliable per task value by always returning it for every exited task.
Setting ac_exitcode in a sensible mannter makes it possible to continue to provide this value going forward.
kernel/tsacct.c +3 -4
@@ -38,11 +38,10 @@ void bacct_add_tsk(struct user_namespace *user_ns, stats->ac_btime =clamp_t (time64_t, btime,0 ,U32_MAX ); stats->ac_btime64 = btime; -if (thread_group_leader (tsk)) { +if (tsk->flags &PF_EXITING ) stats->ac_exitcode = tsk->exit_code; -if (tsk->flags &PF_FORKNOEXEC ) - stats->ac_flag |=AFORK ; - } +if (thread_group_leader (tsk) && (tsk->flags &PF_FORKNOEXEC )) + stats->ac_flag |=AFORK ;if (tsk->flags &PF_SUPERPRIV ) stats->ac_flag |=ASU ;if (tsk->flags &PF_DUMPCORE )