Message ID | BN3PR03MB22273E86EDBC8875C55E2FB7CE520@BN3PR03MB2227.namprd03.prod.outlook.com (mailing list archive) |
---|---|
State | New, archived |
Delegated to: | Bjorn Helgaas |
Headers | show |
On Fri, Feb 24, 2017 at 09:49:17PM +0000, Long Li wrote:
> A PCI_EJECT message can arrive at the same time we are calling pci_scan_child_bus in the workqueue for the previous PCI_BUS_RELATIONS message or in create_root_hv_pci_bus(), in this case we could potentailly modify the bus from multiple places. Properly lock the bus access.
Properly wrap your changelog comments at 72 columns like your editor is
telling you to do...
Ok, I will resend. > -----Original Message----- > From: Greg KH [mailto:greg@kroah.com] > Sent: Saturday, February 25, 2017 12:02 AM > To: Long Li <longli@microsoft.com> > Cc: KY Srinivasan <kys@microsoft.com>; Haiyang Zhang > <haiyangz@microsoft.com>; Bjorn Helgaas <bhelgaas@google.com>; > devel@linuxdriverproject.org; linux-kernel@vger.kernel.org; linux- > pci@vger.kernel.org > Subject: Re: [Resend PATCH 2/2 v3] pci-hyperv: lock pci bus on device eject > > On Fri, Feb 24, 2017 at 09:49:17PM +0000, Long Li wrote: > > A PCI_EJECT message can arrive at the same time we are calling > pci_scan_child_bus in the workqueue for the previous PCI_BUS_RELATIONS > message or in create_root_hv_pci_bus(), in this case we could potentailly > modify the bus from multiple places. Properly lock the bus access. > > Properly wrap your changelog comments at 72 columns like your editor is > telling you to do...
diff --git a/drivers/pci/host/pci-hyperv.c b/drivers/pci/host/pci-hyperv.c index 4a37598..33c75c9 100644 --- a/drivers/pci/host/pci-hyperv.c +++ b/drivers/pci/host/pci-hyperv.c @@ -1198,9 +1198,11 @@ static int create_root_hv_pci_bus(struct hv_pcibus_device *hbus) hbus->pci_bus->msi = &hbus->msi_chip; hbus->pci_bus->msi->dev = &hbus->hdev->device; + pci_lock_rescan_remove(); pci_scan_child_bus(hbus->pci_bus); pci_bus_assign_resources(hbus->pci_bus); pci_bus_add_devices(hbus->pci_bus); + pci_unlock_rescan_remove(); hbus->state = hv_pcibus_installed; return 0; } @@ -1590,8 +1592,10 @@ static void hv_eject_device_work(struct work_struct *work) pdev = pci_get_domain_bus_and_slot(hpdev->hbus->sysdata.domain, 0, wslot); if (pdev) { + pci_lock_rescan_remove(); pci_stop_and_remove_bus_device(pdev); pci_dev_put(pdev); + pci_unlock_rescan_remove(); } memset(&ctxt, 0, sizeof(ctxt));