Re: [PATCH] Thermal: Fix bug on generic thermal framework.

From: jonghwa3 . lee
Date: Mon Sep 24 2012 - 21:13:23 EST


On 2012ë 09ì 24ì 17:57, Zhang Rui wrote:
> On ä, 2012-09-24 at 02:08 -0600, R, Durgadoss wrote:
>> Hi,
>>
>> Patch is fine, but I think you have to re-base on top of
>> Rui's -next branch here:
>> git://git.kernel.org/pub/scm/linux/kernel/git/rzhang/linux.git
>>
>> Also, adding Rui to this mail, not sure whether he is in LKML/pm.
>>
>> Thanks,
>> Durga
>>
>>> -----Original Message-----
>>> From: Jonghwa Lee [mailto:jonghwa3.lee@xxxxxxxxxxx]
>>> Sent: Monday, September 24, 2012 7:36 AM
>>> To: linux-pml@xxxxxxxxxxxxxxx
>>> Cc: linux-kernel@xxxxxxxxxxxxxxx; Brown, Len; Rafael J. Wysocki; Andrew
>>> Morton; Amit Kachhap; R, Durgadoss; Jonghwa Lee
>>> Subject: [PATCH] Thermal: Fix bug on generic thermal framework.
>>>
>>> When system fails to bind cooling devices to thermal zone device during
>>> registering thermal zone device, it leaves registering without canceling
>>> delayed work. It probably makes panic if polling rate is not enough to release
>>> that work from workqueue. So it is better to ignore initialization of polling
>>> work to prevent that unexpected state.
>>>
> Hi, Jonghwa,
>
> I still do not understand what the problem is.
> Say if a cooling device fails to bind, the thermal zone device would
> still work properly, just like the failure cooling device is not
> referenced in this thermal zone.
>
> thanks,
> rui
Hi rui,
No, it doesn't work properly. If it fails to bind some cool dev to
thermal zone device, it frees thermal zone
device without canceling delayed work. After freeing thermal zone
device, system may call work function
pointed NULL as the timer expired. Thus it requires skipping the
initialization of polling work or canceling before
the unregister.

Thanks,
Jonghwa

>>> Signed-off-by: Jonghwa Lee <jonghwa3.lee@xxxxxxxxxxx>
>>> ---
>>> drivers/thermal/thermal_sys.c | 6 ++++--
>>> 1 files changed, 4 insertions(+), 2 deletions(-)
>>>
>>> diff --git a/drivers/thermal/thermal_sys.c b/drivers/thermal/thermal_sys.c
>>> index 2ab31e4..744e69d 100644
>>> --- a/drivers/thermal/thermal_sys.c
>>> +++ b/drivers/thermal/thermal_sys.c
>>> @@ -1351,12 +1351,14 @@ struct thermal_zone_device
>>> *thermal_zone_device_register(const char *type,
>>> }
>>> mutex_unlock(&thermal_list_lock);
>>>
>>> + if (result)
>>> + goto unregister;
>>> +
>>> INIT_DELAYED_WORK(&(tz->poll_queue),
>>> thermal_zone_device_check);
>>>
>>> thermal_zone_device_update(tz);
>>>
>>> - if (!result)
>>> - return tz;
>>> + return tz;
>>>
>>> unregister:
>>> release_idr(&thermal_tz_idr, &thermal_idr_lock, tz->id);
>>> --
>>> 1.7.4.1
>
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to majordomo@xxxxxxxxxxxxxxx
> More majordomo info at http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at http://www.tux.org/lkml/
>

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/