Am 20.09.2023 um 21:58 schrieb Olivier Dautricourt:
Sparse complains because we first take the lock in msgdma_tasklet -> move
locking to msgdma_chan_desc_cleanup.
In consequence, move calling of msgdma_chan_desc_cleanup outside of the
critical section of function msgdma_tasklet.
Use spin_unlock_irqsave/restore instead of just spinlock/unlock to keep
state of irqs while executing the callbacks.
What about the locking in the IRQ handler msgdma_irq_handler() itself? -
Shouldn't spin_unlock_irqsave/restore() be used there as well instead of
just spinlock/unlock()?
IMO no:
It is covered by [1]("Locking Between Hard IRQ and Softirqs/Tasklets")
The irq handler cannot be preempted by the tasklet, so the
spin_lock/unlock version is ok. However the tasklet could be interrupted
by the Hard IRQ hence the disabling of irqs with save/restore when
entering critical section.
It should not be needed to keep interrupts locally disabled while invoking
callbacks, will add this to the commit description.
[1] https://www.kernel.org/doc/Documentation/kernel-hacking/locking.rst