Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d9bca435 authored by Jan Beulich's avatar Jan Beulich Committed by Guenter Roeck
Browse files

x86/hwmon: avoid deadlock on CPU removal in pkgtemp



pkgtemp_device_remove(), holding the list protecting mutex, calls
pkgtemp_device_add(), which itself wants to acquire the same mutex.
Holding the mutex over the entire loop body in pkgtemp_device_remove()
isn't really necessary, as long as the loop gets exited after
processing the matched CPU.

Once exiting the loop after removing an eventual match, there's no
need for using the "safe" list iterator anymore.

Signed-off-by: default avatarJan Beulich <jbeulich@novell.com>
Cc: Fenghua Yu <fenghua.yu@intel.com>
Signed-off-by: default avatarGuenter Roeck <guenter.roeck@ericsson.com>
parent 89a3fd35
Loading
Loading
Loading
Loading
+4 −3
Original line number Diff line number Diff line
@@ -339,17 +339,18 @@ static int __cpuinit pkgtemp_device_add(unsigned int cpu)
#ifdef CONFIG_HOTPLUG_CPU
static void pkgtemp_device_remove(unsigned int cpu)
{
	struct pdev_entry *p, *n;
	struct pdev_entry *p;
	unsigned int i;
	int err;

	mutex_lock(&pdev_list_mutex);
	list_for_each_entry_safe(p, n, &pdev_list, list) {
	list_for_each_entry(p, &pdev_list, list) {
		if (p->cpu != cpu)
			continue;

		platform_device_unregister(p->pdev);
		list_del(&p->list);
		mutex_unlock(&pdev_list_mutex);
		kfree(p);
		for_each_cpu(i, cpu_core_mask(cpu)) {
			if (i != cpu) {
@@ -358,7 +359,7 @@ static void pkgtemp_device_remove(unsigned int cpu)
					break;
			}
		}
		break;
		return;
	}
	mutex_unlock(&pdev_list_mutex);
}