Re: Safely giving up a lock before sleeping

From: Richard B. Johnson (
Date: Tue Jul 24 2001 - 07:39:04 EST

On Mon, 23 Jul 2001, Russ Lewis wrote:

> Of course, since I need the lock to do anything, the first thing I do
> (after removing myself from the wait queue and checking for signals) is
> to relock the lock.
> Is this a common problem? Is there a more elegant solution to this?

If you need to protect a piece of code, and the variables it
accesses are ONLY accessed by that code, investigate the use
of a simple spin-lock (no disabling interrupts). This can
prevent races such as you describe.

        spin_lock_irqsave(&big_lock, flags);
        do_critical_stuff(); /* Where global variables could change */
        spin_lock(&little_lock); /* Simple spin for any other entry */
        spin_unlock_irqrestore(&big_lock, flags); /* Interrupts now on */

Note that this turns a possible race into a possible CPU time-eating
spin so you need to carefully look at how the code is written. You
could turn that spin-wait into a sleep if you used a semaphore to
protect that section of code "up(), and down()".

Dick Johnson

Penguin : Linux version 2.4.1 on an i686 machine (799.53 BogoMips).

    I was going to compile a list of innovations that could be
    attributed to Microsoft. Once I realized that Ctrl-Alt-Del
    was handled in the BIOS, I found that there aren't any.

To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to
More majordomo info at
Please read the FAQ at

This archive was generated by hypermail 2b29 : Tue Jul 31 2001 - 21:00:15 EST