| From 3a412d5e4a1c831723d0aaf305f1cf9a78ad9c90 Mon Sep 17 00:00:00 2001 |
| From: Guenter Roeck <linux@roeck-us.net> |
| Date: Sun, 16 Oct 2016 10:52:04 -0700 |
| Subject: hwmon: (core) Simplify sysfs attribute name allocation |
| |
| From: Guenter Roeck <linux@roeck-us.net> |
| |
| 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 | 17 +++++++++-------- |
| 1 file changed, 9 insertions(+), 8 deletions(-) |
| |
| --- 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) \ |
| @@ -232,20 +235,18 @@ static struct attribute *hwmon_genattr(s |
| 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; |