Commit c4523aae authored by Marc-André Lureau's avatar Marc-André Lureau
Browse files

tests: add specialized device_find function



Allow specifying which slot to look for the device.

This will be used in the following patch to avoid leaking when multiple
devices exists and we want to lookup the hotplug one.

Signed-off-by: default avatarMarc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: default avatarEric Blake <eblake@redhat.com>
parent 62030ed1
Loading
Loading
Loading
Loading
+25 −4
Original line number Diff line number Diff line
@@ -24,6 +24,8 @@
typedef struct QVirtioPCIForeachData {
    void (*func)(QVirtioDevice *d, void *data);
    uint16_t device_type;
    bool has_slot;
    int slot;
    void *user_data;
} QVirtioPCIForeachData;

@@ -55,7 +57,8 @@ static void qvirtio_pci_foreach_callback(
    QVirtioPCIForeachData *d = data;
    QVirtioPCIDevice *vpcidev = qpcidevice_to_qvirtiodevice(dev);

    if (vpcidev->vdev.device_type == d->device_type) {
    if (vpcidev->vdev.device_type == d->device_type &&
        (!d->has_slot || vpcidev->pdev->devfn == d->slot << 3)) {
        d->func(&vpcidev->vdev, d->user_data);
    } else {
        g_free(vpcidev);
@@ -290,11 +293,14 @@ const QVirtioBus qvirtio_pci = {
    .virtqueue_kick = qvirtio_pci_virtqueue_kick,
};

void qvirtio_pci_foreach(QPCIBus *bus, uint16_t device_type,
static void qvirtio_pci_foreach(QPCIBus *bus, uint16_t device_type,
                bool has_slot, int slot,
                void (*func)(QVirtioDevice *d, void *data), void *data)
{
    QVirtioPCIForeachData d = { .func = func,
                                .device_type = device_type,
                                .has_slot = has_slot,
                                .slot = slot,
                                .user_data = data };

    qpci_device_foreach(bus, PCI_VENDOR_ID_REDHAT_QUMRANET, -1,
@@ -304,7 +310,22 @@ void qvirtio_pci_foreach(QPCIBus *bus, uint16_t device_type,
QVirtioPCIDevice *qvirtio_pci_device_find(QPCIBus *bus, uint16_t device_type)
{
    QVirtioPCIDevice *dev = NULL;
    qvirtio_pci_foreach(bus, device_type, qvirtio_pci_assign_device, &dev);

    qvirtio_pci_foreach(bus, device_type, false, 0,
                        qvirtio_pci_assign_device, &dev);

    dev->vdev.bus = &qvirtio_pci;

    return dev;
}

QVirtioPCIDevice *qvirtio_pci_device_find_slot(QPCIBus *bus,
                                               uint16_t device_type, int slot)
{
    QVirtioPCIDevice *dev = NULL;

    qvirtio_pci_foreach(bus, device_type, true, slot,
                        qvirtio_pci_assign_device, &dev);

    dev->vdev.bus = &qvirtio_pci;

+2 −2
Original line number Diff line number Diff line
@@ -31,9 +31,9 @@ typedef struct QVirtQueuePCI {

extern const QVirtioBus qvirtio_pci;

void qvirtio_pci_foreach(QPCIBus *bus, uint16_t device_type,
                void (*func)(QVirtioDevice *d, void *data), void *data);
QVirtioPCIDevice *qvirtio_pci_device_find(QPCIBus *bus, uint16_t device_type);
QVirtioPCIDevice *qvirtio_pci_device_find_slot(QPCIBus *bus,
                                               uint16_t device_type, int slot);
void qvirtio_pci_device_free(QVirtioPCIDevice *dev);

void qvirtio_pci_device_enable(QVirtioPCIDevice *d);