]> git.karo-electronics.de Git - linux-beck.git/commitdiff
hwmon: (core) Simplify sysfs attribute name allocation
authorGuenter Roeck <linux@roeck-us.net>
Sun, 16 Oct 2016 17:52:04 +0000 (10:52 -0700)
committerGuenter Roeck <linux@roeck-us.net>
Sat, 10 Dec 2016 05:54:24 +0000 (21:54 -0800)
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 <linux@roeck-us.net>
drivers/hwmon/hwmon.c

index 58c328f4508d75430a98ad67352de32103bb02d3..3932f9276c074d92b7028b32c29e36c6a5aa9738 100644 (file)
@@ -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;