• Niklas Schnelle's avatar
    s390/pci: fix leak of DMA tables on hard unplug · afdf9550
    Niklas Schnelle authored
    commit f606b3ef ("s390/pci: adapt events for zbus") removed the
    zpci_disable_device() call for a zPCI event with PEC 0x0304 because
    the device is already deconfigured by the platform.
    This however skips the Linux side of the disable in particular it leads
    to leaking the DMA tables and bitmaps because zpci_dma_exit_device() is
    never called on the device.
    
    If the device transitions to the Reserved state we call zpci_zdev_put()
    but zpci_release_device() will not call zpci_disable_device() because
    the state of the zPCI function is already ZPCI_FN_STATE_STANDBY.
    
    If the device is put into the Standby state, zpci_disable_device() is
    not called and the device is assumed to have been put in Standby through
    platform action.
    At this point the device may be removed by a subsequent event with PEC
    0x0308 or 0x0306 which calls zpci_zdev_put() with the same problem
    as above or the device may be configured again in which case
    zpci_disable_device() is also not called.
    
    Fix this by calling zpci_disable_device() explicitly for PEC 0x0304 as
    before. To make it more clear that zpci_disable_device() may be called,
    even if the lower level device has already been disabled by the
    platform, add a comment to zpci_disable_device().
    
    Cc: <stable@vger.kernel.org> # 5.8
    Fixes: f606b3ef ("s390/pci: adapt events for zbus")
    Signed-off-by: default avatarNiklas Schnelle <schnelle@linux.ibm.com>
    Signed-off-by: default avatarVasily Gorbik <gor@linux.ibm.com>
    afdf9550
pci.c 19.6 KB