Merge branch 'linux-next' of git://git.kernel.org/pub/scm/linux/kernel/git/jbarnes/pci-2.6
* 'linux-next' of git://git.kernel.org/pub/scm/linux/kernel/git/jbarnes/pci-2.6: (36 commits) PCI: hotplug: pciehp: Removed check for hotplug of display devices PCI: read memory ranges out of Broadcom CNB20LE host bridge PCI: Allow manual resource allocation for PCI hotplug bridges x86/PCI: make ACPI MCFG reserved error messages ACPI specific PCI hotplug: Use kmemdup PM/PCI: Update PCI power management documentation PCI: output FW warning in pci_read/write_vpd PCI: fix typos pci_device_dis/enable to pci_dis/enable_device in comments PCI quirks: disable msi on AMD rs4xx internal gfx bridges PCI: Disable MSI for MCP55 on P5N32-E SLI x86/PCI: irq and pci_ids patch for additional Intel Cougar Point DeviceIDs PCI: aerdrv: trivial cleanup for aerdrv_core.c PCI: aerdrv: trivial cleanup for aerdrv.c PCI: aerdrv: introduce default_downstream_reset_link PCI: aerdrv: rework find_aer_service PCI: aerdrv: remove is_downstream PCI: aerdrv: remove magical ROOT_ERR_STATUS_MASKS PCI: aerdrv: redefine PCI_ERR_ROOT_*_SRC PCI: aerdrv: rework do_recovery PCI: aerdrv: rework get_e_source() ...
This commit is contained in:
@@ -15,6 +15,7 @@
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/fs.h>
|
||||
#include <linux/proc_fs.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/seq_file.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/pfn.h>
|
||||
@@ -681,6 +682,8 @@ resource_size_t resource_alignment(struct resource *res)
|
||||
* release_region releases a matching busy region.
|
||||
*/
|
||||
|
||||
static DECLARE_WAIT_QUEUE_HEAD(muxed_resource_wait);
|
||||
|
||||
/**
|
||||
* __request_region - create a new busy resource region
|
||||
* @parent: parent resource descriptor
|
||||
@@ -693,6 +696,7 @@ struct resource * __request_region(struct resource *parent,
|
||||
resource_size_t start, resource_size_t n,
|
||||
const char *name, int flags)
|
||||
{
|
||||
DECLARE_WAITQUEUE(wait, current);
|
||||
struct resource *res = kzalloc(sizeof(*res), GFP_KERNEL);
|
||||
|
||||
if (!res)
|
||||
@@ -717,7 +721,15 @@ struct resource * __request_region(struct resource *parent,
|
||||
if (!(conflict->flags & IORESOURCE_BUSY))
|
||||
continue;
|
||||
}
|
||||
|
||||
if (conflict->flags & flags & IORESOURCE_MUXED) {
|
||||
add_wait_queue(&muxed_resource_wait, &wait);
|
||||
write_unlock(&resource_lock);
|
||||
set_current_state(TASK_UNINTERRUPTIBLE);
|
||||
schedule();
|
||||
remove_wait_queue(&muxed_resource_wait, &wait);
|
||||
write_lock(&resource_lock);
|
||||
continue;
|
||||
}
|
||||
/* Uhhuh, that didn't work out.. */
|
||||
kfree(res);
|
||||
res = NULL;
|
||||
@@ -791,6 +803,8 @@ void __release_region(struct resource *parent, resource_size_t start,
|
||||
break;
|
||||
*p = res->sibling;
|
||||
write_unlock(&resource_lock);
|
||||
if (res->flags & IORESOURCE_MUXED)
|
||||
wake_up(&muxed_resource_wait);
|
||||
kfree(res);
|
||||
return;
|
||||
}
|
||||
|
Reference in New Issue
Block a user