Commit f41b3261 authored by Rafael J. Wysocki's avatar Rafael J. Wysocki

ACPI / hotplug / PCI: Move PCI rescan-remove locking to hotplug_event()

Commit 9217a984 (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 9217a984 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: 9217a984 (ACPI / hotplug / PCI: Use global PCI rescan-remove locking)
Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
Tested-by: default avatarMika Westerberg <mika.westerberg@linux.intel.com>
parent 2d7c1b77
...@@ -852,6 +852,7 @@ static void hotplug_event(acpi_handle handle, u32 type, void *data) ...@@ -852,6 +852,7 @@ static void hotplug_event(acpi_handle handle, u32 type, void *data)
mutex_unlock(&acpiphp_context_lock); mutex_unlock(&acpiphp_context_lock);
pci_lock_rescan_remove();
acpi_get_name(handle, ACPI_FULL_PATHNAME, &buffer); acpi_get_name(handle, ACPI_FULL_PATHNAME, &buffer);
switch (type) { switch (type) {
...@@ -905,6 +906,7 @@ static void hotplug_event(acpi_handle handle, u32 type, void *data) ...@@ -905,6 +906,7 @@ static void hotplug_event(acpi_handle handle, u32 type, void *data)
break; break;
} }
pci_unlock_rescan_remove();
if (bridge) if (bridge)
put_bridge(bridge); put_bridge(bridge);
} }
...@@ -915,11 +917,9 @@ static void hotplug_event_work(void *data, u32 type) ...@@ -915,11 +917,9 @@ static void hotplug_event_work(void *data, u32 type)
acpi_handle handle = context->handle; acpi_handle handle = context->handle;
acpi_scan_lock_acquire(); acpi_scan_lock_acquire();
pci_lock_rescan_remove();
hotplug_event(handle, type, context); hotplug_event(handle, type, context);
pci_unlock_rescan_remove();
acpi_scan_lock_release(); acpi_scan_lock_release();
acpi_evaluate_hotplug_ost(handle, type, ACPI_OST_SC_SUCCESS, NULL); acpi_evaluate_hotplug_ost(handle, type, ACPI_OST_SC_SUCCESS, NULL);
put_bridge(context->func.parent); put_bridge(context->func.parent);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment