lkml.org 
[lkml]   [2022]   [Mar]   [14]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
Date
From
SubjectRe: [PATCH] ptrace: fix ptrace vs tasklist_lock race on PREEMPT_RT.
I never really understood ->saved_state logic. Will read this patch
tomorrow, but at first glance this patch doesn't solve all problems.

On 03/02, Sebastian Andrzej Siewior wrote:
>
> +static inline bool __task_state_match_eq(struct task_struct *tsk, long state)
> +{
> + bool match = false;
> +
> + if (READ_ONCE(tsk->__state) == state)
> + match = true;
> + else if (tsk->saved_state == state)
> + match = true;
> + return match;
> +}

...

> --- a/kernel/sched/core.c
> +++ b/kernel/sched/core.c
> @@ -3239,7 +3239,8 @@ unsigned long wait_task_inactive(struct task_struct *p, unsigned int match_state
> * is actually now running somewhere else!
> */
> while (task_running(rq, p)) {
> - if (match_state && unlikely(READ_ONCE(p->__state) != match_state))
> + if (match_state &&
> + unlikely(!task_state_match_eq(p, match_state)))
> return 0;

So wait_task_inactive() can return 0 but the task can run after that, right?
This is not what we want...

Oleg.

\
 
 \ /
  Last update: 2022-03-14 19:55    [W:0.294 / U:0.212 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site