From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756746AbYCEPCo (ORCPT ); Wed, 5 Mar 2008 10:02:44 -0500 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1753817AbYCEPCS (ORCPT ); Wed, 5 Mar 2008 10:02:18 -0500 Received: from viefep18-int.chello.at ([213.46.255.22]:2666 "EHLO viefep14-int.chello.at" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1755090AbYCEPCR (ORCPT ); Wed, 5 Mar 2008 10:02:17 -0500 Subject: Re: [PATCH -v2] balance RT task resched only on runqueue From: Peter Zijlstra To: Steven Rostedt Cc: LKML , Ingo Molnar , Linus Torvalds , Andrew Morton , Sripathi Kodi , Gregory Haskins In-Reply-To: <1204729212.5241.16.camel@localhost.localdomain> References: <1204728101.5241.12.camel@localhost.localdomain> <1204729212.5241.16.camel@localhost.localdomain> Content-Type: text/plain Date: Wed, 05 Mar 2008 16:02:09 +0100 Message-Id: <1204729330.8514.64.camel@twins> Mime-Version: 1.0 X-Mailer: Evolution 2.21.92 Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Wed, 2008-03-05 at 10:00 -0500, Steven Rostedt wrote: > [ > Update: I didn't like the task_rq(p), so I changed the test to be > rq->curr == p. No need to resched if the p isn't running. And > I think this is a bit cleaner. > ] > > In the RT kernel we discovered a place that can reschedule a task > without holding the tasks runqueue lock. This was caused by the RT > balancing code that pulls RT tasks to the current run queue and will > reschedule the current task. > > There's a slight chance that the pulling of the RT tasks will release > the current runqueue's lock and retake it (in the double_lock_balance). > During this time that the runqueue is released, the current task can > migrate to another runqueue. > > In the prio_changed_rt code, after the pull, if the current task is of > lesser priority than one of the RT tasks pulled, resched_task is called > on the current task. If the current task had migrated in that small > window, resched_task will be called without holding the runqueue lock > for the runqueue that the task is on. > > This race condition also exists in the mainline kernel and this patch > adds a check to make sure the task hasn't migrated before calling > resched_task. > > Signed-off-by: Steven Rostedt Acked-by: Peter Zijlstra > --- > kernel/sched_rt.c | 6 ++++-- > 1 file changed, 4 insertions(+), 2 deletions(-) > > Index: linux-compile.git/kernel/sched_rt.c > =================================================================== > --- linux-compile.git.orig/kernel/sched_rt.c 2008-03-05 09:31:22.000000000 -0500 > +++ linux-compile.git/kernel/sched_rt.c 2008-03-05 09:53:00.000000000 -0500 > @@ -1107,9 +1107,11 @@ static void prio_changed_rt(struct rq *r > pull_rt_task(rq); > /* > * If there's a higher priority task waiting to run > - * then reschedule. > + * then reschedule. Note, the above pull_rt_task > + * can release the rq lock and p could migrate. > + * Only reschedule if p is still on the same runqueue. > */ > - if (p->prio > rq->rt.highest_prio) > + if (p->prio > rq->rt.highest_prio && rq->curr == p) > resched_task(p); > #else > /* For UP simply resched on drop of prio */ > >