Re: [RFC][PATCH 1/2] kthread: Add is_user_thread() and is_kernel_thread() helper functions

Kees Cook
2025-04-25T23:03:19Z

On Fri, Apr 25, 2025 at 04:41:21PM -0400, Steven Rostedt wrote:
> From: Steven Rostedt <rostedt@goodmis.org>
>
> In order to know if a task is a user thread or a kernel thread it is
> recommended to test the task flags for PF_KTHREAD. The old way was to
> check if the task mm pointer is NULL.
>
> It is an easy mistake to not test the flag correctly, as:
>
> if (!(task->flag & PF_KTHREAD))
>
> Is not immediately obvious that it's testing for a user thread.
>
> Add helper functions:
>
> is_user_thread()
> is_kernel_thread()
>
> that can make seeing what is being tested for much more obvious:
>
> if (is_user_thread(task))
>
> Link: https://lore.kernel.org/all/20250425133416.63d3e3b8@gandalf.local.home/
>
> Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
> ---
> include/linux/sched.h | 10 ++++++++++
> 1 file changed, 10 insertions(+)
>
> diff --git a/include/linux/sched.h b/include/linux/sched.h
> index f96ac1982893..823f38b0fd3e 100644
> --- a/include/linux/sched.h
> +++ b/include/linux/sched.h
> @@ -1785,6 +1785,16 @@ static __always_inline bool is_percpu_thread(void)
> #endif
> }
>
> +static __always_inline bool is_user_thread(struct task_struct *task)
> +{
> + return !(task->flags & PF_KTHREAD);
> +}
> +
> +static __always_inline bool is_kernel_thread(struct task_struct *task)
> +{
> + return task->flags & PF_KTHREAD;

nit: maybe do explicit type conversion:

return !!(task->flags & PF_KTHREAD);

but that's just a style issue, really.

Reviewed-by: Kees Cook <kees@kernel.org>

Thank you for not using current->mm -- KUnit, live patching, etc, all
use current->mm but are kthreads. :)

--
Kees Cook