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:
Juergen Gross 2016-09-22 10:45:39 +02:00 committed by David Vrabel
parent 72a9b18629
commit 1af916b701

View File

@ -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)) {
pcistub_device_get(psdev); return psdev;
goto out;
} }
} }
/* didn't find it */ return NULL;
psdev = 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);
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) found_dev = pcistub_device_get_pci_dev(pdev, psdev);
&& 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);
break;
}
}
spin_unlock_irqrestore(&pcistub_devices_lock, flags); spin_unlock_irqrestore(&pcistub_devices_lock, flags);
return found_dev; return found_dev;