Messages in this thread | | | Date | Wed, 6 Nov 2019 18:27:37 +0100 | From | Peter Zijlstra <> | Subject | Re: Re: NULL pointer dereference in pick_next_task_fair |
| |
On Wed, Nov 06, 2019 at 05:54:37PM +0100, Peter Zijlstra wrote: > On Wed, Nov 06, 2019 at 06:51:40PM +0300, Kirill Tkhai wrote: > > > +#ifdef CONFIG_SMP > > > + if (!rq->nr_running) { > > > + /* > > > + * Make sure task_on_rq_curr() fails, such that we don't do > > > + * put_prev_task() + set_next_task() on this task again. > > > + */ > > > + prev->on_cpu = 2; > > > newidle_balance(rq, rf); > > > > Shouldn't we restore prev->on_cpu = 1 after newidle_balance()? Can't prev > > become pickable again after newidle_balance() releases rq->lock, and we > > take it again, so this on_cpu == 2 never will be cleared? > > Indeed so.
Oh wait, the way it was written this is not possible. Because rq->nr_running == 0 and prev->on_cpu > 0 it means the current task is going to sleep and cannot be woken back up.
But if I move the ->on_cpu=2 thing earlier, as I wrote I'd do, then yes, we have to set it back to 1. Because in that case we can get here for a spurious schedule and we'll pick the same task again.
| |