spinlock semantics
Nuno Antunes
nuno.antunes at gmail.com
Sun Feb 17 11:13:18 PST 2008
On Feb 17, 2008 6:52 PM, Matthew Dillon <dillon at apollo.backplane.com> wrote:
>
> :Hi,
>
> :
> :While reading about DragonFlys locking primitives in a quest to try to
> :understand which kind of lock best applies in each situation, I found
> :the following at the spinlock(9) manpage.
> :
> :"If you wish to disable FAST interrupts and IPIs you need to enter a
> :critical section prior to obtaining the spinlock."
> :
> :But then, on the mailing list archive, I found a message [1] where one
> :can read the following with regards to spinlocks:
> :
> :"Automatically enters a critical section."
> :
> :So, naturally, my question is which statement is true? Looking at the
> :implementation, i don't see any calls to crit_* there, so I assume
> :that the manpage is correct.
> :
> :Thanks,
> :Nuno
> :
> :[1] http://leaf.dragonflybsd.org/mailarchive/kernel/2006-11/msg00026.html
>
> spinlocks increment and decrement mycpu->gd_spinlocks_rd/wr.
> This prevents thread preemption from occuring (lwkt_thread.c line 846).
>
> This means that a FAST interrupt can still operate, and any threaded
> interrupt (which is basically all interrupts except the clock interrupt)
> will still be scheduled, but will NOT be able to preempt the current
> thread.
>
> It's kinda like a poor-man's critical section. It has a few issues
> the main one being that it does not currently check to see if a yield
> is needed after the last spinlock is released. I wanted the spinlock
> path to be as fast as possible.
>
> A critical section is a more encompassing feature. A critical section
> will cause the interrupt itself to be deferred if it occurs on the
> cpu in question... for example, an interrupt which schedules a
> thread during a spinlock will not preempt, but an interrupt which occurs
> during a critical section won't even schedule the interrupt thread in
> the first place. It will just mark the interrupt as pending in the
> machine-dependant portion of the globaldata structure, mask the
> interrupt, and return.
>
> Thus the scheduler itself can use a critical section to protect against
> reentrancy.
>
> -Matt
> Matthew Dillon
> <dillon at backplane.com>
>
I understand now, more than what I asked about. :) Thanks for the explanation.
Nuno
PS: maybe i should update the manpage...
More information about the Kernel
mailing list