diff options
author | Matthew Wilcox <matthew@wil.cx> | 2006-10-19 19:41:28 +0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2006-12-02 01:36:58 +0300 |
commit | 7ea7e98fd8d02351c43ef4ab35d70f3aaa26c31d (patch) | |
tree | cb37b18402c2b82cc227ad6bd1ab3d57cf677ff3 /scripts | |
parent | 50bf14b3ff05fb6e10688021b96f95d30a300f8d (diff) | |
download | linux-7ea7e98fd8d02351c43ef4ab35d70f3aaa26c31d.tar.xz |
PCI: Block on access to temporarily unavailable pci device
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: Matthew Wilcox <matthew@wil.cx>
Acked-by: Adam Belay <abelay@novell.com>
Acked-by: Alan Cox <alan@redhat.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'scripts')
0 files changed, 0 insertions, 0 deletions