On Mon, Feb 04, 2008 at 10:02:12PM -0700, Gregory Haskins wrote: > >>> On Mon, Feb 4, 2008 at 9:51 PM, in message > <20080205025144.GA31774@xxxxxxxxxxxxxxxxxxx>, Daniel Walker > <dwalker@xxxxxxxxxxxxxxxxxxx> wrote: > > I get the following when I tried it, > > > > BUG: sleeping function called from invalid context bash(5126) at > > kernel/rtmutex.c:638 > > in_atomic():1 [00000001], irqs_disabled():1 > > Hi Daniel, > Can you try this patch and let me know if it fixes your problem? > > ----------------------- > > use rcu for root-domain kfree > > Signed-off-by: Gregory Haskins <ghaskins@xxxxxxxxxx> > > diff --git a/kernel/sched.c b/kernel/sched.c > index e6ad493..77e86c1 100644 > --- a/kernel/sched.c > +++ b/kernel/sched.c > @@ -339,6 +339,7 @@ struct root_domain { > atomic_t refcount; > cpumask_t span; > cpumask_t online; > + struct rcu_head rcu; > > /* > * The "RT overload" flag: it gets set if a CPU has more than > @@ -6222,6 +6223,12 @@ sd_parent_degenerate(struct sched_domain *sd, struct sched_domain *parent) > return 1; > } > > +/* rcu callback to free a root-domain */ > +static void rq_free_root(struct rcu_head *rcu) > +{ > + kfree(container_of(rcu, struct root_domain, rcu)); > +} > + I looked at the code a bit, and I'm not sure you need this complexity.. Once you have replace the old_rq, there is no reason it needs to protection of the run queue spinlock .. So you could just move the kfree down below the spin_unlock_irqrestore() .. Daniel - To unsubscribe from this list: send the line "unsubscribe linux-rt-users" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html