• Niklas Schnelle's avatar
    s390/pci: improve zpci_dev reference counting · c122383d
    Niklas Schnelle authored
    Currently zpci_dev uses kref based reference counting but only accounts
    for one original reference plus one reference from an added pci_dev to
    its underlying zpci_dev. Counting just the original reference worked
    until the pci_dev reference was added in commit 2a671f77 ("s390/pci:
    fix use after free of zpci_dev") because once a zpci_dev goes away, i.e.
    enters the reserved state, it would immediately get released. However
    with the pci_dev reference this is no longer the case and the zpci_dev
    may still appear in multiple availability events indicating that it was
    reserved. This was solved by detecting when the zpci_dev is already on
    its way out but still hanging around. This has however shown some light
    on how unusual our zpci_dev reference counting is.
    
    Improve upon this by modelling zpci_dev reference counting on pci_dev.
    Analogous to pci_get_slot() increment the reference count in
    get_zdev_by_fid(). Thus all users of get_zdev_by_fid() must drop the
    reference once they are done with the zpci_dev.
    
    Similar to pci_scan_single_device(), zpci_create_device() returns the
    device with an initial count of 1 and the device added to the zpci_list
    (analogous to the PCI bus' device_list). In turn users of
    zpci_create_device() must only drop the reference once the device is
    gone from the point of view of the zPCI subsystem, it might still be
    referenced by the common PCI subsystem though.
    Reviewed-by: default avatarMatthew Rosato <mjrosato@linux.ibm.com>
    Signed-off-by: default avatarNiklas Schnelle <schnelle@linux.ibm.com>
    Signed-off-by: default avatarVasily Gorbik <gor@linux.ibm.com>
    c122383d
pci_clp.c 15.3 KB