Commit ac8b65bd authored by Konrad Sztyber's avatar Konrad Sztyber Committed by Tomasz Zawadzki
Browse files

vmd: extract freeing device resources to vmd_dev_free



This allows to free resources tied to a vmd_pci_device that isn't on the
dev_list or wasn't hooked to the PCI driver.  Also, use that function
whenever a vmd_pci_device is freed instead of regular free().

Signed-off-by: default avatarKonrad Sztyber <konrad.sztyber@intel.com>
Change-Id: Ifca177a7eb6d8180d6f2ee2a9d9e36d58810e8ad
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/14259


Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
Reviewed-by: default avatarTom Nabarro <tom.nabarro@intel.com>
Reviewed-by: default avatarBen Walker <benjamin.walker@intel.com>
parent 3f4e968d
Loading
Loading
Loading
Loading
+20 −13
Original line number Diff line number Diff line
@@ -840,21 +840,16 @@ vmd_dev_cfg_write(struct spdk_pci_device *_dev, void *value,
}

static void
vmd_dev_detach(struct spdk_pci_device *dev)
vmd_dev_free(struct vmd_pci_device *dev)
{
	struct vmd_pci_device *vmd_device = (struct vmd_pci_device *)dev;
	struct vmd_pci_device *bus_device = vmd_device->bus->self;
	struct vmd_pci_bus *bus = vmd_device->bus;
	size_t i, num_bars = vmd_device->header_type ? 2 : 6;

	spdk_pci_unhook_device(dev);
	TAILQ_REMOVE(&bus->dev_list, vmd_device, tailq);
	struct vmd_pci_device *bus_device = dev->bus->self;
	size_t i, num_bars = dev->header_type ? 2 : 6;

	/* Release the hotplug region if the device is under hotplug-capable bus */
	if (bus_device && bus_device->hotplug_capable) {
		for (i = 0; i < num_bars; ++i) {
			if (vmd_device->bar[i].start != 0) {
				vmd_hotplug_free_addr(&bus_device->hp, vmd_device->bar[i].start);
			if (dev->bar[i].start != 0) {
				vmd_hotplug_free_addr(&bus_device->hp, dev->bar[i].start);
			}
		}
	}
@@ -862,6 +857,18 @@ vmd_dev_detach(struct spdk_pci_device *dev)
	free(dev);
}

static void
vmd_dev_detach(struct spdk_pci_device *dev)
{
	struct vmd_pci_device *vmd_device = (struct vmd_pci_device *)dev;
	struct vmd_pci_bus *bus = vmd_device->bus;

	spdk_pci_unhook_device(dev);
	TAILQ_REMOVE(&bus->dev_list, vmd_device, tailq);

	vmd_dev_free(vmd_device);
}

static void
vmd_dev_init(struct vmd_pci_device *dev)
{
@@ -962,12 +969,12 @@ vmd_scan_single_bus(struct vmd_pci_bus *bus, struct vmd_pci_device *parent_bridg

			new_bus_num = vmd_get_next_bus_number(bus->vmd->is_hotplug_scan ? new_dev : NULL, bus->vmd);
			if (new_bus_num == 0xff) {
				free(new_dev);
				vmd_dev_free(new_dev);
				return dev_cnt;
			}
			new_bus = vmd_create_new_bus(bus, new_dev, new_bus_num);
			if (!new_bus) {
				free(new_dev);
				vmd_dev_free(new_dev);
				return dev_cnt;
			}
			new_bus->primary_bus = bus->secondary_bus;
@@ -1010,7 +1017,7 @@ vmd_scan_single_bus(struct vmd_pci_bus *bus, struct vmd_pci_device *parent_bridg
		} else {
			rc = vmd_init_end_device(new_dev);
			if (rc != 0) {
				free(new_dev);
				vmd_dev_free(new_dev);
				if (dev_cnt) {
					dev_cnt--;
				}