On Fri, Apr 25, 2025 at 04:41:21PM -0400, Steven Rostedt wrote:
> From: Steven Rostedt <[email protected]>
> 
> 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/[email protected]/
> 
> Signed-off-by: Steven Rostedt (Google) <[email protected]>
> ---
>  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 <[email protected]>

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

-- 
Kees Cook

Reply via email to