Message ID | 1411547232-21493-4-git-send-email-l.majewski@samsung.com (mailing list archive) |
---|---|
State | Superseded, archived |
Delegated to: | Zhang Rui |
Headers | show |
On Wed, Sep 24, 2014 at 10:27:12AM +0200, Lukasz Majewski wrote: > Without this check it was possible to execute cooling device binding code > even when wrong max cooling state was read. > > Signed-off-by: Lukasz Majewski <l.majewski@samsung.com> Acked-by: Eduardo Valentin <edubezval@gmail.com> Rui, are you taking these patches? Do you prefer me to collect them? Cheers Eduardo > --- > drivers/thermal/thermal_core.c | 6 ++++-- > 1 file changed, 4 insertions(+), 2 deletions(-) > > diff --git a/drivers/thermal/thermal_core.c b/drivers/thermal/thermal_core.c > index 747618a..8a4dc35 100644 > --- a/drivers/thermal/thermal_core.c > +++ b/drivers/thermal/thermal_core.c > @@ -928,7 +928,7 @@ int thermal_zone_bind_cooling_device(struct thermal_zone_device *tz, > struct thermal_zone_device *pos1; > struct thermal_cooling_device *pos2; > unsigned long max_state = 0; > - int result; > + int result, ret; > > if (trip >= tz->trips || (trip < 0 && trip != THERMAL_TRIPS_NONE)) > return -EINVAL; > @@ -945,7 +945,9 @@ int thermal_zone_bind_cooling_device(struct thermal_zone_device *tz, > if (tz != pos1 || cdev != pos2) > return -EINVAL; > > - cdev->ops->get_max_state(cdev, &max_state); > + ret = cdev->ops->get_max_state(cdev, &max_state); > + if (ret) > + return ret; > > /* lower default 0, upper default max_state */ > lower = lower == THERMAL_NO_LIMIT ? 0 : lower; > -- > 2.0.0.rc2 > -- 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
Hi Eduardo, Rui, > On Wed, Sep 24, 2014 at 10:27:12AM +0200, Lukasz Majewski wrote: > > Without this check it was possible to execute cooling device > > binding code even when wrong max cooling state was read. > > > > Signed-off-by: Lukasz Majewski <l.majewski@samsung.com> > > Acked-by: Eduardo Valentin <edubezval@gmail.com> > > Rui, are you taking these patches? Do you prefer me to collect them? I'd like to ask you NOT to apply those patches. In short: It will cause regression on all non Exynos boards. Explanation: Up till now the cpu_cooling device was bind even when the get_max_state() returned -EINVAL and everything worked after late cpufreq policy initialization. However, during this time window the thermal driver is not properly configured. Applying PATCH2/3 and PATCH3/3 would cause bind error without any further occasion for re-bind. As a result THERAL will not be present on the target system. It works on the Exynos boards, since at the report_trigger() function, when first trip point is reached, it is checked if cpu_cooling device is bind. If it is not (due to "fixes" at PATCH2/3 and PATCH3/3) it is rebind then. Due to above, I think that it would be best to leave things as they are now and prepare proper fix as suggested by Eduardo. > > Cheers > > Eduardo > > > --- > > drivers/thermal/thermal_core.c | 6 ++++-- > > 1 file changed, 4 insertions(+), 2 deletions(-) > > > > diff --git a/drivers/thermal/thermal_core.c > > b/drivers/thermal/thermal_core.c index 747618a..8a4dc35 100644 > > --- a/drivers/thermal/thermal_core.c > > +++ b/drivers/thermal/thermal_core.c > > @@ -928,7 +928,7 @@ int thermal_zone_bind_cooling_device(struct > > thermal_zone_device *tz, struct thermal_zone_device *pos1; > > struct thermal_cooling_device *pos2; > > unsigned long max_state = 0; > > - int result; > > + int result, ret; > > > > if (trip >= tz->trips || (trip < 0 && trip != > > THERMAL_TRIPS_NONE)) return -EINVAL; > > @@ -945,7 +945,9 @@ int thermal_zone_bind_cooling_device(struct > > thermal_zone_device *tz, if (tz != pos1 || cdev != pos2) > > return -EINVAL; > > > > - cdev->ops->get_max_state(cdev, &max_state); > > + ret = cdev->ops->get_max_state(cdev, &max_state); > > + if (ret) > > + return ret; > > > > /* lower default 0, upper default max_state */ > > lower = lower == THERMAL_NO_LIMIT ? 0 : lower; > > -- > > 2.0.0.rc2 > >
On Fri, 2014-10-03 at 12:40 +0200, Lukasz Majewski wrote: > Hi Eduardo, Rui, > > > On Wed, Sep 24, 2014 at 10:27:12AM +0200, Lukasz Majewski wrote: > > > Without this check it was possible to execute cooling device > > > binding code even when wrong max cooling state was read. > > > > > > Signed-off-by: Lukasz Majewski <l.majewski@samsung.com> > > > > Acked-by: Eduardo Valentin <edubezval@gmail.com> > > > > Rui, are you taking these patches? Do you prefer me to collect them? > > I'd like to ask you NOT to apply those patches. > > In short: It will cause regression on all non Exynos boards. > > Explanation: > > Up till now the cpu_cooling device was bind even when the > get_max_state() returned -EINVAL and everything worked after late > cpufreq policy initialization. > > However, during this time window the thermal driver is not properly > configured. > > Applying PATCH2/3 and PATCH3/3 would cause bind error without any > further occasion for re-bind. As a result THERAL will not be present > on the target system. > > It works on the Exynos boards, since at the report_trigger() function, > when first trip point is reached, it is checked if cpu_cooling device > is bind. If it is not (due to "fixes" at PATCH2/3 and PATCH3/3) it > is rebind then. > > Due to above, I think that it would be best to leave things as they are > now and prepare proper fix as suggested by Eduardo. > Agreed. Can anyone please propose such a patch? thanks, rui > > > > Cheers > > > > Eduardo > > > > > --- > > > drivers/thermal/thermal_core.c | 6 ++++-- > > > 1 file changed, 4 insertions(+), 2 deletions(-) > > > > > > diff --git a/drivers/thermal/thermal_core.c > > > b/drivers/thermal/thermal_core.c index 747618a..8a4dc35 100644 > > > --- a/drivers/thermal/thermal_core.c > > > +++ b/drivers/thermal/thermal_core.c > > > @@ -928,7 +928,7 @@ int thermal_zone_bind_cooling_device(struct > > > thermal_zone_device *tz, struct thermal_zone_device *pos1; > > > struct thermal_cooling_device *pos2; > > > unsigned long max_state = 0; > > > - int result; > > > + int result, ret; > > > > > > if (trip >= tz->trips || (trip < 0 && trip != > > > THERMAL_TRIPS_NONE)) return -EINVAL; > > > @@ -945,7 +945,9 @@ int thermal_zone_bind_cooling_device(struct > > > thermal_zone_device *tz, if (tz != pos1 || cdev != pos2) > > > return -EINVAL; > > > > > > - cdev->ops->get_max_state(cdev, &max_state); > > > + ret = cdev->ops->get_max_state(cdev, &max_state); > > > + if (ret) > > > + return ret; > > > > > > /* lower default 0, upper default max_state */ > > > lower = lower == THERMAL_NO_LIMIT ? 0 : lower; > > > -- > > > 2.0.0.rc2 > > > > > > -- 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
Hi Zhang, > On Fri, 2014-10-03 at 12:40 +0200, Lukasz Majewski wrote: > > Hi Eduardo, Rui, > > > > > On Wed, Sep 24, 2014 at 10:27:12AM +0200, Lukasz Majewski wrote: > > > > Without this check it was possible to execute cooling device > > > > binding code even when wrong max cooling state was read. > > > > > > > > Signed-off-by: Lukasz Majewski <l.majewski@samsung.com> > > > > > > Acked-by: Eduardo Valentin <edubezval@gmail.com> > > > > > > Rui, are you taking these patches? Do you prefer me to collect > > > them? > > > > I'd like to ask you NOT to apply those patches. > > > > In short: It will cause regression on all non Exynos boards. > > > > Explanation: > > > > Up till now the cpu_cooling device was bind even when the > > get_max_state() returned -EINVAL and everything worked after late > > cpufreq policy initialization. > > > > However, during this time window the thermal driver is not properly > > configured. > > > > Applying PATCH2/3 and PATCH3/3 would cause bind error without any > > further occasion for re-bind. As a result THERAL will not be present > > on the target system. > > > > It works on the Exynos boards, since at the report_trigger() > > function, when first trip point is reached, it is checked if > > cpu_cooling device is bind. If it is not (due to "fixes" at > > PATCH2/3 and PATCH3/3) it is rebind then. > > > > Due to above, I think that it would be best to leave things as they > > are now and prepare proper fix as suggested by Eduardo. > > > Agreed. Can anyone please propose such a patch? I can propose myself as a volunteer for this. Unfortunately, I won't be able to provide any code earlier than in two weeks time. > > thanks, > rui > > > > > > Cheers > > > > > > Eduardo > > > > > > > --- > > > > drivers/thermal/thermal_core.c | 6 ++++-- > > > > 1 file changed, 4 insertions(+), 2 deletions(-) > > > > > > > > diff --git a/drivers/thermal/thermal_core.c > > > > b/drivers/thermal/thermal_core.c index 747618a..8a4dc35 100644 > > > > --- a/drivers/thermal/thermal_core.c > > > > +++ b/drivers/thermal/thermal_core.c > > > > @@ -928,7 +928,7 @@ int thermal_zone_bind_cooling_device(struct > > > > thermal_zone_device *tz, struct thermal_zone_device *pos1; > > > > struct thermal_cooling_device *pos2; > > > > unsigned long max_state = 0; > > > > - int result; > > > > + int result, ret; > > > > > > > > if (trip >= tz->trips || (trip < 0 && trip != > > > > THERMAL_TRIPS_NONE)) return -EINVAL; > > > > @@ -945,7 +945,9 @@ int thermal_zone_bind_cooling_device(struct > > > > thermal_zone_device *tz, if (tz != pos1 || cdev != pos2) > > > > return -EINVAL; > > > > > > > > - cdev->ops->get_max_state(cdev, &max_state); > > > > + ret = cdev->ops->get_max_state(cdev, &max_state); > > > > + if (ret) > > > > + return ret; > > > > > > > > /* lower default 0, upper default max_state */ > > > > lower = lower == THERMAL_NO_LIMIT ? 0 : lower; > > > > -- > > > > 2.0.0.rc2 > > > > > > > > > > >
diff --git a/drivers/thermal/thermal_core.c b/drivers/thermal/thermal_core.c index 747618a..8a4dc35 100644 --- a/drivers/thermal/thermal_core.c +++ b/drivers/thermal/thermal_core.c @@ -928,7 +928,7 @@ int thermal_zone_bind_cooling_device(struct thermal_zone_device *tz, struct thermal_zone_device *pos1; struct thermal_cooling_device *pos2; unsigned long max_state = 0; - int result; + int result, ret; if (trip >= tz->trips || (trip < 0 && trip != THERMAL_TRIPS_NONE)) return -EINVAL; @@ -945,7 +945,9 @@ int thermal_zone_bind_cooling_device(struct thermal_zone_device *tz, if (tz != pos1 || cdev != pos2) return -EINVAL; - cdev->ops->get_max_state(cdev, &max_state); + ret = cdev->ops->get_max_state(cdev, &max_state); + if (ret) + return ret; /* lower default 0, upper default max_state */ lower = lower == THERMAL_NO_LIMIT ? 0 : lower;
Without this check it was possible to execute cooling device binding code even when wrong max cooling state was read. Signed-off-by: Lukasz Majewski <l.majewski@samsung.com> --- drivers/thermal/thermal_core.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)