Here's the references I was using when I wrote the spinlock patches,

http://www.kernel.org/pub/linux/kernel/people/rusty/kernel-locking/index.html

http://lwn.net/Kernel/LDD3/
chapters 5,7 and 10


as far as I know, timers are run in softirq, not hardirq,
so in hardirq, there are no state changes.