| Date | Wed, 20 Oct 2004 14:55:00 +0200 | From | Ingo Molnar <> | Subject | Re: [patch] Real-Time Preemption, -RT-2.6.9-rc4-mm1-U8 |
| |
* Florian Schmidt <mista.tapas@gmx.net> wrote:
> i just wanted to let you know that with U8 i still experience the > "pauses" i reported on U6, too. I would guess that it's some scheduler > thing as jackd running SCHED_FIFO and all its clients (at least the > audio threads running SCHED_FIFO) are not affected by the pauses (i > don't see any xruns from jackd and audio processing happily goes along > without audible dropouts).
ok.
> Also it seems that /proc/sys/kernel/trace_enabled == 1 is not the only > thing being able to trigger the pauses. With U6 i also experienced > them with trace_enabled == 0. I have to add though that it took quite > a while for them to kick in (hours) after setting trace_enabled to 0. > So my conclusion is that trace_enabled == 1 just increases the > probability of such pauses by several magnitudes (with 1 i get about > one of these pauses per 2-10 minutes, with 0 it took several hours for > the first pause to occur and then they stayed less frequent than with > 1).
i dont think it's caused by trace_enabled - the trace you sent last time clearly showed erratic behavior. There's one piece of code i suspect in particular - could you try the patch below ontop of -U8? (i have compile- and boot- tested it)
Ingo
--- linux/kernel/sched.c.orig +++ linux/kernel/sched.c @@ -2764,6 +2764,8 @@ need_resched: else deactivate_task(prev, rq); } + if (preempt_count() & PREEMPT_ACTIVE) + sub_preempt_count(PREEMPT_ACTIVE); if (unlikely(prev->flags & PF_DEAD)) { BUG_ON(prev->state != TASK_RUNNING); prev->state = __TASK_DEAD; @@ -2940,6 +2942,7 @@ asmlinkage void __sched preempt_schedule return; need_resched: + local_irq_disable(); add_preempt_count(PREEMPT_ACTIVE); /* * We keep the big kernel semaphore locked, but we @@ -2950,11 +2953,10 @@ need_resched: saved_lock_depth = task->lock_depth; task->lock_depth = -1; #endif - schedule(); + __schedule(); #ifdef CONFIG_PREEMPT_BKL task->lock_depth = saved_lock_depth; #endif - sub_preempt_count(PREEMPT_ACTIVE); /* we could miss a preemption opportunity between schedule and now */ barrier(); @@ -3002,7 +3004,6 @@ need_resched: #ifdef CONFIG_PREEMPT_BKL task->lock_depth = saved_lock_depth; #endif - sub_preempt_count(PREEMPT_ACTIVE); /* we could miss a preemption opportunity between schedule and now */ barrier(); @@ -3842,9 +3843,9 @@ static inline void __cond_resched(void) if (preempt_count() & PREEMPT_ACTIVE) return; do { + local_irq_disable(); add_preempt_count(PREEMPT_ACTIVE); - schedule(); - sub_preempt_count(PREEMPT_ACTIVE); + __schedule(); } while (need_resched()); } - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
|