hwmon: (core) Simplify sysfs attribute name allocation
authorGuenter Roeck <linux@roeck-us.net>
Sun, 16 Oct 2016 17:52:04 +0000 (10:52 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 29 Jan 2020 09:24:37 +0000 (10:24 +0100)
commit 3a412d5e4a1c831723d0aaf305f1cf9a78ad9c90 upstream.

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>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/hwmon/hwmon.c

index a74c075..5d30a77 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) \
@@ -232,20 +235,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;