dmi-id: Use dynamic sysfs attributes
We can use sysfs attributes with an extra parameter for dmi id attributes. This makes it possible to use the same callback function for all attributes, reducing the binary size significantly (-18% on x86_64.) Signed-off-by: Jean Delvare <khali@linux-fr.org> Acked-by: Lennart Poettering <mzxreary@0pointer.de> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
parent
990e53f880
commit
6374475661
|
@ -13,21 +13,35 @@
|
||||||
#include <linux/device.h>
|
#include <linux/device.h>
|
||||||
#include <linux/autoconf.h>
|
#include <linux/autoconf.h>
|
||||||
|
|
||||||
|
struct dmi_device_attribute{
|
||||||
|
struct device_attribute dev_attr;
|
||||||
|
int field;
|
||||||
|
};
|
||||||
|
#define to_dmi_dev_attr(_dev_attr) \
|
||||||
|
container_of(_dev_attr, struct dmi_device_attribute, dev_attr)
|
||||||
|
|
||||||
#define DEFINE_DMI_ATTR(_name, _mode, _show) \
|
#define DEFINE_DMI_ATTR(_name, _mode, _show) \
|
||||||
static struct device_attribute sys_dmi_##_name##_attr = \
|
static struct device_attribute sys_dmi_##_name##_attr = \
|
||||||
__ATTR(_name, _mode, _show, NULL);
|
__ATTR(_name, _mode, _show, NULL);
|
||||||
|
|
||||||
#define DEFINE_DMI_ATTR_WITH_SHOW(_name, _mode, _field) \
|
static ssize_t sys_dmi_field_show(struct device *dev,
|
||||||
static ssize_t sys_dmi_##_name##_show(struct device *dev, \
|
struct device_attribute *attr,
|
||||||
struct device_attribute *attr, \
|
char *page)
|
||||||
char *page) \
|
{
|
||||||
{ \
|
int field = to_dmi_dev_attr(attr)->field;
|
||||||
ssize_t len; \
|
ssize_t len;
|
||||||
len = scnprintf(page, PAGE_SIZE, "%s\n", dmi_get_system_info(_field)); \
|
len = scnprintf(page, PAGE_SIZE, "%s\n", dmi_get_system_info(field));
|
||||||
page[len-1] = '\n'; \
|
page[len-1] = '\n';
|
||||||
return len; \
|
return len;
|
||||||
} \
|
}
|
||||||
DEFINE_DMI_ATTR(_name, _mode, sys_dmi_##_name##_show);
|
|
||||||
|
#define DMI_ATTR(_name, _mode, _show, _field) \
|
||||||
|
{ .dev_attr = __ATTR(_name, _mode, _show, NULL), \
|
||||||
|
.field = _field }
|
||||||
|
|
||||||
|
#define DEFINE_DMI_ATTR_WITH_SHOW(_name, _mode, _field) \
|
||||||
|
static struct dmi_device_attribute sys_dmi_##_name##_attr = \
|
||||||
|
DMI_ATTR(_name, _mode, sys_dmi_field_show, _field);
|
||||||
|
|
||||||
DEFINE_DMI_ATTR_WITH_SHOW(bios_vendor, 0444, DMI_BIOS_VENDOR);
|
DEFINE_DMI_ATTR_WITH_SHOW(bios_vendor, 0444, DMI_BIOS_VENDOR);
|
||||||
DEFINE_DMI_ATTR_WITH_SHOW(bios_version, 0444, DMI_BIOS_VERSION);
|
DEFINE_DMI_ATTR_WITH_SHOW(bios_version, 0444, DMI_BIOS_VERSION);
|
||||||
|
@ -160,7 +174,7 @@ static struct device *dmi_dev;
|
||||||
|
|
||||||
#define ADD_DMI_ATTR(_name, _field) \
|
#define ADD_DMI_ATTR(_name, _field) \
|
||||||
if (dmi_get_system_info(_field)) \
|
if (dmi_get_system_info(_field)) \
|
||||||
sys_dmi_attributes[i++] = & sys_dmi_##_name##_attr.attr;
|
sys_dmi_attributes[i++] = &sys_dmi_##_name##_attr.dev_attr.attr;
|
||||||
|
|
||||||
extern int dmi_available;
|
extern int dmi_available;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue