>>> On Tue, Feb 5, 2008 at 11:59 AM, in message <20080205165936.GA18613@xxxxxxxxxxxxxxxxxxx>, Daniel Walker <dwalker@xxxxxxxxxxxxxxxxxxx> wrote: > > 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() .. Here is a new version to address your observation: ----------------------- we cannot kfree while in_atomic() Signed-off-by: Gregory Haskins <ghaskins@xxxxxxxxxx> diff --git a/kernel/sched.c b/kernel/sched.c index e6ad493..0978912 100644 --- a/kernel/sched.c +++ b/kernel/sched.c @@ -6226,6 +6226,7 @@ static void rq_attach_root(struct rq *rq, struct root_domain *rd) { unsigned long flags; const struct sched_class *class; + struct root_domain *reap = NULL; spin_lock_irqsave(&rq->lock, flags); @@ -6241,7 +6242,7 @@ static void rq_attach_root(struct rq *rq, struct root_domain *rd) cpu_clear(rq->cpu, old_rd->online); if (atomic_dec_and_test(&old_rd->refcount)) - kfree(old_rd); + reap = old_rd; } atomic_inc(&rd->refcount); @@ -6257,6 +6258,10 @@ static void rq_attach_root(struct rq *rq, struct root_domain *rd) } spin_unlock_irqrestore(&rq->lock, flags); + + /* Don't try to free the memory while in-atomic() */ + if (unlikely(reap)) + kfree(reap); } > > 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 - 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