| From d883b9f0977269d519469da72faec6a7f72cb489 Mon Sep 17 00:00:00 2001 |
| From: Jean Delvare <khali@linux-fr.org> |
| Date: Fri, 9 Jul 2010 16:22:49 +0200 |
| Subject: hwmon: (coretemp) Skip duplicate CPU entries |
| |
| From: Jean Delvare <khali@linux-fr.org> |
| |
| commit d883b9f0977269d519469da72faec6a7f72cb489 upstream. |
| |
| 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> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| drivers/hwmon/coretemp.c | 26 +++++++++++++++++++++++++- |
| 1 file changed, 25 insertions(+), 1 deletion(-) |
| |
| --- a/drivers/hwmon/coretemp.c |
| +++ b/drivers/hwmon/coretemp.c |
| @@ -356,6 +356,10 @@ struct pdev_entry { |
| struct list_head list; |
| struct platform_device *pdev; |
| unsigned int cpu; |
| +#ifdef CONFIG_SMP |
| + u16 phys_proc_id; |
| + u16 cpu_core_id; |
| +#endif |
| }; |
| |
| static LIST_HEAD(pdev_list); |
| @@ -366,6 +370,22 @@ static int __cpuinit coretemp_device_add |
| int err; |
| struct platform_device *pdev; |
| struct pdev_entry *pdev_entry; |
| +#ifdef CONFIG_SMP |
| + struct cpuinfo_x86 *c = &cpu_data(cpu); |
| +#endif |
| + |
| + mutex_lock(&pdev_list_mutex); |
| + |
| +#ifdef CONFIG_SMP |
| + /* Skip second HT entry of each core */ |
| + list_for_each_entry(pdev_entry, &pdev_list, list) { |
| + if (c->phys_proc_id == pdev_entry->phys_proc_id && |
| + c->cpu_core_id == pdev_entry->cpu_core_id) { |
| + err = 0; /* Not an error */ |
| + goto exit; |
| + } |
| + } |
| +#endif |
| |
| pdev = platform_device_alloc(DRVNAME, cpu); |
| if (!pdev) { |
| @@ -389,7 +409,10 @@ static int __cpuinit coretemp_device_add |
| |
| pdev_entry->pdev = pdev; |
| pdev_entry->cpu = cpu; |
| - mutex_lock(&pdev_list_mutex); |
| +#ifdef CONFIG_SMP |
| + pdev_entry->phys_proc_id = c->phys_proc_id; |
| + pdev_entry->cpu_core_id = c->cpu_core_id; |
| +#endif |
| list_add_tail(&pdev_entry->list, &pdev_list); |
| mutex_unlock(&pdev_list_mutex); |
| |
| @@ -400,6 +423,7 @@ exit_device_free: |
| exit_device_put: |
| platform_device_put(pdev); |
| exit: |
| + mutex_unlock(&pdev_list_mutex); |
| return err; |
| } |
| |