linux-pm.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2] thermal: Fail object registration if thermal class is not registered
@ 2023-01-23 20:44 Rafael J. Wysocki
  2023-01-23 22:56 ` Daniel Lezcano
                   ` (2 more replies)
  0 siblings, 3 replies; 4+ messages in thread
From: Rafael J. Wysocki @ 2023-01-23 20:44 UTC (permalink / raw)
  To: Linux PM, Daniel Lezcano; +Cc: LKML, Srinivas Pandruvada, Zhang Rui

From: Rafael J. Wysocki <rafael.j.wysocki@intel.com>

If thermal_class is not registered with the driver core, there is no way
to expose the interfaces used by the thermal control framework, so
prevent thermal zones and cooling devices from being registered in
that case by returning an error from object registration functions.

For this purpose, use a thermal_class pointer that will be NULL if the
class is not registered.  To avoid wasting memory in that case, allocate
the thermal class object dynamically and if it fails to register, free
it and clear the thermal_class pointer to NULL.

Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
---

-> v2: This replaces the series at
       https://lore.kernel.org/linux-pm/5905717.lOV4Wx5bFT@kreacher/

---
 drivers/thermal/thermal_core.c |   31 +++++++++++++++++++++++--------
 1 file changed, 23 insertions(+), 8 deletions(-)

Index: linux-pm/drivers/thermal/thermal_core.c
===================================================================
--- linux-pm.orig/drivers/thermal/thermal_core.c
+++ linux-pm/drivers/thermal/thermal_core.c
@@ -774,10 +774,7 @@ static void thermal_release(struct devic
 	}
 }
 
-static struct class thermal_class = {
-	.name = "thermal",
-	.dev_release = thermal_release,
-};
+static struct class *thermal_class;
 
 static inline
 void print_bind_err_msg(struct thermal_zone_device *tz,
@@ -880,6 +877,9 @@ __thermal_cooling_device_register(struct
 	    !ops->set_cur_state)
 		return ERR_PTR(-EINVAL);
 
+	if (!thermal_class)
+		return ERR_PTR(-ENODEV);
+
 	cdev = kzalloc(sizeof(*cdev), GFP_KERNEL);
 	if (!cdev)
 		return ERR_PTR(-ENOMEM);
@@ -901,7 +901,7 @@ __thermal_cooling_device_register(struct
 	cdev->np = np;
 	cdev->ops = ops;
 	cdev->updated = false;
-	cdev->device.class = &thermal_class;
+	cdev->device.class = thermal_class;
 	cdev->devdata = devdata;
 
 	ret = cdev->ops->get_max_state(cdev, &cdev->max_state);
@@ -1349,6 +1349,9 @@ thermal_zone_device_register_with_trips(
 	if (num_trips > 0 && (!ops->get_trip_type || !ops->get_trip_temp) && !trips)
 		return ERR_PTR(-EINVAL);
 
+	if (!thermal_class)
+		return ERR_PTR(-ENODEV);
+
 	tz = kzalloc(sizeof(*tz), GFP_KERNEL);
 	if (!tz)
 		return ERR_PTR(-ENOMEM);
@@ -1370,7 +1373,7 @@ thermal_zone_device_register_with_trips(
 
 	tz->ops = ops;
 	tz->tzp = tzp;
-	tz->device.class = &thermal_class;
+	tz->device.class = thermal_class;
 	tz->devdata = devdata;
 	tz->trips = trips;
 	tz->num_trips = num_trips;
@@ -1615,9 +1618,21 @@ static int __init thermal_init(void)
 	if (result)
 		goto error;
 
-	result = class_register(&thermal_class);
-	if (result)
+	thermal_class = kzalloc(sizeof(*thermal_class), GFP_KERNEL);
+	if (!thermal_class) {
+		result = -ENOMEM;
+		goto unregister_governors;
+	}
+
+	thermal_class->name = "thermal";
+	thermal_class->dev_release = thermal_release;
+
+	result = class_register(thermal_class);
+	if (result) {
+		kfree(thermal_class);
+		thermal_class = NULL;
 		goto unregister_governors;
+	}
 
 	result = register_pm_notifier(&thermal_pm_nb);
 	if (result)




^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH v2] thermal: Fail object registration if thermal class is not registered
  2023-01-23 20:44 [PATCH v2] thermal: Fail object registration if thermal class is not registered Rafael J. Wysocki
@ 2023-01-23 22:56 ` Daniel Lezcano
  2023-01-24  6:31 ` Zhang, Rui
  2023-01-24 17:04 ` Greg KH
  2 siblings, 0 replies; 4+ messages in thread
From: Daniel Lezcano @ 2023-01-23 22:56 UTC (permalink / raw)
  To: Rafael J. Wysocki, Linux PM; +Cc: LKML, Srinivas Pandruvada, Zhang Rui

On 23/01/2023 21:44, Rafael J. Wysocki wrote:
> From: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
> 
> If thermal_class is not registered with the driver core, there is no way
> to expose the interfaces used by the thermal control framework, so
> prevent thermal zones and cooling devices from being registered in
> that case by returning an error from object registration functions.
> 
> For this purpose, use a thermal_class pointer that will be NULL if the
> class is not registered.  To avoid wasting memory in that case, allocate
> the thermal class object dynamically and if it fails to register, free
> it and clear the thermal_class pointer to NULL.
> 
> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>

Acked-by: Daniel Lezcano <daniel.lezcano@linaro.org>


-- 
<http://www.linaro.org/> Linaro.org │ Open source software for ARM SoCs

Follow Linaro:  <http://www.facebook.com/pages/Linaro> Facebook |
<http://twitter.com/#!/linaroorg> Twitter |
<http://www.linaro.org/linaro-blog/> Blog


^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH v2] thermal: Fail object registration if thermal class is not registered
  2023-01-23 20:44 [PATCH v2] thermal: Fail object registration if thermal class is not registered Rafael J. Wysocki
  2023-01-23 22:56 ` Daniel Lezcano
@ 2023-01-24  6:31 ` Zhang, Rui
  2023-01-24 17:04 ` Greg KH
  2 siblings, 0 replies; 4+ messages in thread
From: Zhang, Rui @ 2023-01-24  6:31 UTC (permalink / raw)
  To: linux-pm@vger.kernel.org, daniel.lezcano@linaro.org,
	rjw@rjwysocki.net
  Cc: srinivas.pandruvada@linux.intel.com, linux-kernel@vger.kernel.org

On Mon, 2023-01-23 at 21:44 +0100, Rafael J. Wysocki wrote:
> From: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
> 
> If thermal_class is not registered with the driver core, there is no
> way
> to expose the interfaces used by the thermal control framework, so
> prevent thermal zones and cooling devices from being registered in
> that case by returning an error from object registration functions.
> 
> For this purpose, use a thermal_class pointer that will be NULL if
> the
> class is not registered.  To avoid wasting memory in that case,
> allocate
> the thermal class object dynamically and if it fails to register,
> free
> it and clear the thermal_class pointer to NULL.
> 
> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>

Reviewed-by: Zhang Rui <rui.zhang@intel.com>

thanks,
rui
> ---
> 
> -> v2: This replaces the series at
>        https://lore.kernel.org/linux-pm/5905717.lOV4Wx5bFT@kreacher/
> 
> ---
>  drivers/thermal/thermal_core.c |   31 +++++++++++++++++++++++-------
> -
>  1 file changed, 23 insertions(+), 8 deletions(-)
> 
> Index: linux-pm/drivers/thermal/thermal_core.c
> ===================================================================
> --- linux-pm.orig/drivers/thermal/thermal_core.c
> +++ linux-pm/drivers/thermal/thermal_core.c
> @@ -774,10 +774,7 @@ static void thermal_release(struct devic
>  	}
>  }
>  
> -static struct class thermal_class = {
> -	.name = "thermal",
> -	.dev_release = thermal_release,
> -};
> +static struct class *thermal_class;
>  
>  static inline
>  void print_bind_err_msg(struct thermal_zone_device *tz,
> @@ -880,6 +877,9 @@ __thermal_cooling_device_register(struct
>  	    !ops->set_cur_state)
>  		return ERR_PTR(-EINVAL);
>  
> +	if (!thermal_class)
> +		return ERR_PTR(-ENODEV);
> +
>  	cdev = kzalloc(sizeof(*cdev), GFP_KERNEL);
>  	if (!cdev)
>  		return ERR_PTR(-ENOMEM);
> @@ -901,7 +901,7 @@ __thermal_cooling_device_register(struct
>  	cdev->np = np;
>  	cdev->ops = ops;
>  	cdev->updated = false;
> -	cdev->device.class = &thermal_class;
> +	cdev->device.class = thermal_class;
>  	cdev->devdata = devdata;
>  
>  	ret = cdev->ops->get_max_state(cdev, &cdev->max_state);
> @@ -1349,6 +1349,9 @@ thermal_zone_device_register_with_trips(
>  	if (num_trips > 0 && (!ops->get_trip_type || !ops-
> >get_trip_temp) && !trips)
>  		return ERR_PTR(-EINVAL);
>  
> +	if (!thermal_class)
> +		return ERR_PTR(-ENODEV);
> +
>  	tz = kzalloc(sizeof(*tz), GFP_KERNEL);
>  	if (!tz)
>  		return ERR_PTR(-ENOMEM);
> @@ -1370,7 +1373,7 @@ thermal_zone_device_register_with_trips(
>  
>  	tz->ops = ops;
>  	tz->tzp = tzp;
> -	tz->device.class = &thermal_class;
> +	tz->device.class = thermal_class;
>  	tz->devdata = devdata;
>  	tz->trips = trips;
>  	tz->num_trips = num_trips;
> @@ -1615,9 +1618,21 @@ static int __init thermal_init(void)
>  	if (result)
>  		goto error;
>  
> -	result = class_register(&thermal_class);
> -	if (result)
> +	thermal_class = kzalloc(sizeof(*thermal_class), GFP_KERNEL);
> +	if (!thermal_class) {
> +		result = -ENOMEM;
> +		goto unregister_governors;
> +	}
> +
> +	thermal_class->name = "thermal";
> +	thermal_class->dev_release = thermal_release;
> +
> +	result = class_register(thermal_class);
> +	if (result) {
> +		kfree(thermal_class);
> +		thermal_class = NULL;
>  		goto unregister_governors;
> +	}
>  
>  	result = register_pm_notifier(&thermal_pm_nb);
>  	if (result)
> 
> 
> 

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH v2] thermal: Fail object registration if thermal class is not registered
  2023-01-23 20:44 [PATCH v2] thermal: Fail object registration if thermal class is not registered Rafael J. Wysocki
  2023-01-23 22:56 ` Daniel Lezcano
  2023-01-24  6:31 ` Zhang, Rui
@ 2023-01-24 17:04 ` Greg KH
  2 siblings, 0 replies; 4+ messages in thread
From: Greg KH @ 2023-01-24 17:04 UTC (permalink / raw)
  To: Rafael J. Wysocki
  Cc: Linux PM, Daniel Lezcano, LKML, Srinivas Pandruvada, Zhang Rui

On Mon, Jan 23, 2023 at 09:44:03PM +0100, Rafael J. Wysocki wrote:
> From: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
> 
> If thermal_class is not registered with the driver core, there is no way
> to expose the interfaces used by the thermal control framework, so
> prevent thermal zones and cooling devices from being registered in
> that case by returning an error from object registration functions.
> 
> For this purpose, use a thermal_class pointer that will be NULL if the
> class is not registered.  To avoid wasting memory in that case, allocate
> the thermal class object dynamically and if it fails to register, free
> it and clear the thermal_class pointer to NULL.
> 
> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
> ---
> 
> -> v2: This replaces the series at
>        https://lore.kernel.org/linux-pm/5905717.lOV4Wx5bFT@kreacher/

Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2023-01-24 17:05 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-01-23 20:44 [PATCH v2] thermal: Fail object registration if thermal class is not registered Rafael J. Wysocki
2023-01-23 22:56 ` Daniel Lezcano
2023-01-24  6:31 ` Zhang, Rui
2023-01-24 17:04 ` Greg KH

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).