e7dcc514a4
IRQ polling thread calls ISR after enable_irq() to handle any missed I/O
completion. The atomic flag "in_used" was added to have the synchronization
between the IRQ polling thread and the interrupt context. There is a bug
around it leading to a race condition.
Below is the sequence:
- IRQ polling thread accesses ISR, fetches the reply descriptor.
- Real interrupt arrives and pre-empts polling thread (enable_irq() is
already called).
- Interrupt context picks the same reply descriptor as fetched by polling
thread, processes it, and exits.
- Polling thread resumes and processes the descriptor which is already
processed by interrupt thread leads to kernel crash.
Setting the "in_used" flag before fetching the reply descriptor ensures
synchronized access to ISR.
Link: https://www.spinics.net/lists/linux-scsi/msg159440.html
Link: https://lore.kernel.org/r/20210929124022.24605-2-sumit.saxena@broadcom.com
Fixes:
|
||
---|---|---|
.. | ||
Kconfig.megaraid | ||
Makefile | ||
mbox_defs.h | ||
mega_common.h | ||
megaraid_ioctl.h | ||
megaraid_mbox.c | ||
megaraid_mbox.h | ||
megaraid_mm.c | ||
megaraid_mm.h | ||
megaraid_sas_base.c | ||
megaraid_sas_debugfs.c | ||
megaraid_sas_fp.c | ||
megaraid_sas_fusion.c | ||
megaraid_sas_fusion.h | ||
megaraid_sas.h |