Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1409893 > unrolled thread

[PATCH 00/15] thermal: sysfs: add locking

Started byEduardo Valentin <edubezval@gmail.com>
First post2016-05-31 08:40 +0200
Last post2016-06-01 06:00 +0200
Articles 5 — 2 participants

Back to article view | Back to linux.kernel


Contents

  [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

#1409893 — [PATCH 00/15] thermal: sysfs: add locking

FromEduardo Valentin <edubezval@gmail.com>
Date2016-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]


#1409899 — [PATCH 02/15] thermal: sysfs: lock tz while on access to mode properties

FromEduardo Valentin <edubezval@gmail.com>
Date2016-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]


#1415892 — Re: [PATCH 02/15] thermal: sysfs: lock tz while on access to mode properties

FromKeerthy <a0393675@ti.com>
Date2016-06-07 11:10 +0200
SubjectRe: [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]


#1415922 — Re: [PATCH 02/15] thermal: sysfs: lock tz while on access to mode properties

FromKeerthy <a0393675@ti.com>
Date2016-06-07 11:30 +0200
SubjectRe: [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]


#1410802

FromKeerthy <a0393675@ti.com>
Date2016-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