diff options
author | Finn Thain <fthain@telegraphics.com.au> | 2014-11-12 00:12:08 -0500 |
---|---|---|
committer | Christoph Hellwig <hch@lst.de> | 2014-11-20 03:11:13 -0500 |
commit | 16b29e75a78ae03250233468b68f7ae467d3dc7a (patch) | |
tree | a5ba9e016d5557d2a6f5fb60dc83ae906ae771af /arch/m68k/include | |
parent | cbad48deb38d8e442db9760ca1f950cd24429707 (diff) |
atari_scsi: Fix atari_scsi deadlocks on Falcon
Don't disable irqs when waiting for the ST DMA "lock"; its release may
require an interrupt.
Introduce stdma_try_lock() for use in soft irq context. atari_scsi now tells
the SCSI mid-layer to defer queueing a command if the ST DMA lock is not
available, as per Michael's patch:
http://marc.info/?l=linux-m68k&m=139095335824863&w=2
The falcon_got_lock variable is race prone: we can't disable IRQs while
waiting to acquire the lock, so after acquiring it there must be some
interval during which falcon_got_lock remains false. Introduce
stdma_is_locked_by() to replace falcon_got_lock.
The falcon_got_lock tests in the EH handlers are incorrect these days. It
can happen that an EH handler is called after a command completes normally.
Remove these checks along with falcon_got_lock.
Also remove the complicated and racy fairness wait queues. If fairness is an
issue (when SCSI competes with IDE for the ST DMA interrupt), the solution
is likely to be a lower value for host->can_queue.
Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
Reviewed-by: Hannes Reinecke <hare@suse.de>
Tested-by: Michael Schmitz <schmitzmic@gmail.com>
Acked-by: Geert Uytterhoeven <geert@linux-m68k.org>
Signed-off-by: Christoph Hellwig <hch@lst.de>
Diffstat (limited to 'arch/m68k/include')
-rw-r--r-- | arch/m68k/include/asm/atari_stdma.h | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/arch/m68k/include/asm/atari_stdma.h b/arch/m68k/include/asm/atari_stdma.h index 8e389b7fa70c..d24e34d870dc 100644 --- a/arch/m68k/include/asm/atari_stdma.h +++ b/arch/m68k/include/asm/atari_stdma.h | |||
@@ -8,11 +8,11 @@ | |||
8 | 8 | ||
9 | /***************************** Prototypes *****************************/ | 9 | /***************************** Prototypes *****************************/ |
10 | 10 | ||
11 | int stdma_try_lock(irq_handler_t, void *); | ||
11 | void stdma_lock(irq_handler_t handler, void *data); | 12 | void stdma_lock(irq_handler_t handler, void *data); |
12 | void stdma_release( void ); | 13 | void stdma_release( void ); |
13 | int stdma_others_waiting( void ); | ||
14 | int stdma_islocked( void ); | 14 | int stdma_islocked( void ); |
15 | void *stdma_locked_by( void ); | 15 | int stdma_is_locked_by(irq_handler_t); |
16 | void stdma_init( void ); | 16 | void stdma_init( void ); |
17 | 17 | ||
18 | /************************* End of Prototypes **************************/ | 18 | /************************* End of Prototypes **************************/ |