Re: [PATCH] freezer,sched: Report TASK_FROZEN tasks as TASK_UNINTERRUPTIBLE

From: Steven Rostedt
Date: Mon Oct 23 2023 - 12:15:56 EST


On Mon, 23 Oct 2023 21:57:35 +0800
Liangliang Li <liliangliang@xxxxxxxx> wrote:

> TASK_FROZEN is not in TASK_REPORT, thus a frozen task will appear as
> state == 0, IOW TASK_RUNNING.
>
> Fix this by make TASK_FROZEN appear as TASK_UNINTERRUPTIBLE, thus we
> dont need to imply a new state to userspace tools.
>

I'm not so sure I agree with this. If anything, it should be reported as
something other than RUNNING or TASK_UNINTERRUPTIBLE, (yes a new state).

The reason I state that, is that tasks may not be the one that sets its
state to FROZEN. A TASK_UNINTERRUPTIBLE is a task that purposely took
itself off the runqueue and is waiting for a response. A FROZEN task did
not necessarily take itself off the run queue, as something else did. It's
more like 'T' than 'D'.

I don't find 'D' any more useful that 'R' for a frozen task. In fact, I
find it even more deceiving.

If you see a task in 'D' that's not running, you will likely look to see
what its blocked on. If it's not blocked on anything, that will be very
confusing. If you see 'R' not running, you can then at least go look to see
why it's not running.

-- Steve


> Signed-off-by: Liangliang Li <liliangliang@xxxxxxxx>
> ---
> include/linux/sched.h | 4 ++++
> 1 file changed, 4 insertions(+)
>
> diff --git a/include/linux/sched.h b/include/linux/sched.h
> index 292c31697248..0cfe2ba4fc6f 100644
> --- a/include/linux/sched.h
> +++ b/include/linux/sched.h
> @@ -1690,6 +1690,10 @@ static inline unsigned int __task_state_index(unsigned int tsk_state,
> if (tsk_state & TASK_RTLOCK_WAIT)
> state = TASK_UNINTERRUPTIBLE;
>
> + /* Frozen tasks should appear as "D (disk sleep)' in userspace. */
> + if (tsk_state & TASK_FROZEN)
> + state = TASK_UNINTERRUPTIBLE;
> +
> return fls(state);
> }
>