From 3c9b8aaf95bb4de3d8ac9fd83d4aca2c97bd9f2a Mon Sep 17 00:00:00 2001 From: Takashi Iwai Date: Thu, 29 Jan 2015 12:29:22 +0100 Subject: [PATCH] drivers/base/node: Avoid manual device_create_file() calls Instead of manual calls of multiple device_create_file() and device_remove_file(), use the static attribute groups assigned to the new device. This also fixes the possible races, too. Signed-off-by: Takashi Iwai Signed-off-by: Greg Kroah-Hartman --- drivers/base/node.c | 34 ++++++++++++++++++++-------------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/drivers/base/node.c b/drivers/base/node.c index 36fabe43cd44..06dce51e42e7 100644 --- a/drivers/base/node.c +++ b/drivers/base/node.c @@ -200,6 +200,25 @@ static ssize_t node_read_distance(struct device *dev, } static DEVICE_ATTR(distance, S_IRUGO, node_read_distance, NULL); +static struct attribute *node_dev_attrs[] = { + &dev_attr_cpumap.attr, + &dev_attr_cpulist.attr, + &dev_attr_meminfo.attr, + &dev_attr_numastat.attr, + &dev_attr_distance.attr, + &dev_attr_vmstat.attr, + NULL +}; + +static struct attribute_group node_dev_attr_group = { + .attrs = node_dev_attrs, +}; + +static const struct attribute_group *node_dev_attr_groups[] = { + &node_dev_attr_group, + NULL +}; + #ifdef CONFIG_HUGETLBFS /* * hugetlbfs per node attributes registration interface: @@ -273,16 +292,10 @@ static int register_node(struct node *node, int num, struct node *parent) node->dev.id = num; node->dev.bus = &node_subsys; node->dev.release = node_device_release; + node->dev.groups = node_dev_attr_groups; error = device_register(&node->dev); if (!error){ - device_create_file(&node->dev, &dev_attr_cpumap); - device_create_file(&node->dev, &dev_attr_cpulist); - device_create_file(&node->dev, &dev_attr_meminfo); - device_create_file(&node->dev, &dev_attr_numastat); - device_create_file(&node->dev, &dev_attr_distance); - device_create_file(&node->dev, &dev_attr_vmstat); - hugetlb_register_node(node); compaction_register_node(node); @@ -299,13 +312,6 @@ static int register_node(struct node *node, int num, struct node *parent) */ void unregister_node(struct node *node) { - device_remove_file(&node->dev, &dev_attr_cpumap); - device_remove_file(&node->dev, &dev_attr_cpulist); - device_remove_file(&node->dev, &dev_attr_meminfo); - device_remove_file(&node->dev, &dev_attr_numastat); - device_remove_file(&node->dev, &dev_attr_distance); - device_remove_file(&node->dev, &dev_attr_vmstat); - hugetlb_unregister_node(node); /* no-op, if memoryless node */ device_unregister(&node->dev); -- 2.20.1