Then it wouldn't be "raw"! It seems info on raw spinlocks is out
of sync with current code. Allegedly it should be possible to just
pass a raw_spinlock_t pointer to spin_lock_irqsave() and friends
and have GCC sort out the right stuff ... but that didn't work.
I speculate that either the design has changed (without fanfare),
or else that stuff is in RT kernels and has not yet gone upstream.
Unfortunately, that's not what I observed/measured.
http://marc.info/?l=linux-kernel&m=119429680220361&w=2
Plus, note the comment about hardirq context and RT environments.
When that spinlock is really a mutex, and the non-hardirq contexts
are tasks, non-raw spinlocks would wrongly prevent access to GPIOs
from true hardirq contexts.
The above email summarizes significant slowdown I observed using
just i2c-gpio, which happened to be easy to measure down to the
microsecond level.
See above. Allegedly we ought to be able to use those calls even
with raw spinlocks ... but that didn't work when I tried it. I'd
certainly prefer if it did work.
Remember that GPIOs do get used for bitbanging, and there's lots
of kernel code to make bit ops stay fast!
The canonical reason to inline GPIO operations is so that when
you bitbang some serial protocol, you're closer to one instruction
per bit toggle than fifty ... at one point I measured a factor of
nearly three speedup for byte-level bitbanging for SPI (ca. 70 Kbit
with quick function calls, vs about 2 Mbits inlined, ISTR) ... with
most of the overhead being to pass the next byte down to the bitbang
loop. Using a bigger wordsize saw even more improvement.
Actually that one could easily be later, fs_initcall or whatnot.
I think that's debris from other versions.
- Dave
-