xen/pciback: simplify pcistub device handling
The Xen pciback driver maintains a list of all its seized devices. There are two functions searching the list for a specific device with basically the same semantics just returning different structures in case of a match. Split out the search function. Signed-off-by: Juergen Gross <jgross@suse.com> Signed-off-by: David Vrabel <david.vrabel@citrix.com>
This commit is contained in:
parent
72a9b18629
commit
1af916b701
1 changed files with 21 additions and 21 deletions
|
@ -149,13 +149,10 @@ static inline void pcistub_device_put(struct pcistub_device *psdev)
|
||||||
kref_put(&psdev->kref, pcistub_device_release);
|
kref_put(&psdev->kref, pcistub_device_release);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct pcistub_device *pcistub_device_find(int domain, int bus,
|
static struct pcistub_device *pcistub_device_find_locked(int domain, int bus,
|
||||||
int slot, int func)
|
int slot, int func)
|
||||||
{
|
{
|
||||||
struct pcistub_device *psdev = NULL;
|
struct pcistub_device *psdev;
|
||||||
unsigned long flags;
|
|
||||||
|
|
||||||
spin_lock_irqsave(&pcistub_devices_lock, flags);
|
|
||||||
|
|
||||||
list_for_each_entry(psdev, &pcistub_devices, dev_list) {
|
list_for_each_entry(psdev, &pcistub_devices, dev_list) {
|
||||||
if (psdev->dev != NULL
|
if (psdev->dev != NULL
|
||||||
|
@ -163,15 +160,25 @@ static struct pcistub_device *pcistub_device_find(int domain, int bus,
|
||||||
&& bus == psdev->dev->bus->number
|
&& bus == psdev->dev->bus->number
|
||||||
&& slot == PCI_SLOT(psdev->dev->devfn)
|
&& slot == PCI_SLOT(psdev->dev->devfn)
|
||||||
&& func == PCI_FUNC(psdev->dev->devfn)) {
|
&& func == PCI_FUNC(psdev->dev->devfn)) {
|
||||||
|
return psdev;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct pcistub_device *pcistub_device_find(int domain, int bus,
|
||||||
|
int slot, int func)
|
||||||
|
{
|
||||||
|
struct pcistub_device *psdev;
|
||||||
|
unsigned long flags;
|
||||||
|
|
||||||
|
spin_lock_irqsave(&pcistub_devices_lock, flags);
|
||||||
|
|
||||||
|
psdev = pcistub_device_find_locked(domain, bus, slot, func);
|
||||||
|
if (psdev)
|
||||||
pcistub_device_get(psdev);
|
pcistub_device_get(psdev);
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* didn't find it */
|
|
||||||
psdev = NULL;
|
|
||||||
|
|
||||||
out:
|
|
||||||
spin_unlock_irqrestore(&pcistub_devices_lock, flags);
|
spin_unlock_irqrestore(&pcistub_devices_lock, flags);
|
||||||
return psdev;
|
return psdev;
|
||||||
}
|
}
|
||||||
|
@ -207,16 +214,9 @@ struct pci_dev *pcistub_get_pci_dev_by_slot(struct xen_pcibk_device *pdev,
|
||||||
|
|
||||||
spin_lock_irqsave(&pcistub_devices_lock, flags);
|
spin_lock_irqsave(&pcistub_devices_lock, flags);
|
||||||
|
|
||||||
list_for_each_entry(psdev, &pcistub_devices, dev_list) {
|
psdev = pcistub_device_find_locked(domain, bus, slot, func);
|
||||||
if (psdev->dev != NULL
|
if (psdev)
|
||||||
&& domain == pci_domain_nr(psdev->dev->bus)
|
|
||||||
&& bus == psdev->dev->bus->number
|
|
||||||
&& slot == PCI_SLOT(psdev->dev->devfn)
|
|
||||||
&& func == PCI_FUNC(psdev->dev->devfn)) {
|
|
||||||
found_dev = pcistub_device_get_pci_dev(pdev, psdev);
|
found_dev = pcistub_device_get_pci_dev(pdev, psdev);
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
spin_unlock_irqrestore(&pcistub_devices_lock, flags);
|
spin_unlock_irqrestore(&pcistub_devices_lock, flags);
|
||||||
return found_dev;
|
return found_dev;
|
||||||
|
|
Loading…
Reference in a new issue