lkml.org 
[lkml]   [2010]   [Aug]   [18]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH] drivers/hwmon/coretemp: Fix incorrect hot-removed CPU's core sensor issue
    Date
    From: Fenghua Yu <fenghua.yu@intel.com>

    In current coretemp driver, when a CPU in dev_list is hot-removed, although its
    HT sibling is still running, its core sensor is gone and not available to user
    level application any more.

    When a CPU is hot-removed, its core sensor should be still available to upper
    level application as long as the hot-removed CPU's HT sibling is still running.
    A core sensor is invisible to user level only when all of siblings in a core are
    hot-removed.

    This patch fixes this issue.

    Signed-off-by: Fenghua Yu <fenghua.yu@intel.com>
    ---
    drivers/hwmon/coretemp.c | 25 ++++++++++++++++++++++---
    1 files changed, 22 insertions(+), 3 deletions(-)

    diff --git a/drivers/hwmon/coretemp.c b/drivers/hwmon/coretemp.c
    index c070c97..2257cc4 100644
    --- a/drivers/hwmon/coretemp.c
    +++ b/drivers/hwmon/coretemp.c
    @@ -418,7 +418,7 @@ struct pdev_entry {
    static LIST_HEAD(pdev_list);
    static DEFINE_MUTEX(pdev_list_mutex);

    -static int __cpuinit coretemp_device_add(unsigned int cpu)
    +static int coretemp_device_add(unsigned int cpu)
    {
    int err;
    struct platform_device *pdev;
    @@ -483,15 +483,34 @@ exit:
    static void coretemp_device_remove(unsigned int cpu)
    {
    struct pdev_entry *p, *n;
    - mutex_lock(&pdev_list_mutex);
    +#ifdef CONFIG_SMP
    + int s;
    +#endif
    +
    list_for_each_entry_safe(p, n, &pdev_list, list) {
    if (p->cpu == cpu) {
    + mutex_lock(&pdev_list_mutex);
    platform_device_unregister(p->pdev);
    list_del(&p->list);
    kfree(p);
    + mutex_unlock(&pdev_list_mutex);
    +
    +#ifdef CONFIG_SMP
    + /*
    + * Add removed CPU's HT sibling to dev_list.
    + * If there is no sibling available, the core sensor
    + * is invisiable to user space any more.
    + */
    + for_each_cpu(s, cpu_sibling_mask(cpu)) {
    + if (s != cpu) {
    + coretemp_device_add(s);
    + break;
    + }
    + }
    +#endif
    + return;
    }
    }
    - mutex_unlock(&pdev_list_mutex);
    }

    static int __cpuinit coretemp_cpu_callback(struct notifier_block *nfb,
    --
    1.6.0.3


    \
     
     \ /
      Last update: 2010-08-19 01:05    [W:0.022 / U:122.228 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site