lkml.org 
[lkml]   [2004]   [Oct]   [20]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    SubjectRe: [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/
    \
     
     \ /
      Last update: 2005-03-22 14:07    [W:0.897 / U:59.512 seconds]
    ©2003-2017 Jasper Spaans. hosted at Digital OceanAdvertise on this site