From 4c482a623b9219d8ec918f7fcfb6013a95dcb732 Mon Sep 17 00:00:00 2001 From: Konrad Sztyber Date: Tue, 9 Aug 2022 04:46:03 +0200 Subject: [PATCH] vmd: don't create new buses in hotplug This doesn't work anyway and can cause creating duplicate bus objects if vmd_scan_single_bus() is called on a parent bus with previously allocated child buses. Also, while here, removed a few unused functions and flags in struct vmd_adapter. Signed-off-by: Konrad Sztyber Change-Id: Ic757070188157d9851f648acd074ca4943a14c39 Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/13955 Tested-by: SPDK CI Jenkins Reviewed-by: Tomasz Zawadzki Reviewed-by: Jim Harris Reviewed-by: Tom Nabarro --- lib/vmd/vmd.c | 33 ++++++++++++--------------------- lib/vmd/vmd_internal.h | 26 +------------------------- 2 files changed, 13 insertions(+), 46 deletions(-) diff --git a/lib/vmd/vmd.c b/lib/vmd/vmd.c index bb1b4a189..2b6bc4650 100644 --- a/lib/vmd/vmd.c +++ b/lib/vmd/vmd.c @@ -663,30 +663,16 @@ vmd_create_new_bus(struct vmd_pci_bus *parent, struct vmd_pci_device *bridge, ui return new_bus; } -/* - * Assigns a bus number from the list of available - * bus numbers. If the device is downstream of a hot plug port, - * assign the bus number from those assigned to the HP port. Otherwise, - * assign the next bus number from the vmd bus number list. - */ static uint8_t -vmd_get_next_bus_number(struct vmd_pci_device *dev, struct vmd_adapter *vmd) +vmd_get_next_bus_number(struct vmd_adapter *vmd) { uint8_t bus = 0xff; - struct vmd_pci_bus *hp_bus; - if (dev) { - hp_bus = vmd_is_dev_in_hotplug_path(dev); - if (hp_bus && hp_bus->self && hp_bus->self->hotplug_capable) { - return vmd_hp_get_next_bus_number(&hp_bus->self->hp); - } - } - - /* Device is not under a hot plug path. Return next global bus number */ if ((vmd->next_bus_number + 1) < vmd->max_pci_bus) { bus = vmd->next_bus_number; vmd->next_bus_number++; } + return bus; } @@ -951,7 +937,7 @@ vmd_init_end_device(struct vmd_pci_device *dev) * Return count of how many devices found(type1 + type 0 header devices) */ static uint8_t -vmd_scan_single_bus(struct vmd_pci_bus *bus, struct vmd_pci_device *parent_bridge) +vmd_scan_single_bus(struct vmd_pci_bus *bus, struct vmd_pci_device *parent_bridge, bool hotplug) { /* assuming only single function devices are on the bus */ struct vmd_pci_device *new_dev; @@ -968,12 +954,17 @@ vmd_scan_single_bus(struct vmd_pci_bus *bus, struct vmd_pci_device *parent_bridg } if (new_dev->header->common.header_type & PCI_HEADER_TYPE_BRIDGE) { + if (hotplug) { + free(new_dev); + continue; + } + slot_cap.as_uint32_t = 0; if (new_dev->pcie_cap != NULL) { slot_cap.as_uint32_t = new_dev->pcie_cap->slot_cap.as_uint32_t; } - new_bus_num = vmd_get_next_bus_number(bus->vmd->is_hotplug_scan ? new_dev : NULL, bus->vmd); + new_bus_num = vmd_get_next_bus_number(bus->vmd); if (new_bus_num == 0xff) { vmd_dev_free(new_dev); return dev_cnt; @@ -1015,7 +1006,7 @@ vmd_scan_single_bus(struct vmd_pci_bus *bus, struct vmd_pci_device *parent_bridg vmd_init_hotplug(new_dev, new_bus); } - dev_cnt += vmd_scan_single_bus(new_bus, new_dev); + dev_cnt += vmd_scan_single_bus(new_bus, new_dev, hotplug); if (new_dev->pcie_cap != NULL) { if (new_dev->pcie_cap->express_cap_register.bit_field.device_type == SwitchUpstreamPort) { return dev_cnt; @@ -1142,7 +1133,7 @@ vmd_scan_pcibus(struct vmd_pci_bus *bus) g_end_device_count = 0; TAILQ_INSERT_TAIL(&bus->vmd->bus_list, bus, tailq); bus->vmd->next_bus_number = bus->bus_number + 1; - dev_cnt = vmd_scan_single_bus(bus, NULL); + dev_cnt = vmd_scan_single_bus(bus, NULL, false); SPDK_INFOLOG(vmd, "VMD scan found %u devices\n", dev_cnt); SPDK_INFOLOG(vmd, "VMD scan found %u END DEVICES\n", g_end_device_count); @@ -1355,7 +1346,7 @@ vmd_bus_handle_hotplug(struct vmd_pci_bus *bus) for (sleep_count = 0; sleep_count < 20; ++sleep_count) { /* Scan until a new device is found */ - num_devices = vmd_scan_single_bus(bus, bus->self); + num_devices = vmd_scan_single_bus(bus, bus->self, true); if (num_devices > 0) { break; } diff --git a/lib/vmd/vmd_internal.h b/lib/vmd/vmd_internal.h index 83bfb52fb..e932d10a3 100644 --- a/lib/vmd/vmd_internal.h +++ b/lib/vmd/vmd_internal.h @@ -129,13 +129,9 @@ struct vmd_adapter { uint32_t next_bus_number : 10; uint32_t max_pci_bus : 10; - uint32_t is_hotplug_scan : 1; - uint32_t is_ready : 1; - uint32_t processing_hp : 1; - uint32_t max_payload_size: 3; uint32_t root_port_updated : 1; uint32_t scan_completed : 1; - uint32_t rsv : 4; + uint32_t rsv : 10; /* end devices attached to vmd adapters */ struct vmd_pci_device *target[MAX_VMD_TARGET]; @@ -150,26 +146,6 @@ struct vmd_adapter { struct event_fifo *hp_queue; }; -/* TODO: Temporary stubs for Hot Plug interface */ -static inline struct vmd_pci_bus * -vmd_is_dev_in_hotplug_path(struct vmd_pci_device *dev) -{ - return NULL; -} - -static inline void -vmd_hp_enable_hotplug(struct vmd_hot_plug *hp) -{ - -} - -static inline uint8_t -vmd_hp_get_next_bus_number(struct vmd_hot_plug *hp) -{ - assert(false); - return 0; -} - struct vmd_pci_device *vmd_find_device(const struct spdk_pci_addr *addr); #endif /* VMD_H */