On Sun, 29 Nov 2020, Michael Schmitz wrote:
Am 28.11.20 um 10:48 schrieb Finn Thain:
On Sat, 28 Nov 2020, Finn Thain wrote:
diff --git a/drivers/scsi/NCR5380.c b/drivers/scsi/NCR5380.c
index d654a6cc4162..739def70cffb 100644
--- a/drivers/scsi/NCR5380.c
+++ b/drivers/scsi/NCR5380.c
@@ -223,7 +223,10 @@ static int NCR5380_poll_politely2(struct NCR5380_hostdata *hostdata,
cpu_relax();
} while (n--);
- if (irqs_disabled() || in_interrupt())
+ /* We can't sleep when local irqs are disabled and callers ensure
+ * that local irqs are disabled whenever we can't sleep.
+ */
+ if (irqs_disabled())
return -ETIMEDOUT;
/* Repeatedly sleep for 1 ms until deadline */
Michael, Andreas, would you please confirm that this is workable on
Atari? The driver could sleep when IPL == 2 because
arch_irqs_disabled_flags() would return false (on Atari). I'm
wondering whether that would deadlock.
Pretty sure this would deadlock when in interrupt context here.
When in interrupt context, irqs_disabled() is true due to
spinlock_irqsave/restore() in NCR5380_intr().
My question was really about what would happen if we sleep with IPL == 2.
Otherwise, IPL 2 is perfectly OK (which is why
arch_irqs_disabled_flags() returns false in that case).
If you want to be 100% certain, I can give this one a spin.
Please only test it if you think it will work.
Cheers,
Michael