• Farhan Ali's avatar
    vfio-ccw: Prevent quiesce function going into an infinite loop · db08b2bf
    Farhan Ali authored
    [ Upstream commit d1ffa760 ]
    
    The quiesce function calls cio_cancel_halt_clear() and if we
    get an -EBUSY we go into a loop where we:
    	- wait for any interrupts
    	- flush all I/O in the workqueue
    	- retry cio_cancel_halt_clear
    
    During the period where we are waiting for interrupts or
    flushing all I/O, the channel subsystem could have completed
    a halt/clear action and turned off the corresponding activity
    control bits in the subchannel status word. This means the next
    time we call cio_cancel_halt_clear(), we will again start by
    calling cancel subchannel and so we can be stuck between calling
    cancel and halt forever.
    
    Rather than calling cio_cancel_halt_clear() immediately after
    waiting, let's try to disable the subchannel. If we succeed in
    disabling the subchannel then we know nothing else can happen
    with the device.
    Suggested-by: default avatarEric Farman <farman@linux.ibm.com>
    Signed-off-by: default avatarFarhan Ali <alifm@linux.ibm.com>
    Message-Id: <4d5a4b98ab1b41ac6131b5c36de18b76c5d66898.1555449329.git.alifm@linux.ibm.com>
    Reviewed-by: default avatarEric Farman <farman@linux.ibm.com>
    Acked-by: default avatarHalil Pasic <pasic@linux.ibm.com>
    Signed-off-by: default avatarCornelia Huck <cohuck@redhat.com>
    Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
    db08b2bf
vfio_ccw_drv.c 6.44 KB