On 07/21, Peter Zijlstra wrote:
>
> --- a/kernel/sched/core.c
> +++ b/kernel/sched/core.c
> @@ -4193,9 +4193,6 @@ static void __sched notrace __schedule(b
>       local_irq_disable();
>       rcu_note_context_switch(preempt);
>
> -     /* See deactivate_task() below. */
> -     prev_state = prev->state;
> -
>       /*
>        * Make sure that signal_pending_state()->signal_pending() below
>        * can't be reordered with __set_current_state(TASK_INTERRUPTIBLE)
> @@ -4219,11 +4216,16 @@ static void __sched notrace __schedule(b
>       update_rq_clock(rq);
>
>       switch_count = &prev->nivcsw;
> +
>       /*
> -      * We must re-load prev->state in case ttwu_remote() changed it
> -      * before we acquired rq->lock.
> +      * We must load prev->state once (task_struct::state is volatile), such
> +      * that:
> +      *
> +      *  - we form a control dependency vs deactivate_task() below.
> +      *  - ptrace_{,un}freeze_traced() can change ->state underneath us.
>        */
> -     if (!preempt && prev_state && prev_state == prev->state) {
> +     prev_state = prev->state;
> +     if (!preempt && prev_state) {

Thanks! FWIW,

Acked-by: Oleg Nesterov <o...@redhat.com>

Reply via email to