linux/drivers/s390/cio
Jan Glauber b02f0c2ea2 [S390] qdio: clear shared DSCI before scheduling the queue handler
The following race can occur with qdio devices that use the shared device
state change indicator:

Device (Shared DSCI)    CPU0                            CPU1
===============================================================================

1. DSCI 0 => 1,
   INT pending
                        2. Thinint handler
                        * si_used = 1
                        * Inbound tasklet_schedule
                        * DSCI 1 => 0

3. DSCI 0 => 1,
   INT pending

                                                        4. Thinint handler
                                                        * si_used = 1
                                                        * Inbound tasklet_schedu
le
                                                           => NOP

                        5. Inbound tasklet run

6. DSCI = 1,
   INT surpressed

                                                        7. DSCI 1 => 0

The race would lead to a stall where new data in the input queue is
not recognized so the device stops working in case of no further traffic.

Fix the race by resetting the DSCI before scheduling the inbound tasklet
so the device generates an interrupt if new data arrives in the above
scenario in step 6.

Reviewed-by: Ursula Braun <ursula.braun@de.ibm.com>
Signed-off-by: Jan Glauber <jang@linux.vnet.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
2011-07-24 10:48:00 +02:00
..
Makefile [S390] qdio: convert global statistics to per-device stats 2010-01-04 09:05:58 +01:00
airq.c [S390] cio: airq - fix array boundary 2009-03-26 15:24:14 +01:00
blacklist.c [S390] cio: remove custom implementation of hex_to_bin() 2010-10-25 16:10:17 +02:00
blacklist.h [PATCH] s390: multiple subchannel sets support 2006-01-06 08:33:52 -08:00
ccwgroup.c [S390] ccwgroup_driver: remove duplicate members 2011-03-23 10:15:59 +01:00
ccwreq.c [S390] ccwreq: add ability to use all paths 2010-08-09 18:12:54 +02:00
chp.c [S390] cio: update descriptor in chsc_chp_vary 2010-10-25 16:10:18 +02:00
chp.h [S390] cio: update descriptor in chsc_chp_vary 2010-10-25 16:10:18 +02:00
chsc.c [S390] chsc: process channel-path-availability information 2011-05-23 10:24:31 +02:00
chsc.h [S390] cio: obtain mdc value per channel path 2011-01-05 12:47:28 +01:00
chsc_sch.c [S390] css_driver: remove duplicate members 2011-03-15 17:08:24 +01:00
chsc_sch.h [S390] cio: Add chsc subchannel driver. 2008-07-14 10:02:12 +02:00
cio.c [S390] cio: move options to io_sch_private 2011-03-15 17:08:23 +01:00
cio.h [S390] css: remove subchannel private 2011-03-15 17:08:24 +01:00
cio_debug.h [S390] cio: Remove cio_msg kernel parameter. 2008-05-07 09:23:01 +02:00
cmf.c tree-wide: fix assorted typos all over the place 2009-12-04 15:39:55 +01:00
crw.c [S390] cio: wait for channel report 2010-02-26 22:37:29 +01:00
css.c PM: Improve error code of pm_notifier_call_chain() 2011-07-15 23:58:20 +02:00
css.h [S390] css_bus_type: make it static 2011-03-15 17:08:24 +01:00
device.c [S390] cio: prevent purging of CCW devices in the online state 2011-04-04 09:43:33 +02:00
device.h [S390] ccw_bus_type: make it static 2011-03-23 10:15:59 +01:00
device_fsm.c [S390] get rid of unused variables 2011-05-23 10:24:28 +02:00
device_id.c [S390] cio: use all available paths for some internal I/O 2010-08-09 18:12:54 +02:00
device_ops.c [S390] get rid of unused variables 2011-05-23 10:24:28 +02:00
device_pgid.c [S390] cio: notify drivers of channel path events 2010-10-25 16:10:19 +02:00
device_status.c [S390] cio: remove intretry flag 2009-12-07 12:51:31 +01:00
fcx.c [S390] drivers: Correct size given to memset 2009-12-18 17:43:32 +01:00
idset.c [S390] cio: introduce consistent subchannel scanning 2009-09-22 22:58:42 +02:00
idset.h [S390] cio: introduce consistent subchannel scanning 2009-09-22 22:58:42 +02:00
io_sch.h [S390] css: move io_private to drv_data 2011-03-15 17:08:23 +01:00
ioasm.h [S390] cio: move asms to generic header 2011-03-15 17:08:23 +01:00
isc.c [S390] cio: introduce isc_(un)register functions. 2008-07-14 10:02:11 +02:00
itcw.c [S390] cio: reduce memory consumption of itcw structures 2011-01-05 12:47:29 +01:00
orb.h [S390] cio: move orb definitions to separate header 2011-03-15 17:08:23 +01:00
qdio.h [S390] qdio: cleanup SIGA sync 2011-01-05 12:47:28 +01:00
qdio_debug.c [S390] qdio: outbound queue full counter 2011-01-05 12:47:28 +01:00
qdio_debug.h [S390] qdio: rework debug feature logging 2008-12-25 13:38:59 +01:00
qdio_main.c [S390] qdio: Split SBAL entry flags 2011-06-06 14:14:56 +02:00
qdio_setup.c [S390] qdio: cleanup SIGA sync 2011-01-05 12:47:28 +01:00
qdio_thinint.c [S390] qdio: clear shared DSCI before scheduling the queue handler 2011-07-24 10:48:00 +02:00