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: Konrad Sztyber <konrad.sztyber@intel.com>
Change-Id: Ifca177a7eb6d8180d6f2ee2a9d9e36d58810e8ad
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/14259
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Tom Nabarro <tom.nabarro@intel.com>
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
This commit is contained in:
Konrad Sztyber 2022-08-29 07:45:04 +02:00 committed by Tomasz Zawadzki
parent 3f4e968dab
commit ac8b65bdd2

View File

@ -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--;
}