qemu-e2k/hw/scsi
Guenter Roeck ea84a44250 scsi: esp: Defer command completion until previous interrupts have been handled
The guest OS reads RSTAT, RSEQ, and RINTR, and expects those registers
to reflect a consistent state. However, it is possible that the registers
can change after RSTAT was read, but before RINTR is read, when
esp_command_complete() is called.

Guest OS		qemu
--------		----
[handle interrupt]
Read RSTAT
			esp_command_complete()
			 RSTAT = STAT_ST
			 esp_dma_done()
			  RSTAT |= STAT_TC
			  RSEQ = 0
			  RINTR = INTR_BS

Read RSEQ
Read RINTR		RINTR = 0
			RSTAT &= ~STAT_TC
			RSEQ = SEQ_CD

The guest OS would then try to handle INTR_BS combined with an old
value of RSTAT. This sometimes resulted in lost events, spurious
interrupts, guest OS confusion, and stalled SCSI operations.
A typical guest error log (observed with various versions of Linux)
looks as follows.

scsi host1: Spurious irq, sreg=13.
...
scsi host1: Aborting command [84531f10:2a]
scsi host1: Current command [f882eea8:35]
scsi host1: Queued command [84531f10:2a]
scsi host1:  Active command [f882eea8:35]
scsi host1: Dumping command log
scsi host1: ent[15] CMD val[44] sreg[90] seqreg[00] sreg2[00] ireg[20] ss[00] event[0c]
scsi host1: ent[16] CMD val[01] sreg[90] seqreg[00] sreg2[00] ireg[20] ss[02] event[0c]
scsi host1: ent[17] CMD val[43] sreg[90] seqreg[00] sreg2[00] ireg[20] ss[02] event[0c]
scsi host1: ent[18] EVENT val[0d] sreg[92] seqreg[04] sreg2[00] ireg[18] ss[00] event[0c]
...

Defer handling command completion until previous interrupts have been
handled to fix the problem.

Signed-off-by: Guenter Roeck <linux@roeck-us.net>
2019-01-11 13:57:24 +01:00
..
emulation.c scsi-generic: avoid invalid access to struct when emulating block limits 2018-11-06 21:35:06 +01:00
esp-pci.c scsi: esp: Defer command completion until previous interrupts have been handled 2019-01-11 13:57:24 +01:00
esp.c scsi: esp: Defer command completion until previous interrupts have been handled 2019-01-11 13:57:24 +01:00
lsi53c895a.c lsi: Reselection needed to remove pending commands from queue 2018-11-27 15:06:14 +01:00
Makefile.objs scsi-generic: avoid invalid access to struct when emulating block limits 2018-11-06 21:35:06 +01:00
megasas.c megasas: fix sglist leak 2018-08-23 13:32:50 +02:00
mfi.h
mpi.h
mptconfig.c
mptendian.c hw/scsi/mptendian: Avoid taking address of fields in packed structs 2018-10-02 19:09:14 +02:00
mptsas.c scsi: mptsas: Mark as storage device 2018-08-23 13:32:50 +02:00
mptsas.h
scsi-bus.c vmstate: constify VMStateField 2018-11-27 15:35:15 +01:00
scsi-disk.c scsi-disk: Fix crash if underlying host file or disk returns error 2018-11-22 16:43:48 +01:00
scsi-generic.c scsi-generic: do not do VPD emulation for sense other than ILLEGAL_REQUEST 2018-11-06 21:35:06 +01:00
spapr_vscsi.c scsi: Remove automatic creation of SCSI controllers with -drive if=scsi 2018-03-06 14:00:59 +01:00
srp.h
trace-events scsi: esp: Defer command completion until previous interrupts have been handled 2019-01-11 13:57:24 +01:00
vhost-scsi-common.c vhost-scsi: unify vhost-scsi get_features implementations 2018-08-23 18:46:25 +02:00
vhost-scsi.c vhost-scsi: prevent using uninitialized vqs 2018-11-05 13:24:02 -05:00
vhost-user-scsi.c vhost-scsi: expose 't10_pi' property for VIRTIO_SCSI_F_T10_PI 2018-08-23 18:46:25 +02:00
viosrp.h
virtio-scsi-dataplane.c Replace '-enable-kvm' with '-accel kvm' in docs and help texts 2018-06-28 19:05:32 +02:00
virtio-scsi.c call HotplugHandler->plug() as the last step in device realization 2018-10-19 13:44:12 +02:00
vmw_pvscsi.c qdev: use device_class_set_parent_realize/unrealize/reset() 2018-02-05 13:54:38 +01:00
vmw_pvscsi.h