Skip to content

Commit

Permalink
x86/hwmon: avoid deadlock on CPU removal in pkgtemp
Browse files Browse the repository at this point in the history
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: Jan Beulich <jbeulich@novell.com>
Cc: Fenghua Yu <fenghua.yu@intel.com>
Signed-off-by: Guenter Roeck <guenter.roeck@ericsson.com>
  • Loading branch information
Jan Beulich authored and Guenter Roeck committed Sep 24, 2010
1 parent 89a3fd3 commit d9bca43
Showing 1 changed file with 4 additions and 3 deletions.
7 changes: 4 additions & 3 deletions drivers/hwmon/pkgtemp.c
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand All @@ -358,7 +359,7 @@ static void pkgtemp_device_remove(unsigned int cpu)
break;
}
}
break;
return;
}
mutex_unlock(&pdev_list_mutex);
}
Expand Down

0 comments on commit d9bca43

Please sign in to comment.