Hi!
On 14:35 Thu 18 Dec , luca ellero wrote:
> I all,
> I was reading "Unreliable Guide To Locking" by Rusty Russell:
>
> http://www.kernel.org/pub/linux/kernel/people/rusty/kernel-locking/index.html
>
> but the table (named Cheat Sheet For Locking) is quite confusing me:
>
> http://www.kernel.org/pub/linux/kernel/people/rusty/kernel-locking/c214.html#MINIMUM-LOCK-REQIREMENTS
>
> maybe it is this really _cheating_ and _unreliable_ :-(
>
> So I want to ask you a two questions:
>
> 1. following the table it seems that, if there is a critical section
> only in one place in user context, no locking is needed (if you cross
> "User Context A" with "User Context A" you get "None").
You need locking *only* if there may be more than one cpu/threads, which
try to execute the critical section at the same time.
> But as far as I
> know, if you have critical section in a "read" syscall for example, you
> must use some locking because two user processes can read the same
> device at the same time.
If 2 user-space processes try to read at the same time, you have to keep
critical sections/locking in mind. If they cannot (open for the second process
fails?), you do not have to lock these operations.
BTW: Do *not* use semaphores any more, except if you need/use the counting
mechanism. Use mutexes instead (see Documentation/mutex-design.txt)
> 2. Why spin_lock_irqsave is used only between "IRQ Handler A" and "IRQ
> Handler B"? In all other situation spin_lock_irq is used instead. As far
> as I know you can use this function (spin_lock_irq) only if you are
> absolutely sure interrupts are not already disabled. So my question is
> how can we be absolutely sure in all this situation that interrupts are
> not already disabled.
There are 3 different ways you can handle interrupts when locking spinlocks:
spin_lock: interrupts have to be *disabled* when calling this function
spin_lock_irq: interrupts have to be *enabled* when calling this function and
are disabled afterwards - After spin_unlock_irq, they are enabled. This is the
case even if they were disabled before, which is probably not what you want.
spin_lock_irqsave: may be called with interrupts enabled and disabled - The
interrupt state is stored in a local "iflags" variable and is restored during
spin_unlock_irqrestore. Use this, if you are not sure about the interrupt
state.
-Michi
--
programing a layer 3+4 network protocol for mesh networks
see http://michaelblizek.twilightparadox.com
--
To unsubscribe from this list: send an email with
"unsubscribe kernelnewbies" to [email protected]
Please read the FAQ at http://kernelnewbies.org/FAQ