--- kernel/sched_debug-prev.c 2008-05-14 14:53:28.000000000 +0200 +++ kernel/sched_debug.c 2008-05-14 14:58:12.000000000 +0200 @@ -125,6 +125,7 @@ void print_cfs_rq(struct seq_file *m, in char path[128] = ""; struct cgroup *cgroup = NULL; struct task_group *tg = cfs_rq->tg; + int was_locked; if (tg) cgroup = tg->css.cgroup; @@ -138,7 +139,11 @@ void print_cfs_rq(struct seq_file *m, in SEQ_printf(m, " .%-30s: %Ld.%06ld\n", "exec_clock", SPLIT_NS(cfs_rq->exec_clock)); - spin_lock_irqsave(&rq->lock, flags); + was_locked = spin_is_locked(&rq->lock); + + if (!was_locked) + spin_lock_irqsave(&rq->lock, flags); + if (cfs_rq->rb_leftmost) MIN_vruntime = (__pick_next_entity(cfs_rq))->vruntime; last = __pick_last_entity(cfs_rq); @@ -146,7 +151,10 @@ void print_cfs_rq(struct seq_file *m, in max_vruntime = last->vruntime; min_vruntime = rq->cfs.min_vruntime; rq0_min_vruntime = per_cpu(runqueues, 0).cfs.min_vruntime; - spin_unlock_irqrestore(&rq->lock, flags); + + if (!was_locked) + spin_unlock_irqrestore(&rq->lock, flags); + SEQ_printf(m, " .%-30s: %Ld.%06ld\n", "MIN_vruntime", SPLIT_NS(MIN_vruntime)); SEQ_printf(m, " .%-30s: %Ld.%06ld\n", "min_vruntime",