• Matthew Wilcox's avatar
    PCI: Block on access to temporarily unavailable pci device · 7ea7e98f
    Matthew Wilcox authored
    The existing implementation of pci_block_user_cfg_access() was recently
    criticised for providing out of date information and for returning errors
    on write, which applications won't be expecting.
    
    This reimplementation uses a global wait queue and a bit per device.
    I've open-coded prepare_to_wait() / finish_wait() as I could optimise
    it significantly by knowing that the pci_lock protected us at all points.
    
    It looked a bit funny to be doing a spin_unlock_irqsave(); schedule(),
    so I used spin_lock_irq() for the _user versions of pci_read_config and
    pci_write_config.  Not carrying a flags pointer around made the code
    much less nasty.
    
    Attempts to block an already blocked device hit a BUG() and attempts to
    unblock an already unblocked device hit a WARN().  If we need to block
    access to a device from userspace, it's because it's unsafe for even
    another bit of the kernel to access the device.  An attempt to block
    a device for a second time means we're about to access the device to
    perform some other operation, which could provoke undefined behaviour
    from the device.
    Signed-off-by: default avatarMatthew Wilcox <matthew@wil.cx>
    Acked-by: default avatarAdam Belay <abelay@novell.com>
    Acked-by: default avatarAlan Cox <alan@redhat.com>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
    7ea7e98f
access.c 4.9 KB