lkml.org 
[lkml]   [2014]   [Feb]   [3]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 2/24][Resend] ACPI / hotplug / PCI: Move PCI rescan-remove locking to hotplug_event()
    Date
    From: Rafael J. Wysocki <rafael.j.wysocki@intel.com>

    Commit 9217a984671e (ACPI / hotplug / PCI: Use global PCI rescan-remove
    locking) modified ACPIPHP to protect its PCI device removal and addition
    code paths from races against sysfs-driven rescan and remove operations
    with the help of PCI rescan-remove locking. However, it overlooked the
    fact that hotplug_event_work() is not the only caller of hotplug_event()
    which may also be called by dock_hotplug_event() and that code path
    is missing the PCI rescan-remove locking. This means that, although
    the PCI rescan-remove lock is held as appropriate during the handling
    of events originating from handle_hotplug_event(), the ACPIPHP's
    operations resulting from dock events may still suffer the race
    conditions that commit 9217a984671e was supposed to eliminate.

    To address that problem, move the PCI rescan-remove locking from
    hotplug_event_work() to hotplug_event() so that it is used regardless
    of the way that function is invoked.

    Revamps: 9217a984671e (ACPI / hotplug / PCI: Use global PCI rescan-remove locking)
    Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
    Tested-by: Mika Westerberg <mika.westerberg@linux.intel.com>
    ---
    drivers/pci/hotplug/acpiphp_glue.c | 4 ++--
    1 file changed, 2 insertions(+), 2 deletions(-)

    Index: linux-pm/drivers/pci/hotplug/acpiphp_glue.c
    ===================================================================
    --- linux-pm.orig/drivers/pci/hotplug/acpiphp_glue.c
    +++ linux-pm/drivers/pci/hotplug/acpiphp_glue.c
    @@ -852,6 +852,7 @@ static void hotplug_event(acpi_handle ha

    mutex_unlock(&acpiphp_context_lock);

    + pci_lock_rescan_remove();
    acpi_get_name(handle, ACPI_FULL_PATHNAME, &buffer);

    switch (type) {
    @@ -905,6 +906,7 @@ static void hotplug_event(acpi_handle ha
    break;
    }

    + pci_unlock_rescan_remove();
    if (bridge)
    put_bridge(bridge);
    }
    @@ -915,11 +917,9 @@ static void hotplug_event_work(void *dat
    acpi_handle handle = context->handle;

    acpi_scan_lock_acquire();
    - pci_lock_rescan_remove();

    hotplug_event(handle, type, context);

    - pci_unlock_rescan_remove();
    acpi_scan_lock_release();
    acpi_evaluate_hotplug_ost(handle, type, ACPI_OST_SC_SUCCESS, NULL);
    put_bridge(context->func.parent);


    \
     
     \ /
      Last update: 2014-02-04 01:01    [W:4.327 / U:0.144 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site