Messages in this thread | | | Date | Wed, 18 Jun 2008 15:35:05 +0200 | From | "Daniel K." <> | Subject | Re: [BUG: NULL pointer dereference] cgroups and RT scheduling interact badly. |
| |
Peter Zijlstra wrote: > On Tue, 2008-06-17 at 21:48 +0000, Daniel K. wrote: >> I had almost given up trying to break it, but then this happened. >> >> [...] > > Ah, fun a race between dequeueing because of runtime quota and > requeueing because of RR slice length. > >> Yes, I realize I'm starting to sound like a broken record. > > Ah, don't worry - I was just hoping there was an end to the amount of > glaring bugs in my code :-/
:)
> Reproducing was a bit harder than for you, it took me a whole minute of > runtime and setting the runtime limit above the RR slice length (and > realizing you're running RR, not FIFO). > > The below patch (on top of the other one) seems to not make it crash > this case for at least 15 minutes.
I am happy to say that this nailed it squarely on the head. I no longer see any of the Oops'es I could quite easily trigger before. I added my Tested-by, please add it to the patch you sent yesterday as well.
I still have a few gripes with RR scheduling, but that is a topic for another mail.
> --- > Subject: sched: rt-group: fix RR buglet > From: Peter Zijlstra <a.p.zijlstra@chello.nl> > > In tick_task_rt() we first call update_curr_rt() which can dequeue a runqueue > due to it running out of runtime, and then we try to requeue it, of it also > having exhausted its RR quota. Obviously requeueing something that is no longer > on the runqueue will not have the expected result. > > Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl> Tested-by: Daniel K. <dk@uw.no>
> --- > kernel/sched_rt.c | 4 +++- > 1 file changed, 3 insertions(+), 1 deletion(-) > > Index: linux-2.6/kernel/sched_rt.c > =================================================================== > --- linux-2.6.orig/kernel/sched_rt.c > +++ linux-2.6/kernel/sched_rt.c > @@ -549,8 +549,10 @@ static > void requeue_rt_entity(struct rt_rq *rt_rq, struct sched_rt_entity *rt_se) > { > struct rt_prio_array *array = &rt_rq->active; > + struct list_head *queue = array->queue + rt_se_prio(rt_se); > > - list_move_tail(&rt_se->run_list, array->queue + rt_se_prio(rt_se)); > + if (on_rt_rq(rt_se)) > + list_move_tail(&rt_se->run_list, queue); > } > > static void requeue_task_rt(struct rq *rq, struct task_struct *p)
Daniel K.
| |