Unverified Commit f35011dd authored by openeuler-ci-bot's avatar openeuler-ci-bot Committed by Gitee
Browse files

!11118 PCI/DPC: Fix use-after-free on concurrent DPC and hot-removal

parents 68d632d1 b9c52094
Loading
Loading
Loading
Loading
+12 −7
Original line number Diff line number Diff line
@@ -4830,7 +4830,7 @@ int pci_bridge_wait_for_secondary_bus(struct pci_dev *dev, char *reset_type,
				      int timeout)
{
	struct pci_dev *child;
	int delay;
	int delay, ret = 0;

	if (pci_dev_is_disconnected(dev))
		return 0;
@@ -4858,8 +4858,8 @@ int pci_bridge_wait_for_secondary_bus(struct pci_dev *dev, char *reset_type,
		return 0;
	}

	child = list_first_entry(&dev->subordinate->devices, struct pci_dev,
				 bus_list);
	child = pci_dev_get(list_first_entry(&dev->subordinate->devices,
					     struct pci_dev, bus_list));
	up_read(&pci_bus_sem);

	/*
@@ -4869,7 +4869,7 @@ int pci_bridge_wait_for_secondary_bus(struct pci_dev *dev, char *reset_type,
	if (!pci_is_pcie(dev)) {
		pci_dbg(dev, "waiting %d ms for secondary bus\n", 1000 + delay);
		msleep(1000 + delay);
		return 0;
		goto put_child;
	}

	/*
@@ -4890,7 +4890,7 @@ int pci_bridge_wait_for_secondary_bus(struct pci_dev *dev, char *reset_type,
	 * until the timeout expires.
	 */
	if (!pcie_downstream_port(dev))
		return 0;
		goto put_child;

	if (pcie_get_speed_cap(dev) <= PCIE_SPEED_5_0GT) {
		pci_dbg(dev, "waiting %d ms for downstream link\n", delay);
@@ -4901,11 +4901,16 @@ int pci_bridge_wait_for_secondary_bus(struct pci_dev *dev, char *reset_type,
		if (!pcie_wait_for_link_delay(dev, true, delay)) {
			/* Did not train, no need to wait any further */
			pci_info(dev, "Data Link Layer Link Active not set in 1000 msec\n");
			return -ENOTTY;
			ret = -ENOTTY;
			goto put_child;
		}
	}

	return pci_dev_wait(child, reset_type, timeout - delay);
	ret = pci_dev_wait(child, reset_type, timeout - delay);

put_child:
	pci_dev_put(child);
	return ret;
}

void pci_reset_secondary_bus(struct pci_dev *dev)