Re: [BUG] TASK_DEAD task is able to be woken up in special condition

From: Ingo Molnar
Date: Wed Jan 18 2012 - 04:42:39 EST



* Oleg Nesterov <oleg@xxxxxxxxxx> wrote:

> On 01/17, Ingo Molnar wrote:
> >
> > * Yasunori Goto <y-goto@xxxxxxxxxxxxxx> wrote:
> >
> > > --- linux-3.2.orig/kernel/exit.c
> > > +++ linux-3.2/kernel/exit.c
> > > @@ -1038,6 +1038,22 @@ NORET_TYPE void do_exit(long code)
> > >
> > > preempt_disable();
> > > exit_rcu();
> > > +
> > > + /*
> > > + * The setting of TASK_RUNNING by try_to_wake_up() may be delayed
> > > + * when the following two conditions become true.
> > > + * - There is race condition of mmap_sem (It is acquired by
> > > + * exit_mm()), and
> > > + * - SMI occurs before setting TASK_RUNINNG.
> > > + * (or hypervisor of virtual machine switches to other guest)
> > > + * As a result, we may become TASK_RUNNING after becoming TASK_DEAD
> > > + *
> > > + * To avoid it, we have to wait for releasing tsk->pi_lock which
> > > + * is held by try_to_wake_up()
> > > + */
> > > + smp_mb();
> > > + raw_spin_unlock_wait(&tsk->pi_lock);
> >
> > Hm, unlock_wait() is really nasty. Wouldnt the adoption of
> > the -rt kernel's delayed task put logic solve most of these
> > races?
>
> How? The problem is that the exiting task can do the last
> schedule() in TASK_RUNNING state, this breaks the TASK_DEAD
> logic in finish_task_switch().

Well, but does the -rt kernel suffer from the same race? It can
generate delays at the exact same place, and can generate much
longer delays than an SMI, if a high-prio RT task comes along.

So if there's something in the -rt kernel that fixes this race
we'd like to have that. If the bug is present in the -rt kernel
then why didn't it ever get triggered? We caught much more
narrow races in -rt, and very early on in the project.

Thanks,

Ingo
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/