lkml.org 
[lkml]   [2001]   [Feb]   [5]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: IRQ and sleep_on
    Ok thank you for your help.
    I've followed your first advice. My solution was ok on my target (ppc and x86) but was not a good solution.
    I'm very interesting to know why it's bad to restore flags in a sub-function. I imagine it should be due to an optimisation in the restore function.

    Thank you,
    Christophe Barbé


    On lun, 05 fév 2001 13:59:28 Manfred Spraul wrote:
    > christophe barbe wrote:
    > >
    > > I've missed the thread "avoiding bad sleeps" last week. I've had a similar problem
    > > and I would like to discuss the solution I've used to avoid it.
    > >
    > > I want to wake up a sleeping process from an IRQ handler. In the process, if I use
    > > a interruptible_sleep_on(), I need first to restore flags (otherwise the process
    > > will sleep forever).
    > >
    > > restore_flags(flags);
    > > // <<== here IRQ handler possibly call wake_up()
    > > interruptible_sleep_on(&my_queue);
    > >
    > > [...]
    > > I've written a modified version of interruptible_sleep_on which takes an
    > > additionnal argument : flags to be restored.
    >
    > That's possible, but it will crash on Sparc: you cannot restore the
    > interrupt flag saved in one function in another function.
    >
    > The solution is very simple: do not call restore_flags() before
    > interruptible_sleep_on(), the schedule internally reenables interrupts.
    >
    > >>>>>>>>>>
    > for(;;) {
    > cli();
    > if(condition) {
    > sti();
    > break;
    > }
    > interruptible_sleep_on();
    > sti(); /* required! */
    > }
    > >>>>>>>>>
    >
    > But if you are writing new code, then DO NOT USE sleep_on(), use
    > add_wait_queue(), and a spinlock instead of cli().
    > Look at wait_event_irq in <linux/raid/md_k.h> from the 2.4 kernel as an
    > example.
    >
    > --
    > Manfred
    > -
    > To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    > the body of a message to majordomo@vger.kernel.org
    > Please read the FAQ at http://www.tux.org/lkml/
    >
    --
    Christophe Barbé
    Software Engineer
    Lineo High Availability Group
    42-46, rue Médéric
    92110 Clichy - France
    phone (33).1.41.40.02.12
    fax (33).1.41.40.02.01
    www.lineo.com
    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    Please read the FAQ at http://www.tux.org/lkml/

    \
     
     \ /
      Last update: 2005-03-22 12:56    [W:0.024 / U:158.476 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site