diff options
author | Jean Delvare <khali@linux-fr.org> | 2010-07-09 10:22:49 -0400 |
---|---|---|
committer | Jean Delvare <khali@linux-fr.org> | 2010-07-09 10:22:49 -0400 |
commit | d883b9f0977269d519469da72faec6a7f72cb489 (patch) | |
tree | 75f5764d4272e8aef005ecb5e7667773afa1b7e7 /drivers/hwmon/coretemp.c | |
parent | 436cad2a41a40c6c32bd9152b63d17eeb1f7c99b (diff) |
hwmon: (coretemp) Skip duplicate CPU entries
On hyper-threaded CPUs, each core appears twice in the CPU list. Skip
the second entry to avoid duplicate sensors.
Signed-off-by: Jean Delvare <khali@linux-fr.org>
Acked-by: Huaxu Wan <huaxu.wan@intel.com>
Cc: stable@kernel.org
Diffstat (limited to 'drivers/hwmon/coretemp.c')
-rw-r--r-- | drivers/hwmon/coretemp.c | 26 |
1 files changed, 25 insertions, 1 deletions
diff --git a/drivers/hwmon/coretemp.c b/drivers/hwmon/coretemp.c index 2988da150ed6..3b168faee794 100644 --- a/drivers/hwmon/coretemp.c +++ b/drivers/hwmon/coretemp.c | |||
@@ -405,6 +405,10 @@ struct pdev_entry { | |||
405 | struct list_head list; | 405 | struct list_head list; |
406 | struct platform_device *pdev; | 406 | struct platform_device *pdev; |
407 | unsigned int cpu; | 407 | unsigned int cpu; |
408 | #ifdef CONFIG_SMP | ||
409 | u16 phys_proc_id; | ||
410 | u16 cpu_core_id; | ||
411 | #endif | ||
408 | }; | 412 | }; |
409 | 413 | ||
410 | static LIST_HEAD(pdev_list); | 414 | static LIST_HEAD(pdev_list); |
@@ -415,6 +419,22 @@ static int __cpuinit coretemp_device_add(unsigned int cpu) | |||
415 | int err; | 419 | int err; |
416 | struct platform_device *pdev; | 420 | struct platform_device *pdev; |
417 | struct pdev_entry *pdev_entry; | 421 | struct pdev_entry *pdev_entry; |
422 | #ifdef CONFIG_SMP | ||
423 | struct cpuinfo_x86 *c = &cpu_data(cpu); | ||
424 | #endif | ||
425 | |||
426 | mutex_lock(&pdev_list_mutex); | ||
427 | |||
428 | #ifdef CONFIG_SMP | ||
429 | /* Skip second HT entry of each core */ | ||
430 | list_for_each_entry(pdev_entry, &pdev_list, list) { | ||
431 | if (c->phys_proc_id == pdev_entry->phys_proc_id && | ||
432 | c->cpu_core_id == pdev_entry->cpu_core_id) { | ||
433 | err = 0; /* Not an error */ | ||
434 | goto exit; | ||
435 | } | ||
436 | } | ||
437 | #endif | ||
418 | 438 | ||
419 | pdev = platform_device_alloc(DRVNAME, cpu); | 439 | pdev = platform_device_alloc(DRVNAME, cpu); |
420 | if (!pdev) { | 440 | if (!pdev) { |
@@ -438,7 +458,10 @@ static int __cpuinit coretemp_device_add(unsigned int cpu) | |||
438 | 458 | ||
439 | pdev_entry->pdev = pdev; | 459 | pdev_entry->pdev = pdev; |
440 | pdev_entry->cpu = cpu; | 460 | pdev_entry->cpu = cpu; |
441 | mutex_lock(&pdev_list_mutex); | 461 | #ifdef CONFIG_SMP |
462 | pdev_entry->phys_proc_id = c->phys_proc_id; | ||
463 | pdev_entry->cpu_core_id = c->cpu_core_id; | ||
464 | #endif | ||
442 | list_add_tail(&pdev_entry->list, &pdev_list); | 465 | list_add_tail(&pdev_entry->list, &pdev_list); |
443 | mutex_unlock(&pdev_list_mutex); | 466 | mutex_unlock(&pdev_list_mutex); |
444 | 467 | ||
@@ -449,6 +472,7 @@ exit_device_free: | |||
449 | exit_device_put: | 472 | exit_device_put: |
450 | platform_device_put(pdev); | 473 | platform_device_put(pdev); |
451 | exit: | 474 | exit: |
475 | mutex_unlock(&pdev_list_mutex); | ||
452 | return err; | 476 | return err; |
453 | } | 477 | } |
454 | 478 | ||