Skip to content
  • Niklas Schnelle's avatar
    s390/pci: fix leak of PCI device structure · 348fcd22
    Niklas Schnelle authored
    commit 0b13525c upstream.
    
    In commit 05bc1be6 ("s390/pci: create zPCI bus") we removed the
    pci_dev_put() call matching the earlier pci_get_slot() done as part of
    __zpci_event_availability(). This was based on the wrong understanding
    that the device_put() done as part of pci_destroy_device() would counter
    the pci_get_slot() when it only counters the initial reference. This
    same understanding and existing bad example also lead to not doing
    a pci_dev_put() in zpci_remove_device().
    
    Since releasing the PCI devices, unlike releasing the PCI slot, does not
    print any debug message for testing I added one in pci_release_dev().
    This revealed that we are indeed leaking the PCI device on PCI
    hotunplug. Further testing also revealed another missing pci_dev_put() in
    disable_slot().
    
    Fix this by adding the missing pci_dev_put() in disable_slot() and fix
    zpci_remove_device() with the correct pci_dev_put() calls. Also instead
    of calling pci_get_slot() in __zpci_event_availability() to determine if
    a PCI device is registered and then doing the same again in
    zpci_remove_device() do this once in zpci_remove_device() which makes
    sure that the pdev in __zpci_event_availability() is only used for the
    result of pci_scan_single_device() which does not need a reference count
    decremnt as its ownership goes to the PCI bus.
    
    Also move the check if zdev->zbus->bus is set into zpci_remove_device()
    since it may be that we're removing a device with devfn != 0 which never
    had a PCI bus. So we can still set the pdev->error_state to indicate
    that the device is not usable anymore, add a flag to set the error state.
    
    Fixes: 05bc1be6 ("s390/pci: create zPCI bus")
    Cc: <stable@vger.kernel.org> # 5.8+: e1bff843 s390/pci: remove superfluous zdev->zbus check
    Cc: <stable@vger.kernel.org> # 5.8+: ba764dd7
    
     s390/pci: refactor zpci_create_device()
    Cc: <stable@vger.kernel.org> # 5.8+
    Reviewed-by: default avatarMatthew Rosato <mjrosato@linux.ibm.com>
    Signed-off-by: default avatarNiklas Schnelle <schnelle@linux.ibm.com>
    Signed-off-by: default avatarHeiko Carstens <hca@linux.ibm.com>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    348fcd22