lkml.org 
[lkml]   [2018]   [Mar]   [3]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL for 4.9 063/219] PCI: hv: Lock PCI bus on device eject
    Date
    From: Long Li <longli@microsoft.com>

    [ Upstream commit 414428c5da1c71986727c2fa5cdf1ed071e398d7 ]

    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 potentially
    modify the bus from multiple places.

    Properly lock the bus access.

    Thanks Dexuan Cui <decui@microsoft.com> for pointing out the race condition
    in create_root_hv_pci_bus().

    Reported-by: Xiaofeng Wang <xiaofwan@redhat.com>
    Signed-off-by: Long Li <longli@microsoft.com>
    Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
    Acked-by: K. Y. Srinivasan <kys@microsoft.com>
    Signed-off-by: Sasha Levin <alexander.levin@microsoft.com>
    ---
    drivers/pci/host/pci-hyperv.c | 4 ++++
    1 file changed, 4 insertions(+)

    diff --git a/drivers/pci/host/pci-hyperv.c b/drivers/pci/host/pci-hyperv.c
    index 43aa630f419a..d392a55ec0a9 100644
    --- a/drivers/pci/host/pci-hyperv.c
    +++ b/drivers/pci/host/pci-hyperv.c
    @@ -1206,9 +1206,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;
    }
    @@ -1597,8 +1599,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));
    --
    2.14.1
    \
     
     \ /
      Last update: 2018-03-04 00:56    [W:5.095 / U:0.880 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site