mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-29 23:53:32 +00:00
a93c383531
qla4_82xx_crb_win_lock() spins on a certain hardware state until it's
updated. At the end of each spin, if in_interrupt() is true, it does 20
loops of cpu_relax(). Otherwise, it yields the CPU.
The in_interrupt() macro is ill-defined as it does not provide what the
name suggests, and it does not catch the intended use-case here.
qla4_82xx_crb_win_lock() is always invoked with scsi_qla_host::hw_lock
acquired, with disabled interrupts. If the caller is in process context, as
in qla4_82xx_need_reset_handler(), then in_interrupt() will return false
even though it is not allowed to call schedule().
Remove the in_interrupt() check.
Change qla4_82xx_crb_win_lock() specification to a purely atomic
function. Mark it as static, remove its forward declaration, and move it
above its callers. To avoid hammering the PCI bus while spinning, use a 10
micro-second delay instead of cpu_relax().
Link: https://lore.kernel.org/r/20201126132952.2287996-4-bigeasy@linutronix.de
Fixes:
|
||
---|---|---|
.. | ||
Kconfig | ||
Makefile | ||
ql4_83xx.c | ||
ql4_83xx.h | ||
ql4_attr.c | ||
ql4_bsg.c | ||
ql4_bsg.h | ||
ql4_dbg.c | ||
ql4_dbg.h | ||
ql4_def.h | ||
ql4_fw.h | ||
ql4_glbl.h | ||
ql4_init.c | ||
ql4_inline.h | ||
ql4_iocb.c | ||
ql4_isr.c | ||
ql4_mbx.c | ||
ql4_nvram.c | ||
ql4_nvram.h | ||
ql4_nx.c | ||
ql4_nx.h | ||
ql4_os.c | ||
ql4_version.h |