Allocating the sysfs attribute name only if needed and only with the
required minimum length looks optimal, but does not take the additional
overhead for both devm_ data structures and the allocation header itself
into account. This also results in unnecessary memory fragmentation.
Move the sysfs name string into struct hwmon_device_attribute and give it
a sufficient length to reduce this overhead.

Signed-off-by: Guenter Roeck <[email protected]>
---
 drivers/hwmon/hwmon.c | 17 +++++++++--------
 1 file changed, 9 insertions(+), 8 deletions(-)

diff --git a/drivers/hwmon/hwmon.c b/drivers/hwmon/hwmon.c
index 58c328f4508d..3932f9276c07 100644
--- a/drivers/hwmon/hwmon.c
+++ b/drivers/hwmon/hwmon.c
@@ -38,12 +38,15 @@ struct hwmon_device {
 
 #define to_hwmon_device(d) container_of(d, struct hwmon_device, dev)
 
+#define MAX_SYSFS_ATTR_NAME_LENGTH     32
+
 struct hwmon_device_attribute {
        struct device_attribute dev_attr;
        const struct hwmon_ops *ops;
        enum hwmon_sensor_types type;
        u32 attr;
        int index;
+       char name[MAX_SYSFS_ATTR_NAME_LENGTH];
 };
 
 #define to_hwmon_attr(d) \
@@ -261,20 +264,18 @@ static struct attribute *hwmon_genattr(struct device *dev,
        if ((mode & S_IWUGO) && !ops->write)
                return ERR_PTR(-EINVAL);
 
+       hattr = devm_kzalloc(dev, sizeof(*hattr), GFP_KERNEL);
+       if (!hattr)
+               return ERR_PTR(-ENOMEM);
+
        if (type == hwmon_chip) {
                name = (char *)template;
        } else {
-               name = devm_kzalloc(dev, strlen(template) + 16, GFP_KERNEL);
-               if (!name)
-                       return ERR_PTR(-ENOMEM);
-               scnprintf(name, strlen(template) + 16, template,
+               scnprintf(hattr->name, sizeof(hattr->name), template,
                          index + hwmon_attr_base(type));
+               name = hattr->name;
        }
 
-       hattr = devm_kzalloc(dev, sizeof(*hattr), GFP_KERNEL);
-       if (!hattr)
-               return ERR_PTR(-ENOMEM);
-
        hattr->type = type;
        hattr->attr = attr;
        hattr->index = index;
-- 
2.5.0

--
To unsubscribe from this list: send the line "unsubscribe linux-hwmon" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to