Messages in this thread | | | Date | Fri, 10 Jul 2009 00:05:27 -0400 | From | Gregory Haskins <> | Subject | Re: [PATCH] sched_rt: fix overload bug on rt group scheduling -v2 |
| |
Peter Zijlstra wrote: > Greg, how's this? >
Hi Peter, Sorry for the delay getting back to you.
I can't vouch specifically for the rt-group specific part, but as far as the general balancer modifications to the migration code, it looks good.
> --- > Subject: sched_rt: fix overload bug on rt group scheduling > From: Peter Zijlstra <peterz@infradead.org> > Date: Wed, 01 Apr 2009 18:40:15 +0200 > > Fixes an easily triggerable BUG() when setting process affinities. > > Make sure to count the number of migratable tasks in the same place: > the root rt_rq. Otherwise the number doesn't make sense and we'll hit > the BUG in set_cpus_allowed_rt(). > > Also, make sure we only count tasks, not groups (this is probably > already taken care of by the fact that rt_se->nr_cpus_allowed will be 0 > for groups, but be more explicit) > > Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl> >
Acked-by: Gregory Haskins <ghaskins@novell.com>
> --- > kernel/sched_rt.c | 18 +++++++++++++++++- > 1 file changed, 17 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 > @@ -10,6 +10,8 @@ static inline struct task_struct *rt_tas > > #ifdef CONFIG_RT_GROUP_SCHED > > +#define rt_entity_is_task(rt_se) (!(rt_se)->my_q) > + > static inline struct rq *rq_of_rt_rq(struct rt_rq *rt_rq) > { > return rt_rq->rq; > @@ -22,6 +24,8 @@ static inline struct rt_rq *rt_rq_of_se( > > #else /* CONFIG_RT_GROUP_SCHED */ > > +#define rt_entity_is_task(rt_se) (1) > + > static inline struct rq *rq_of_rt_rq(struct rt_rq *rt_rq) > { > return container_of(rt_rq, struct rq, rt); > @@ -73,7 +77,7 @@ static inline void rt_clear_overload(str > > static void update_rt_migration(struct rt_rq *rt_rq) > { > - if (rt_rq->rt_nr_migratory && (rt_rq->rt_nr_running > 1)) { > + if (rt_rq->rt_nr_migratory && rt_rq->rt_nr_total > 1) { > if (!rt_rq->overloaded) { > rt_set_overload(rq_of_rt_rq(rt_rq)); > rt_rq->overloaded = 1; > @@ -86,6 +90,12 @@ static void update_rt_migration(struct r > > static void inc_rt_migration(struct sched_rt_entity *rt_se, struct rt_rq *rt_rq) > { > + if (!rt_entity_is_task(rt_se)) > + return; > + > + rt_rq = &rq_of_rt_rq(rt_rq)->rt; > + > + rt_rq->rt_nr_total++; > if (rt_se->nr_cpus_allowed > 1) > rt_rq->rt_nr_migratory++; > > @@ -94,6 +104,12 @@ static void inc_rt_migration(struct sche > > static void dec_rt_migration(struct sched_rt_entity *rt_se, struct rt_rq *rt_rq) > { > + if (!rt_entity_is_task(rt_se)) > + return; > + > + rt_rq = &rq_of_rt_rq(rt_rq)->rt; > + > + rt_rq->rt_nr_total--; > if (rt_se->nr_cpus_allowed > 1) > rt_rq->rt_nr_migratory--; > > diff --git a/kernel/sched.c b/kernel/sched.c > index fd3ac58..a07d520 100644 > --- a/kernel/sched.c > +++ b/kernel/sched.c > @@ -493,6 +493,7 @@ struct rt_rq { > #endif > #ifdef CONFIG_SMP > unsigned long rt_nr_migratory; > + unsigned long rt_nr_total; > int overloaded; > struct plist_head pushable_tasks; > #endif > >
[unhandled content-type:application/pgp-signature] | |