mirror of
https://github.com/torvalds/linux.git
synced 2026-10-07 22:37:45 -04:00
IIO triggers are software IRQ chips that split an incoming IRQ into separate IRQs routed to all devices using the trigger. When all consumers are done then a trigger callback reenable() is called. There are a few circumstances under which this can happen in atomic context. 1) A single user of the trigger that calls the iio_trigger_done() function from interrupt context. 2) A race between disconnecting the last device from a trigger and the trigger itself sucessfully being disabled. To avoid a resulting scheduling whilst atomic, close this second corner by using schedule_work() to ensure the reenable is not done in atomic context. Note that drivers must be careful to manage the interaction of set_state() and reenable() callbacks to ensure appropriate reference counting if they are relying on the same hardware controls. Deliberately taking this the slow path rather than via a fixes tree because the error has hard to hit and I would like it to soak for a while before hitting a release kernel. Signed-off-by: Jonathan Cameron <[email protected]> Cc: Pengutronix Kernel Team <[email protected]> Cc: Dmitry Torokhov <[email protected]> Tested-by: Oleksij Rempel <[email protected]> Cc: <[email protected]> Link: https://lore.kernel.org/r/[email protected]