lkml.org 
[lkml]   [2007]   [Jan]   [22]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    SubjectRe: status of: tasklet_unlock_wait() causes soft lockup with -rt and ieee1394 audio

    * Pieter Palmers <pieterp@joow.be> wrote:

    > Dear all,
    >
    > What is the status with respect to this problem? I see that in the
    > current -rt patch the problematic code piece is different. I
    > personally haven't tried to reproduce this myself on a more recent
    > kernel, but I just got a report from one of our users who experienced
    > the same problem with 2.6.19-rt15 and RT preemption (desktop
    > preemption works fine).
    >
    > Should the latest -rt patches be fixed with respect to this issue? If
    > so I'll try and test them, otherwise I omit the effort.

    it's not fixed yet. Could you try the patch below?

    Ingo

    ---
    include/linux/interrupt.h | 6 ++----
    kernel/softirq.c | 20 ++++++++++++++++++++
    2 files changed, 22 insertions(+), 4 deletions(-)

    Index: linux/include/linux/interrupt.h
    ===================================================================
    --- linux.orig/include/linux/interrupt.h
    +++ linux/include/linux/interrupt.h
    @@ -328,10 +328,8 @@ static inline void tasklet_unlock(struct
    clear_bit(TASKLET_STATE_RUN, &(t)->state);
    }

    -static inline void tasklet_unlock_wait(struct tasklet_struct *t)
    -{
    - while (test_bit(TASKLET_STATE_RUN, &(t)->state)) { barrier(); }
    -}
    +extern void tasklet_unlock_wait(struct tasklet_struct *t);
    +
    #else
    # define tasklet_trylock(t) 1
    # define tasklet_tryunlock(t) 1
    Index: linux/kernel/softirq.c
    ===================================================================
    --- linux.orig/kernel/softirq.c
    +++ linux/kernel/softirq.c
    @@ -20,6 +20,7 @@
    #include <linux/mm.h>
    #include <linux/notifier.h>
    #include <linux/percpu.h>
    +#include <linux/delay.h>
    #include <linux/cpu.h>
    #include <linux/kthread.h>
    #include <linux/rcupdate.h>
    @@ -656,6 +657,25 @@ void __init softirq_init(void)
    open_softirq(HI_SOFTIRQ, tasklet_hi_action, NULL);
    }

    +#if defined(CONFIG_SMP) || defined(CONFIG_PREEMPT_RT)
    +
    +void tasklet_unlock_wait(struct tasklet_struct *t)
    +{
    + while (test_bit(TASKLET_STATE_RUN, &(t)->state)) {
    + /*
    + * Hack for now to avoid this busy-loop:
    + */
    +#ifdef CONFIG_PREEMPT_RT
    + msleep(1);
    +#else
    + barrier();
    +#endif
    + }
    +}
    +EXPORT_SYMBOL(tasklet_unlock_wait);
    +
    +#endif
    +
    static int ksoftirqd(void * __data)
    {
    struct sched_param param = { .sched_priority = MAX_USER_RT_PRIO/2 };
    -
    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: 2007-01-22 10:59    [W:0.024 / U:1.016 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site