Commit 339b84dc authored by Benjamin Berg's avatar Benjamin Berg Committed by Richard Weinberger
Browse files

um: virt-pci: properly remove PCI device from bus



Triggering a bus rescan will not cause the PCI device to be removed. It
is required to explicitly stop and remove the device from the bus.

Fixes: 68f5d3f3 ("um: add PCI over virtio emulation driver")
Signed-off-by: default avatarBenjamin Berg <benjamin.berg@intel.com>
Signed-off-by: default avatarRichard Weinberger <richard@nod.at>
parent abdeb4fa
Loading
Loading
Loading
Loading
+16 −5
Original line number Diff line number Diff line
@@ -711,22 +711,33 @@ static void um_pci_virtio_remove(struct virtio_device *vdev)
		return;
	}

        /* Stop all virtqueues */
        virtio_reset_device(vdev);
        vdev->config->del_vqs(vdev);

	device_set_wakeup_enable(&vdev->dev, false);

	mutex_lock(&um_pci_mtx);
	for (i = 0; i < MAX_DEVICES; i++) {
		if (um_pci_devices[i].dev != dev)
			continue;

		um_pci_devices[i].dev = NULL;
		irq_free_desc(dev->irq);

		break;
	}
	mutex_unlock(&um_pci_mtx);

	um_pci_rescan();
	if (i < MAX_DEVICES) {
		struct pci_dev *pci_dev;

		pci_dev = pci_get_slot(bridge->bus, i);
		if (pci_dev)
			pci_stop_and_remove_bus_device_locked(pci_dev);
	}

	/* Stop all virtqueues */
	virtio_reset_device(vdev);
	dev->cmd_vq = NULL;
	dev->irq_vq = NULL;
	vdev->config->del_vqs(vdev);

	kfree(dev);
}