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 <konrad.sztyber@intel.com>
Change-Id: Ic757070188157d9851f648acd074ca4943a14c39
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/13955
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Tomasz Zawadzki <tomasz.zawadzki@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Tom Nabarro <tom.nabarro@intel.com>
This commit is contained in:
Konrad Sztyber 2022-08-09 04:46:03 +02:00 committed by Tomasz Zawadzki
parent ee1ab6f6be
commit 4c482a623b
2 changed files with 13 additions and 46 deletions

View File

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

View File

@ -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 */