Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1409893 > unrolled thread
| Started by | Eduardo Valentin <edubezval@gmail.com> |
|---|---|
| First post | 2016-05-31 08:40 +0200 |
| Last post | 2016-06-01 06:00 +0200 |
| Articles | 5 — 2 participants |
Back to article view | Back to linux.kernel
[PATCH 00/15] thermal: sysfs: add locking Eduardo Valentin <edubezval@gmail.com> - 2016-05-31 08:40 +0200
[PATCH 02/15] thermal: sysfs: lock tz while on access to mode properties Eduardo Valentin <edubezval@gmail.com> - 2016-05-31 08:40 +0200
Re: [PATCH 02/15] thermal: sysfs: lock tz while on access to mode properties Keerthy <a0393675@ti.com> - 2016-06-07 11:10 +0200
Re: [PATCH 02/15] thermal: sysfs: lock tz while on access to mode properties Keerthy <a0393675@ti.com> - 2016-06-07 11:30 +0200
Re: [PATCH 00/15] thermal: sysfs: add locking Keerthy <a0393675@ti.com> - 2016-06-01 06:00 +0200
| From | Eduardo Valentin <edubezval@gmail.com> |
|---|---|
| Date | 2016-05-31 08:40 +0200 |
| Subject | [PATCH 00/15] thermal: sysfs: add locking |
| Message-ID | <rELvj-7hB-13@gated-at.bofh.it> |
Hello, Several thermal sysfs entries are currently being called from userspace without locking. Data and calls to ops are accessed deliberated without any care for locking. This patch series attempts to fix this. Now that sysfs handlers are on the same place it is easier to visualize this issue and fix it. The strategy is essentially to lock any access. Also, functions in thermal core and thermal helpers are assumed to do the proper locking already. This patch series is based on the thermal core reorganization. There is no change in the ABI to userspace. The difference is that now serialization to data will be done. For your consideration, I am also adding this to this branch: git://git.kernel.org/pub/scm/linux/kernel/git/evalenti/linux-soc-thermal sysfs_locking Comments are welcome. BR, Eduardo Valentin (15): thermal: sysfs: lock tz in type_show thermal: sysfs: lock tz while on access to mode properties thermal: sysfs: lock tz while on trip_point_type properties thermal: sysfs: lock tz while on trip_point_temp properties thermal: sysfs: lock tz while on trip_point_hyst properties thermal: sysfs: lock tz while on passive properties thermal: sysfs: lock tz while on policy properties thermal: sysfs: improve locking of emul_temp_store() thermal: sysfs: lock tz when access sustainable power properties thermal: sysfs: lock tz when access tzp properties thermal: sysfs: lock cdev while accessing type thermal: sysfs: lock cdev while accessing max_state thermal: sysfs: lock cdev while accessing cur_state thermal: sysfs: serialize access to instances thermal: sysfs: add comments describing locking strategy drivers/thermal/thermal_sysfs.c | 133 ++++++++++++++++++++++++++++++++++------ include/linux/thermal.h | 2 +- 2 files changed, 115 insertions(+), 20 deletions(-) -- 2.1.4
[toc] | [next] | [standalone]
| From | Eduardo Valentin <edubezval@gmail.com> |
|---|---|
| Date | 2016-05-31 08:40 +0200 |
| Subject | [PATCH 02/15] thermal: sysfs: lock tz while on access to mode properties |
| Message-ID | <rELvl-7hB-67@gated-at.bofh.it> |
| In reply to | #1409893 |
Serialized calls to tz.ops in user facing
sysfs handler mode_show() and mode_store().
Cc: Zhang Rui <rui.zhang@intel.com>
Cc: linux-pm@vger.kernel.org
Cc: linux-kernel@vger.kernel.org
Signed-off-by: Eduardo Valentin <edubezval@gmail.com>
---
drivers/thermal/thermal_sysfs.c | 13 ++++++++++---
1 file changed, 10 insertions(+), 3 deletions(-)
diff --git a/drivers/thermal/thermal_sysfs.c b/drivers/thermal/thermal_sysfs.c
index ee983ca..1db2406 100644
--- a/drivers/thermal/thermal_sysfs.c
+++ b/drivers/thermal/thermal_sysfs.c
@@ -62,7 +62,9 @@ mode_show(struct device *dev, struct device_attribute *attr, char *buf)
if (!tz->ops->get_mode)
return -EPERM;
+ mutex_lock(&tz->lock);
result = tz->ops->get_mode(tz, &mode);
+ mutex_unlock(&tz->lock);
if (result)
return result;
@@ -75,17 +77,22 @@ mode_store(struct device *dev, struct device_attribute *attr,
const char *buf, size_t count)
{
struct thermal_zone_device *tz = to_thermal_zone(dev);
+ enum thermal_device_mode mode = THERMAL_DEVICE_DISABLED;
int result;
if (!tz->ops->set_mode)
return -EPERM;
if (!strncmp(buf, "enabled", sizeof("enabled") - 1))
- result = tz->ops->set_mode(tz, THERMAL_DEVICE_ENABLED);
+ mode = THERMAL_DEVICE_ENABLED;
else if (!strncmp(buf, "disabled", sizeof("disabled") - 1))
- result = tz->ops->set_mode(tz, THERMAL_DEVICE_DISABLED);
+ mode = THERMAL_DEVICE_DISABLED;
else
- result = -EINVAL;
+ return -EINVAL;
+
+ mutex_lock(&tz->lock);
+ result = tz->ops->set_mode(tz, mode);
+ mutex_unlock(&tz->lock);
if (result)
return result;
--
2.1.4
[toc] | [prev] | [next] | [standalone]
| From | Keerthy <a0393675@ti.com> |
|---|---|
| Date | 2016-06-07 11:10 +0200 |
| Subject | Re: [PATCH 02/15] thermal: sysfs: lock tz while on access to mode properties |
| Message-ID | <rHlbk-Mt-15@gated-at.bofh.it> |
| In reply to | #1409899 |
Hi Eduardo,
On Tuesday 31 May 2016 12:01 PM, Eduardo Valentin wrote:
> Serialized calls to tz.ops in user facing
> sysfs handler mode_show() and mode_store().
This seems to be causing a deadlock at boot time during the ending
stages of boot:
http://pastebin.ubuntu.com/17085291/
It took a while to git bisect on linux-next.
Seems like you introduced new locking at the sysfs layer which causes
this deadlock as the underlying code again tries to acquire the same
tz->lock.
Regards,
Keerthy
>
> Cc: Zhang Rui <rui.zhang@intel.com>
> Cc: linux-pm@vger.kernel.org
> Cc: linux-kernel@vger.kernel.org
> Signed-off-by: Eduardo Valentin <edubezval@gmail.com>
> ---
> drivers/thermal/thermal_sysfs.c | 13 ++++++++++---
> 1 file changed, 10 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/thermal/thermal_sysfs.c b/drivers/thermal/thermal_sysfs.c
> index ee983ca..1db2406 100644
> --- a/drivers/thermal/thermal_sysfs.c
> +++ b/drivers/thermal/thermal_sysfs.c
> @@ -62,7 +62,9 @@ mode_show(struct device *dev, struct device_attribute *attr, char *buf)
> if (!tz->ops->get_mode)
> return -EPERM;
>
> + mutex_lock(&tz->lock);
> result = tz->ops->get_mode(tz, &mode);
> + mutex_unlock(&tz->lock);
> if (result)
> return result;
>
> @@ -75,17 +77,22 @@ mode_store(struct device *dev, struct device_attribute *attr,
> const char *buf, size_t count)
> {
> struct thermal_zone_device *tz = to_thermal_zone(dev);
> + enum thermal_device_mode mode = THERMAL_DEVICE_DISABLED;
> int result;
>
> if (!tz->ops->set_mode)
> return -EPERM;
>
> if (!strncmp(buf, "enabled", sizeof("enabled") - 1))
> - result = tz->ops->set_mode(tz, THERMAL_DEVICE_ENABLED);
> + mode = THERMAL_DEVICE_ENABLED;
> else if (!strncmp(buf, "disabled", sizeof("disabled") - 1))
> - result = tz->ops->set_mode(tz, THERMAL_DEVICE_DISABLED);
> + mode = THERMAL_DEVICE_DISABLED;
> else
> - result = -EINVAL;
> + return -EINVAL;
> +
> + mutex_lock(&tz->lock);
> + result = tz->ops->set_mode(tz, mode);
> + mutex_unlock(&tz->lock);
>
> if (result)
> return result;
>
[toc] | [prev] | [next] | [standalone]
| From | Keerthy <a0393675@ti.com> |
|---|---|
| Date | 2016-06-07 11:30 +0200 |
| Subject | Re: [PATCH 02/15] thermal: sysfs: lock tz while on access to mode properties |
| Message-ID | <rHluG-Te-29@gated-at.bofh.it> |
| In reply to | #1415892 |
On Tuesday 07 June 2016 02:38 PM, Keerthy wrote:
> Hi Eduardo,
>
> On Tuesday 31 May 2016 12:01 PM, Eduardo Valentin wrote:
>> Serialized calls to tz.ops in user facing
>> sysfs handler mode_show() and mode_store().
>
> This seems to be causing a deadlock at boot time during the ending
> stages of boot:
>
> http://pastebin.ubuntu.com/17085291/
>
> It took a while to git bisect on linux-next.
>
> Seems like you introduced new locking at the sysfs layer which causes
> this deadlock as the underlying code again tries to acquire the same
> tz->lock.
I confirm reverting this patch helps me boot on linux-next. This patch
can be dropped as the lower layer functions are already acquiring tz->lock.
Thanks Vignesh for reporting the deadlock.
Regards,
Keerthy
>
> Regards,
> Keerthy
>
>>
>> Cc: Zhang Rui <rui.zhang@intel.com>
>> Cc: linux-pm@vger.kernel.org
>> Cc: linux-kernel@vger.kernel.org
>> Signed-off-by: Eduardo Valentin <edubezval@gmail.com>
>> ---
>> drivers/thermal/thermal_sysfs.c | 13 ++++++++++---
>> 1 file changed, 10 insertions(+), 3 deletions(-)
>>
>> diff --git a/drivers/thermal/thermal_sysfs.c
>> b/drivers/thermal/thermal_sysfs.c
>> index ee983ca..1db2406 100644
>> --- a/drivers/thermal/thermal_sysfs.c
>> +++ b/drivers/thermal/thermal_sysfs.c
>> @@ -62,7 +62,9 @@ mode_show(struct device *dev, struct
>> device_attribute *attr, char *buf)
>> if (!tz->ops->get_mode)
>> return -EPERM;
>>
>> + mutex_lock(&tz->lock);
>> result = tz->ops->get_mode(tz, &mode);
>> + mutex_unlock(&tz->lock);
>> if (result)
>> return result;
>>
>> @@ -75,17 +77,22 @@ mode_store(struct device *dev, struct
>> device_attribute *attr,
>> const char *buf, size_t count)
>> {
>> struct thermal_zone_device *tz = to_thermal_zone(dev);
>> + enum thermal_device_mode mode = THERMAL_DEVICE_DISABLED;
>> int result;
>>
>> if (!tz->ops->set_mode)
>> return -EPERM;
>>
>> if (!strncmp(buf, "enabled", sizeof("enabled") - 1))
>> - result = tz->ops->set_mode(tz, THERMAL_DEVICE_ENABLED);
>> + mode = THERMAL_DEVICE_ENABLED;
>> else if (!strncmp(buf, "disabled", sizeof("disabled") - 1))
>> - result = tz->ops->set_mode(tz, THERMAL_DEVICE_DISABLED);
>> + mode = THERMAL_DEVICE_DISABLED;
>> else
>> - result = -EINVAL;
>> + return -EINVAL;
>> +
>> + mutex_lock(&tz->lock);
>> + result = tz->ops->set_mode(tz, mode);
>> + mutex_unlock(&tz->lock);
>>
>> if (result)
>> return result;
>>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-pm" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
[toc] | [prev] | [next] | [standalone]
| From | Keerthy <a0393675@ti.com> |
|---|---|
| Date | 2016-06-01 06:00 +0200 |
| Message-ID | <rF5u2-38D-3@gated-at.bofh.it> |
| In reply to | #1409893 |
On Tuesday 31 May 2016 12:01 PM, Eduardo Valentin wrote: > Hello, > > Several thermal sysfs entries are currently being called > from userspace without locking. Data and calls to ops > are accessed deliberated without any care for locking. > > This patch series attempts to fix this. > > Now that sysfs handlers are on the same place it is easier > to visualize this issue and fix it. The strategy is essentially > to lock any access. Also, functions in thermal core and thermal > helpers are assumed to do the proper locking already. > > This patch series is based on the thermal core reorganization. > > There is no change in the ABI to userspace. The difference > is that now serialization to data will be done. > > For your consideration, I am also adding this to this branch: > git://git.kernel.org/pub/scm/linux/kernel/git/evalenti/linux-soc-thermal sysfs_locking Tested and checked for reading temperatures from all the thermal zones on DRA7/DRA72 and AM57XX-BEAGLE-X15 boards. Also tested emulation using a rebased version of https://lkml.org/lkml/2016/5/10/346 For DRA7/DRA72 and BEAGLE-X15: Tested-by: Keerthy <j-keerthy@ti.com> > > Comments are welcome. > > BR, > > Eduardo Valentin (15): > thermal: sysfs: lock tz in type_show > thermal: sysfs: lock tz while on access to mode properties > thermal: sysfs: lock tz while on trip_point_type properties > thermal: sysfs: lock tz while on trip_point_temp properties > thermal: sysfs: lock tz while on trip_point_hyst properties > thermal: sysfs: lock tz while on passive properties > thermal: sysfs: lock tz while on policy properties > thermal: sysfs: improve locking of emul_temp_store() > thermal: sysfs: lock tz when access sustainable power properties > thermal: sysfs: lock tz when access tzp properties > thermal: sysfs: lock cdev while accessing type > thermal: sysfs: lock cdev while accessing max_state > thermal: sysfs: lock cdev while accessing cur_state > thermal: sysfs: serialize access to instances > thermal: sysfs: add comments describing locking strategy > > drivers/thermal/thermal_sysfs.c | 133 ++++++++++++++++++++++++++++++++++------ > include/linux/thermal.h | 2 +- > 2 files changed, 115 insertions(+), 20 deletions(-) >
[toc] | [prev] | [standalone]
Back to top | Article view | linux.kernel
csiph-web