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


Groups > linux.kernel > #1385754

[RFC PATCH 11/11] thermal: move trips attributes to tz->device.groups

Path csiph.com!goblin3!goblin2!goblin.stu.neva.ru!gothmog.csi.it!bofh.it!news.nic.it!robomod
From Eduardo Valentin <edubezval@gmail.com>
Newsgroups linux.kernel
Subject [RFC PATCH 11/11] thermal: move trips attributes to tz->device.groups
Date Sun, 24 Apr 2016 01:40:03 +0200
Message-ID <rrfjB-31p-35@gated-at.bofh.it> (permalink)
References <rrfjz-31p-5@gated-at.bofh.it>
X-Original-To Rui Zhang <rui.zhang@intel.com>
Dkim-Signature v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=I0cTXURnmNu1UV8H0OhYOK2wBjBrrJIrum4up8FHfOE=; b=ITBYuoh6tz24el07memgk3ziP4x00qYcjYoS5yRSzwLNBrX+ekLuuSfDEI2Up7D+Vs 2c5AfRP73dXIGgMvuRN6BKEfIlKXhKnJGEQwmRSP0kcBRsCMRbvx8lp9jdgXBywD3Qwc kIPDP9/aN+VVePnDLm8t4prXf0ikKetU4ArgRFnShwSKJaQKu44CpQapEkz4z38Ydj0y k1xSkCcCHo88sP+Dp3nwEOGX+8e5XDxRVXl6TODjWkH9WizWG596F4lAq0XBJYA4gX3R 6PcOseWAdgoxduzeGL6V6QuzQos4hMcnsUdaNIa9PIyLkGNT4tMLZYO3LCXawojJe2rb U95Q==
X-Google-Dkim-Signature v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=I0cTXURnmNu1UV8H0OhYOK2wBjBrrJIrum4up8FHfOE=; b=dET6Nj1f+dii5m2y9eDy+RX65MOpQNseYblV1CdMEjCaYPdrmy3rsGJ+qQVbIeG1e5 dDXXaziDDppRXZRQtCKlLVT6yHuDyvSoCKf2LVmXVI6m4qpeIt7l+0k1Lku0w83iF3zv Y3zj+a2IPnL6luxTc8gGr1/eitX8itapSKpMpjRrVTejPMgrU72JdUMgSHeQZWJogwB3 tztF7G0UFT7yFQunMZ9PTo3s+Os8KeCRK+JxPDK3Mp/+RwSNMkl/H3PEsaoou5t8UX/M QTIuzCvUGsExssXkE8Ju8jfYSweEUXG3C2Kl/+3MVS3FB9tzr1YWtH5E7U1fCaOjtYNg 84ww==
X-Gm-Message-State AOPr4FWf6nDzQGzLmMmlJ4v0FQkhgq7yD64a9iVL4hzzitySiArMuzHfbjk9vPVChKOFAA==
X-Received by 10.98.42.207 with SMTP id q198mr38790619pfq.103.1461454502297; Sat, 23 Apr 2016 16:35:02 -0700 (PDT)
X-Mailer git-send-email 2.1.4
Sender robomod@news.nic.it
List-ID <linux-kernel.vger.kernel.org>
X-Mailing-List linux-kernel@vger.kernel.org
Approved robomod@news.nic.it
Lines 192
Organization linux.* mail to news gateway
X-Original-Cc Linux PM <linux-pm@vger.kernel.org>, LKML <linux-kernel@vger.kernel.org>, Eduardo Valentin <edubezval@gmail.com>
X-Original-Date Sat, 23 Apr 2016 16:34:30 -0700
X-Original-Message-ID <1461454470-27714-12-git-send-email-edubezval@gmail.com>
X-Original-References <1461454470-27714-1-git-send-email-edubezval@gmail.com>
X-Original-Sender linux-kernel-owner@vger.kernel.org
Xref csiph.com linux.kernel:1385754

Show key headers only | View raw


Finally, move the last thermal zone sysfs attributes to
tz->device.groups: trips attributes. This requires adding a
attribute_group to thermal_zone_device, creating it dynamically, and
then setting all trips attributes in it. The trips attribute is then
added to the tz->device.groups.

As the removal of all attributes are handled by device core, the device
remove calls are not needed anymore.

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_core.c | 75 +++++++++++++++++++++---------------------
 include/linux/thermal.h        |  2 ++
 2 files changed, 39 insertions(+), 38 deletions(-)

diff --git a/drivers/thermal/thermal_core.c b/drivers/thermal/thermal_core.c
index 13a85d7..e844a04 100644
--- a/drivers/thermal/thermal_core.c
+++ b/drivers/thermal/thermal_core.c
@@ -1184,8 +1184,9 @@ static const struct attribute_group *thermal_zone_attribute_groups[] = {
  */
 static int create_trip_attrs(struct thermal_zone_device *tz, int mask)
 {
-	int indx;
 	int size = sizeof(struct thermal_attr) * tz->trips;
+	struct attribute **attrs;
+	int indx;
 
 	tz->trip_type_attrs = kzalloc(size, GFP_KERNEL);
 	if (!tz->trip_type_attrs)
@@ -1206,6 +1207,14 @@ static int create_trip_attrs(struct thermal_zone_device *tz, int mask)
 		}
 	}
 
+	attrs = kzalloc(sizeof(*attrs) * tz->trips * 3, GFP_KERNEL);
+	if (!attrs) {
+		kfree(tz->trip_type_attrs);
+		kfree(tz->trip_temp_attrs);
+		if (tz->ops->get_trip_hyst)
+			kfree(tz->trip_hyst_attrs);
+		return -ENOMEM;
+	}
 
 	for (indx = 0; indx < tz->trips; indx++) {
 		/* create trip type attribute */
@@ -1217,9 +1226,7 @@ static int create_trip_attrs(struct thermal_zone_device *tz, int mask)
 						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;
-
-		device_create_file(&tz->device,
-				   &tz->trip_type_attrs[indx].attr);
+		attrs[indx] = &tz->trip_type_attrs[indx].attr.attr;
 
 		/* create trip temp attribute */
 		snprintf(tz->trip_temp_attrs[indx].name, THERMAL_NAME_LENGTH,
@@ -1236,9 +1243,7 @@ static int create_trip_attrs(struct thermal_zone_device *tz, int mask)
 			tz->trip_temp_attrs[indx].attr.store =
 							trip_point_temp_store;
 		}
-
-		device_create_file(&tz->device,
-				   &tz->trip_temp_attrs[indx].attr);
+		attrs[indx + tz->trips] = &tz->trip_type_attrs[indx].attr.attr;
 
 		/* create Optional trip hyst attribute */
 		if (!tz->ops->get_trip_hyst)
@@ -1256,45 +1261,37 @@ static int create_trip_attrs(struct thermal_zone_device *tz, int mask)
 			tz->trip_hyst_attrs[indx].attr.store =
 					trip_point_hyst_store;
 		}
-
-		device_create_file(&tz->device,
-				   &tz->trip_hyst_attrs[indx].attr);
+		attrs[indx + tz->trips * 2] =
+					&tz->trip_type_attrs[indx].attr.attr;
 	}
-	return 0;
-}
 
-static void remove_trip_attrs(struct thermal_zone_device *tz)
-{
-	int indx;
+	tz->trips_attribute_group.attrs = attrs;
 
-	for (indx = 0; indx < tz->trips; indx++) {
-		device_remove_file(&tz->device,
-				   &tz->trip_type_attrs[indx].attr);
-		device_remove_file(&tz->device,
-				   &tz->trip_temp_attrs[indx].attr);
-		if (tz->ops->get_trip_hyst)
-			device_remove_file(&tz->device,
-				  &tz->trip_hyst_attrs[indx].attr);
-	}
-	kfree(tz->trip_type_attrs);
-	kfree(tz->trip_temp_attrs);
-	kfree(tz->trip_hyst_attrs);
+	return 0;
 }
 
-static int thermal_zone_create_device_groups(struct thermal_zone_device *tz)
+static int thermal_zone_create_device_groups(struct thermal_zone_device *tz,
+					     int mask)
 {
 	const struct attribute_group **groups;
-	int i, size;
+	int i, size, result;
+
+	result = create_trip_attrs(tz, mask);
+	if (result)
+		return result;
 
-	size = ARRAY_SIZE(thermal_zone_attribute_groups) + 1;
+	/* we need one extra for trips and the NULL to terminate the array */
+	size = ARRAY_SIZE(thermal_zone_attribute_groups) + 2;
 	/* This also takes care of API requirement to be NULL terminated */
 	groups = kzalloc(size * sizeof(*groups), GFP_KERNEL);
 	if (!groups)
 		return -ENOMEM;
 
-	for (i = 0; i < size - 1; i++)
+	for (i = 0; i < size - 2; i++)
 		groups[i] = thermal_zone_attribute_groups[i];
 
+	groups[size - 2] = &tz->trips_attribute_group;
+
 	tz->device.groups = groups;
 
 	return 0;
@@ -1931,8 +1928,12 @@ struct thermal_zone_device *thermal_zone_device_register(const char *type,
 	tz->passive_delay = passive_delay;
 	tz->polling_delay = polling_delay;
 
+	/* sys I/F */
 	/* Add nodes that are always present via .groups */
-	thermal_zone_create_device_groups(tz);
+	result = thermal_zone_create_device_groups(tz, mask);
+	if (result)
+		goto unregister;
+
 	/* A new thermal zone needs to be updated anyway. */
 	atomic_set(&tz->need_update, 1);
 
@@ -1944,11 +1945,6 @@ struct thermal_zone_device *thermal_zone_device_register(const char *type,
 		return ERR_PTR(result);
 	}
 
-	/* sys I/F */
-	result = create_trip_attrs(tz, mask);
-	if (result)
-		goto unregister;
-
 	for (count = 0; count < trips; count++) {
 		if (tz->ops->get_trip_type(tz, count, &trip_type))
 			set_bit(count, &tz->trips_disabled);
@@ -2053,7 +2049,10 @@ void thermal_zone_device_unregister(struct thermal_zone_device *tz)
 
 	thermal_zone_device_set_polling(tz, 0);
 
-	remove_trip_attrs(tz);
+	kfree(tz->trip_type_attrs);
+	kfree(tz->trip_temp_attrs);
+	kfree(tz->trip_hyst_attrs);
+	kfree(tz->trips_attribute_group.attrs);
 	thermal_set_governor(tz, NULL);
 
 	thermal_remove_hwmon_sysfs(tz);
diff --git a/include/linux/thermal.h b/include/linux/thermal.h
index 97b86c5..17c4431 100644
--- a/include/linux/thermal.h
+++ b/include/linux/thermal.h
@@ -28,6 +28,7 @@
 #include <linux/of.h>
 #include <linux/idr.h>
 #include <linux/device.h>
+#include <linux/sysfs.h>
 #include <linux/workqueue.h>
 #include <uapi/linux/thermal.h>
 
@@ -187,6 +188,7 @@ struct thermal_zone_device {
 	int id;
 	char type[THERMAL_NAME_LENGTH];
 	struct device device;
+	struct attribute_group trips_attribute_group;
 	struct thermal_attr *trip_temp_attrs;
 	struct thermal_attr *trip_type_attrs;
 	struct thermal_attr *trip_hyst_attrs;
-- 
2.1.4

Back to linux.kernel | Previous | Next — Previous in thread | Find similar | Unroll thread


Thread

[RFC PATCH 00/11] thermal: sysfs rework Eduardo Valentin <edubezval@gmail.com> - 2016-04-24 01:40 +0200
  [RFC PATCH 10/11] thermal: create tz->device.groups dynamically Eduardo Valentin <edubezval@gmail.com> - 2016-04-24 01:40 +0200
  [RFC PATCH 07/11] thermal: move passive attr to tz->device.groups Eduardo Valentin <edubezval@gmail.com> - 2016-04-24 01:40 +0200
  [RFC PATCH 04/11] thermal: use dev.groups to manage always present tz attributes Eduardo Valentin <edubezval@gmail.com> - 2016-04-24 01:40 +0200
  [RFC PATCH 01/11] thermal: prevent zones with no types to be registered Eduardo Valentin <edubezval@gmail.com> - 2016-04-24 01:40 +0200
  [RFC PATCH 11/11] thermal: move trips attributes to tz->device.groups Eduardo Valentin <edubezval@gmail.com> - 2016-04-24 01:40 +0200

csiph-web