• Jan Glauber's avatar
    [S390] qdio: clear shared DSCI before scheduling the queue handler · b02f0c2e
    Jan Glauber authored
    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: default avatarUrsula Braun <ursula.braun@de.ibm.com>
    Signed-off-by: default avatarJan Glauber <jang@linux.vnet.ibm.com>
    Signed-off-by: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
    b02f0c2e
qdio_thinint.c 6.33 KB