]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
thermal: core: Store trip sysfs attributes in thermal_trip_desc
authorRafael J. Wysocki <rafael.j.wysocki@intel.com>
Mon, 29 Jul 2024 16:25:03 +0000 (18:25 +0200)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Tue, 13 Aug 2024 18:50:57 +0000 (20:50 +0200)
Instead of allocating memory for trip point sysfs attributes separately,
store them in struct thermal_trip_desc for each trip individually which
allows a few extra memory allocations to be avoided.

No intentional functional impact.

Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Link: https://patch.msgid.link/46571375.fMDQidcC6G@rjwysocki.net
drivers/thermal/thermal_core.h
drivers/thermal/thermal_sysfs.c

index e03079708b6c513deea156e1d88f7a0bb3bf73b0..3c9e3e69eb9a48fd0c499162df15abcd7fcd62de 100644 (file)
 #include "thermal_netlink.h"
 #include "thermal_debugfs.h"
 
+struct thermal_attr {
+       struct device_attribute attr;
+       char name[THERMAL_NAME_LENGTH];
+};
+
+struct thermal_trip_attrs {
+       struct thermal_attr type;
+       struct thermal_attr temp;
+       struct thermal_attr hyst;
+};
+
 struct thermal_trip_desc {
        struct thermal_trip trip;
+       struct thermal_trip_attrs trip_attrs;
        struct list_head notify_list_node;
        int notify_temp;
        int threshold;
@@ -56,9 +68,6 @@ struct thermal_governor {
  * @device:    &struct device for this thermal zone
  * @removal:   removal completion
  * @resume:    resume completion
- * @trip_temp_attrs:   attributes for trip points for sysfs: trip temperature
- * @trip_type_attrs:   attributes for trip points for sysfs: trip type
- * @trip_hyst_attrs:   attributes for trip points for sysfs: trip hysteresis
  * @mode:              current mode of this thermal zone
  * @devdata:   private pointer for device private data
  * @num_trips: number of trip points the thermal zone supports
@@ -102,9 +111,6 @@ struct thermal_zone_device {
        struct completion removal;
        struct completion resume;
        struct attribute_group trips_attribute_group;
-       struct thermal_attr *trip_temp_attrs;
-       struct thermal_attr *trip_type_attrs;
-       struct thermal_attr *trip_hyst_attrs;
        enum thermal_device_mode mode;
        void *devdata;
        int num_trips;
@@ -188,11 +194,6 @@ int for_each_thermal_governor(int (*cb)(struct thermal_governor *, void *),
 
 struct thermal_zone_device *thermal_zone_get_by_id(int id);
 
-struct thermal_attr {
-       struct device_attribute attr;
-       char name[THERMAL_NAME_LENGTH];
-};
-
 static inline bool cdev_is_power_actor(struct thermal_cooling_device *cdev)
 {
        return cdev->ops->get_requested_power && cdev->ops->state2power &&
index 72b302bf914e31f03c27f723fba35ed5a0cc42d9..f12d5d47da9bdb7525cc4447704c1aef56e49e4e 100644 (file)
@@ -382,87 +382,55 @@ static const struct attribute_group *thermal_zone_attribute_groups[] = {
  */
 static int create_trip_attrs(struct thermal_zone_device *tz)
 {
-       const struct thermal_trip_desc *td;
+       struct thermal_trip_desc *td;
        struct attribute **attrs;
-
-       /* This function works only for zones with at least one trip */
-       if (tz->num_trips <= 0)
-               return -EINVAL;
-
-       tz->trip_type_attrs = kcalloc(tz->num_trips, sizeof(*tz->trip_type_attrs),
-                                     GFP_KERNEL);
-       if (!tz->trip_type_attrs)
-               return -ENOMEM;
-
-       tz->trip_temp_attrs = kcalloc(tz->num_trips, sizeof(*tz->trip_temp_attrs),
-                                     GFP_KERNEL);
-       if (!tz->trip_temp_attrs) {
-               kfree(tz->trip_type_attrs);
-               return -ENOMEM;
-       }
-
-       tz->trip_hyst_attrs = kcalloc(tz->num_trips,
-                                     sizeof(*tz->trip_hyst_attrs),
-                                     GFP_KERNEL);
-       if (!tz->trip_hyst_attrs) {
-               kfree(tz->trip_type_attrs);
-               kfree(tz->trip_temp_attrs);
-               return -ENOMEM;
-       }
+       int i;
 
        attrs = kcalloc(tz->num_trips * 3 + 1, sizeof(*attrs), GFP_KERNEL);
-       if (!attrs) {
-               kfree(tz->trip_type_attrs);
-               kfree(tz->trip_temp_attrs);
-               kfree(tz->trip_hyst_attrs);
+       if (!attrs)
                return -ENOMEM;
-       }
 
+       i = 0;
        for_each_trip_desc(tz, td) {
-               int indx = thermal_zone_trip_id(tz, &td->trip);
+               struct thermal_trip_attrs *trip_attrs = &td->trip_attrs;
 
                /* create trip type attribute */
-               snprintf(tz->trip_type_attrs[indx].name, THERMAL_NAME_LENGTH,
-                        "trip_point_%d_type", indx);
+               snprintf(trip_attrs->type.name, THERMAL_NAME_LENGTH,
+                        "trip_point_%d_type", i);
 
-               sysfs_attr_init(&tz->trip_type_attrs[indx].attr.attr);
-               tz->trip_type_attrs[indx].attr.attr.name =
-                                               tz->trip_type_attrs[indx].name;
-               tz->trip_type_attrs[indx].attr.attr.mode = S_IRUGO;
-               tz->trip_type_attrs[indx].attr.show = trip_point_type_show;
-               attrs[indx] = &tz->trip_type_attrs[indx].attr.attr;
+               sysfs_attr_init(&trip_attrs->type.attr.attr);
+               trip_attrs->type.attr.attr.name = trip_attrs->type.name;
+               trip_attrs->type.attr.attr.mode = S_IRUGO;
+               trip_attrs->type.attr.show = trip_point_type_show;
+               attrs[i] = &trip_attrs->type.attr.attr;
 
                /* create trip temp attribute */
-               snprintf(tz->trip_temp_attrs[indx].name, THERMAL_NAME_LENGTH,
-                        "trip_point_%d_temp", indx);
-
-               sysfs_attr_init(&tz->trip_temp_attrs[indx].attr.attr);
-               tz->trip_temp_attrs[indx].attr.attr.name =
-                                               tz->trip_temp_attrs[indx].name;
-               tz->trip_temp_attrs[indx].attr.attr.mode = S_IRUGO;
-               tz->trip_temp_attrs[indx].attr.show = trip_point_temp_show;
+               snprintf(trip_attrs->temp.name, THERMAL_NAME_LENGTH,
+                        "trip_point_%d_temp", i);
+
+               sysfs_attr_init(&trip_attrs->temp.attr.attr);
+               trip_attrs->temp.attr.attr.name = trip_attrs->temp.name;
+               trip_attrs->temp.attr.attr.mode = S_IRUGO;
+               trip_attrs->temp.attr.show = trip_point_temp_show;
                if (td->trip.flags & THERMAL_TRIP_FLAG_RW_TEMP) {
-                       tz->trip_temp_attrs[indx].attr.attr.mode |= S_IWUSR;
-                       tz->trip_temp_attrs[indx].attr.store =
-                                                       trip_point_temp_store;
+                       trip_attrs->temp.attr.attr.mode |= S_IWUSR;
+                       trip_attrs->temp.attr.store = trip_point_temp_store;
                }
-               attrs[indx + tz->num_trips] = &tz->trip_temp_attrs[indx].attr.attr;
+               attrs[i + tz->num_trips] = &trip_attrs->temp.attr.attr;
 
-               snprintf(tz->trip_hyst_attrs[indx].name, THERMAL_NAME_LENGTH,
-                        "trip_point_%d_hyst", indx);
+               snprintf(trip_attrs->hyst.name, THERMAL_NAME_LENGTH,
+                        "trip_point_%d_hyst", i);
 
-               sysfs_attr_init(&tz->trip_hyst_attrs[indx].attr.attr);
-               tz->trip_hyst_attrs[indx].attr.attr.name =
-                                       tz->trip_hyst_attrs[indx].name;
-               tz->trip_hyst_attrs[indx].attr.attr.mode = S_IRUGO;
-               tz->trip_hyst_attrs[indx].attr.show = trip_point_hyst_show;
+               sysfs_attr_init(&trip_attrs->hyst.attr.attr);
+               trip_attrs->hyst.attr.attr.name = trip_attrs->hyst.name;
+               trip_attrs->hyst.attr.attr.mode = S_IRUGO;
+               trip_attrs->hyst.attr.show = trip_point_hyst_show;
                if (td->trip.flags & THERMAL_TRIP_FLAG_RW_HYST) {
-                       tz->trip_hyst_attrs[indx].attr.attr.mode |= S_IWUSR;
-                       tz->trip_hyst_attrs[indx].attr.store =
-                                       trip_point_hyst_store;
+                       trip_attrs->hyst.attr.attr.mode |= S_IWUSR;
+                       trip_attrs->hyst.attr.store = trip_point_hyst_store;
                }
-               attrs[indx + tz->num_trips * 2] =
-                                       &tz->trip_hyst_attrs[indx].attr.attr;
+               attrs[i + 2 * tz->num_trips] = &trip_attrs->hyst.attr.attr;
+               i++;
        }
        attrs[tz->num_trips * 3] = NULL;
 
@@ -479,13 +447,8 @@ static int create_trip_attrs(struct thermal_zone_device *tz)
  */
 static void destroy_trip_attrs(struct thermal_zone_device *tz)
 {
-       if (!tz)
-               return;
-
-       kfree(tz->trip_type_attrs);
-       kfree(tz->trip_temp_attrs);
-       kfree(tz->trip_hyst_attrs);
-       kfree(tz->trips_attribute_group.attrs);
+       if (tz)
+               kfree(tz->trips_attribute_group.attrs);
 }
 
 int thermal_zone_create_device_groups(struct thermal_zone_device *tz)