aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/base/node.c
diff options
context:
space:
mode:
authorKay Sievers <kay.sievers@vrfy.org>2011-12-21 17:48:43 -0500
committerGreg Kroah-Hartman <gregkh@suse.de>2011-12-21 17:48:43 -0500
commit10fbcf4c6cb122005cdf36fc24d7683da92c7a27 (patch)
tree1a2ad572b421d576e14dbf006ecb321a53063f0c /drivers/base/node.c
parent8a25a2fd126c621f44f3aeaef80d51f00fc11639 (diff)
convert 'memory' sysdev_class to a regular subsystem
This moves the 'memory sysdev_class' over to a regular 'memory' subsystem and converts the devices to regular devices. The sysdev drivers are implemented as subsystem interfaces now. After all sysdev classes are ported to regular driver core entities, the sysdev implementation will be entirely removed from the kernel. Signed-off-by: Kay Sievers <kay.sievers@vrfy.org> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/base/node.c')
-rw-r--r--drivers/base/node.c146
1 files changed, 76 insertions, 70 deletions
diff --git a/drivers/base/node.c b/drivers/base/node.c
index 6ce1501c7de5..996d2189689b 100644
--- a/drivers/base/node.c
+++ b/drivers/base/node.c
@@ -1,8 +1,7 @@
1/* 1/*
2 * drivers/base/node.c - basic Node class support 2 * Basic Node interface support
3 */ 3 */
4 4
5#include <linux/sysdev.h>
6#include <linux/module.h> 5#include <linux/module.h>
7#include <linux/init.h> 6#include <linux/init.h>
8#include <linux/mm.h> 7#include <linux/mm.h>
@@ -19,18 +18,16 @@
19#include <linux/swap.h> 18#include <linux/swap.h>
20#include <linux/slab.h> 19#include <linux/slab.h>
21 20
22static struct sysdev_class_attribute *node_state_attrs[]; 21static struct bus_type node_subsys = {
23
24static struct sysdev_class node_class = {
25 .name = "node", 22 .name = "node",
26 .attrs = node_state_attrs, 23 .dev_name = "node",
27}; 24};
28 25
29 26
30static ssize_t node_read_cpumap(struct sys_device *dev, int type, char *buf) 27static ssize_t node_read_cpumap(struct device *dev, int type, char *buf)
31{ 28{
32 struct node *node_dev = to_node(dev); 29 struct node *node_dev = to_node(dev);
33 const struct cpumask *mask = cpumask_of_node(node_dev->sysdev.id); 30 const struct cpumask *mask = cpumask_of_node(node_dev->dev.id);
34 int len; 31 int len;
35 32
36 /* 2008/04/07: buf currently PAGE_SIZE, need 9 chars per 32 bits. */ 33 /* 2008/04/07: buf currently PAGE_SIZE, need 9 chars per 32 bits. */
@@ -44,23 +41,23 @@ static ssize_t node_read_cpumap(struct sys_device *dev, int type, char *buf)
44 return len; 41 return len;
45} 42}
46 43
47static inline ssize_t node_read_cpumask(struct sys_device *dev, 44static inline ssize_t node_read_cpumask(struct device *dev,
48 struct sysdev_attribute *attr, char *buf) 45 struct device_attribute *attr, char *buf)
49{ 46{
50 return node_read_cpumap(dev, 0, buf); 47 return node_read_cpumap(dev, 0, buf);
51} 48}
52static inline ssize_t node_read_cpulist(struct sys_device *dev, 49static inline ssize_t node_read_cpulist(struct device *dev,
53 struct sysdev_attribute *attr, char *buf) 50 struct device_attribute *attr, char *buf)
54{ 51{
55 return node_read_cpumap(dev, 1, buf); 52 return node_read_cpumap(dev, 1, buf);
56} 53}
57 54
58static SYSDEV_ATTR(cpumap, S_IRUGO, node_read_cpumask, NULL); 55static DEVICE_ATTR(cpumap, S_IRUGO, node_read_cpumask, NULL);
59static SYSDEV_ATTR(cpulist, S_IRUGO, node_read_cpulist, NULL); 56static DEVICE_ATTR(cpulist, S_IRUGO, node_read_cpulist, NULL);
60 57
61#define K(x) ((x) << (PAGE_SHIFT - 10)) 58#define K(x) ((x) << (PAGE_SHIFT - 10))
62static ssize_t node_read_meminfo(struct sys_device * dev, 59static ssize_t node_read_meminfo(struct device *dev,
63 struct sysdev_attribute *attr, char * buf) 60 struct device_attribute *attr, char *buf)
64{ 61{
65 int n; 62 int n;
66 int nid = dev->id; 63 int nid = dev->id;
@@ -155,10 +152,10 @@ static ssize_t node_read_meminfo(struct sys_device * dev,
155} 152}
156 153
157#undef K 154#undef K
158static SYSDEV_ATTR(meminfo, S_IRUGO, node_read_meminfo, NULL); 155static DEVICE_ATTR(meminfo, S_IRUGO, node_read_meminfo, NULL);
159 156
160static ssize_t node_read_numastat(struct sys_device * dev, 157static ssize_t node_read_numastat(struct device *dev,
161 struct sysdev_attribute *attr, char * buf) 158 struct device_attribute *attr, char *buf)
162{ 159{
163 return sprintf(buf, 160 return sprintf(buf,
164 "numa_hit %lu\n" 161 "numa_hit %lu\n"
@@ -174,10 +171,10 @@ static ssize_t node_read_numastat(struct sys_device * dev,
174 node_page_state(dev->id, NUMA_LOCAL), 171 node_page_state(dev->id, NUMA_LOCAL),
175 node_page_state(dev->id, NUMA_OTHER)); 172 node_page_state(dev->id, NUMA_OTHER));
176} 173}
177static SYSDEV_ATTR(numastat, S_IRUGO, node_read_numastat, NULL); 174static DEVICE_ATTR(numastat, S_IRUGO, node_read_numastat, NULL);
178 175
179static ssize_t node_read_vmstat(struct sys_device *dev, 176static ssize_t node_read_vmstat(struct device *dev,
180 struct sysdev_attribute *attr, char *buf) 177 struct device_attribute *attr, char *buf)
181{ 178{
182 int nid = dev->id; 179 int nid = dev->id;
183 int i; 180 int i;
@@ -189,10 +186,10 @@ static ssize_t node_read_vmstat(struct sys_device *dev,
189 186
190 return n; 187 return n;
191} 188}
192static SYSDEV_ATTR(vmstat, S_IRUGO, node_read_vmstat, NULL); 189static DEVICE_ATTR(vmstat, S_IRUGO, node_read_vmstat, NULL);
193 190
194static ssize_t node_read_distance(struct sys_device * dev, 191static ssize_t node_read_distance(struct device *dev,
195 struct sysdev_attribute *attr, char * buf) 192 struct device_attribute *attr, char * buf)
196{ 193{
197 int nid = dev->id; 194 int nid = dev->id;
198 int len = 0; 195 int len = 0;
@@ -210,7 +207,7 @@ static ssize_t node_read_distance(struct sys_device * dev,
210 len += sprintf(buf + len, "\n"); 207 len += sprintf(buf + len, "\n");
211 return len; 208 return len;
212} 209}
213static SYSDEV_ATTR(distance, S_IRUGO, node_read_distance, NULL); 210static DEVICE_ATTR(distance, S_IRUGO, node_read_distance, NULL);
214 211
215#ifdef CONFIG_HUGETLBFS 212#ifdef CONFIG_HUGETLBFS
216/* 213/*
@@ -228,7 +225,7 @@ static node_registration_func_t __hugetlb_unregister_node;
228static inline bool hugetlb_register_node(struct node *node) 225static inline bool hugetlb_register_node(struct node *node)
229{ 226{
230 if (__hugetlb_register_node && 227 if (__hugetlb_register_node &&
231 node_state(node->sysdev.id, N_HIGH_MEMORY)) { 228 node_state(node->dev.id, N_HIGH_MEMORY)) {
232 __hugetlb_register_node(node); 229 __hugetlb_register_node(node);
233 return true; 230 return true;
234 } 231 }
@@ -264,17 +261,17 @@ int register_node(struct node *node, int num, struct node *parent)
264{ 261{
265 int error; 262 int error;
266 263
267 node->sysdev.id = num; 264 node->dev.id = num;
268 node->sysdev.cls = &node_class; 265 node->dev.bus = &node_subsys;
269 error = sysdev_register(&node->sysdev); 266 error = device_register(&node->dev);
270 267
271 if (!error){ 268 if (!error){
272 sysdev_create_file(&node->sysdev, &attr_cpumap); 269 device_create_file(&node->dev, &dev_attr_cpumap);
273 sysdev_create_file(&node->sysdev, &attr_cpulist); 270 device_create_file(&node->dev, &dev_attr_cpulist);
274 sysdev_create_file(&node->sysdev, &attr_meminfo); 271 device_create_file(&node->dev, &dev_attr_meminfo);
275 sysdev_create_file(&node->sysdev, &attr_numastat); 272 device_create_file(&node->dev, &dev_attr_numastat);
276 sysdev_create_file(&node->sysdev, &attr_distance); 273 device_create_file(&node->dev, &dev_attr_distance);
277 sysdev_create_file(&node->sysdev, &attr_vmstat); 274 device_create_file(&node->dev, &dev_attr_vmstat);
278 275
279 scan_unevictable_register_node(node); 276 scan_unevictable_register_node(node);
280 277
@@ -294,17 +291,17 @@ int register_node(struct node *node, int num, struct node *parent)
294 */ 291 */
295void unregister_node(struct node *node) 292void unregister_node(struct node *node)
296{ 293{
297 sysdev_remove_file(&node->sysdev, &attr_cpumap); 294 device_remove_file(&node->dev, &dev_attr_cpumap);
298 sysdev_remove_file(&node->sysdev, &attr_cpulist); 295 device_remove_file(&node->dev, &dev_attr_cpulist);
299 sysdev_remove_file(&node->sysdev, &attr_meminfo); 296 device_remove_file(&node->dev, &dev_attr_meminfo);
300 sysdev_remove_file(&node->sysdev, &attr_numastat); 297 device_remove_file(&node->dev, &dev_attr_numastat);
301 sysdev_remove_file(&node->sysdev, &attr_distance); 298 device_remove_file(&node->dev, &dev_attr_distance);
302 sysdev_remove_file(&node->sysdev, &attr_vmstat); 299 device_remove_file(&node->dev, &dev_attr_vmstat);
303 300
304 scan_unevictable_unregister_node(node); 301 scan_unevictable_unregister_node(node);
305 hugetlb_unregister_node(node); /* no-op, if memoryless node */ 302 hugetlb_unregister_node(node); /* no-op, if memoryless node */
306 303
307 sysdev_unregister(&node->sysdev); 304 device_unregister(&node->dev);
308} 305}
309 306
310struct node node_devices[MAX_NUMNODES]; 307struct node node_devices[MAX_NUMNODES];
@@ -324,15 +321,15 @@ int register_cpu_under_node(unsigned int cpu, unsigned int nid)
324 if (!obj) 321 if (!obj)
325 return 0; 322 return 0;
326 323
327 ret = sysfs_create_link(&node_devices[nid].sysdev.kobj, 324 ret = sysfs_create_link(&node_devices[nid].dev.kobj,
328 &obj->kobj, 325 &obj->kobj,
329 kobject_name(&obj->kobj)); 326 kobject_name(&obj->kobj));
330 if (ret) 327 if (ret)
331 return ret; 328 return ret;
332 329
333 return sysfs_create_link(&obj->kobj, 330 return sysfs_create_link(&obj->kobj,
334 &node_devices[nid].sysdev.kobj, 331 &node_devices[nid].dev.kobj,
335 kobject_name(&node_devices[nid].sysdev.kobj)); 332 kobject_name(&node_devices[nid].dev.kobj));
336} 333}
337 334
338int unregister_cpu_under_node(unsigned int cpu, unsigned int nid) 335int unregister_cpu_under_node(unsigned int cpu, unsigned int nid)
@@ -346,10 +343,10 @@ int unregister_cpu_under_node(unsigned int cpu, unsigned int nid)
346 if (!obj) 343 if (!obj)
347 return 0; 344 return 0;
348 345
349 sysfs_remove_link(&node_devices[nid].sysdev.kobj, 346 sysfs_remove_link(&node_devices[nid].dev.kobj,
350 kobject_name(&obj->kobj)); 347 kobject_name(&obj->kobj));
351 sysfs_remove_link(&obj->kobj, 348 sysfs_remove_link(&obj->kobj,
352 kobject_name(&node_devices[nid].sysdev.kobj)); 349 kobject_name(&node_devices[nid].dev.kobj));
353 350
354 return 0; 351 return 0;
355} 352}
@@ -391,15 +388,15 @@ int register_mem_sect_under_node(struct memory_block *mem_blk, int nid)
391 continue; 388 continue;
392 if (page_nid != nid) 389 if (page_nid != nid)
393 continue; 390 continue;
394 ret = sysfs_create_link_nowarn(&node_devices[nid].sysdev.kobj, 391 ret = sysfs_create_link_nowarn(&node_devices[nid].dev.kobj,
395 &mem_blk->sysdev.kobj, 392 &mem_blk->dev.kobj,
396 kobject_name(&mem_blk->sysdev.kobj)); 393 kobject_name(&mem_blk->dev.kobj));
397 if (ret) 394 if (ret)
398 return ret; 395 return ret;
399 396
400 return sysfs_create_link_nowarn(&mem_blk->sysdev.kobj, 397 return sysfs_create_link_nowarn(&mem_blk->dev.kobj,
401 &node_devices[nid].sysdev.kobj, 398 &node_devices[nid].dev.kobj,
402 kobject_name(&node_devices[nid].sysdev.kobj)); 399 kobject_name(&node_devices[nid].dev.kobj));
403 } 400 }
404 /* mem section does not span the specified node */ 401 /* mem section does not span the specified node */
405 return 0; 402 return 0;
@@ -432,10 +429,10 @@ int unregister_mem_sect_under_nodes(struct memory_block *mem_blk,
432 continue; 429 continue;
433 if (node_test_and_set(nid, *unlinked_nodes)) 430 if (node_test_and_set(nid, *unlinked_nodes))
434 continue; 431 continue;
435 sysfs_remove_link(&node_devices[nid].sysdev.kobj, 432 sysfs_remove_link(&node_devices[nid].dev.kobj,
436 kobject_name(&mem_blk->sysdev.kobj)); 433 kobject_name(&mem_blk->dev.kobj));
437 sysfs_remove_link(&mem_blk->sysdev.kobj, 434 sysfs_remove_link(&mem_blk->dev.kobj,
438 kobject_name(&node_devices[nid].sysdev.kobj)); 435 kobject_name(&node_devices[nid].dev.kobj));
439 } 436 }
440 NODEMASK_FREE(unlinked_nodes); 437 NODEMASK_FREE(unlinked_nodes);
441 return 0; 438 return 0;
@@ -466,7 +463,7 @@ static int link_mem_sections(int nid)
466 } 463 }
467 464
468 if (mem_blk) 465 if (mem_blk)
469 kobject_put(&mem_blk->sysdev.kobj); 466 kobject_put(&mem_blk->dev.kobj);
470 return err; 467 return err;
471} 468}
472 469
@@ -594,19 +591,19 @@ static ssize_t print_nodes_state(enum node_states state, char *buf)
594} 591}
595 592
596struct node_attr { 593struct node_attr {
597 struct sysdev_class_attribute attr; 594 struct device_attribute attr;
598 enum node_states state; 595 enum node_states state;
599}; 596};
600 597
601static ssize_t show_node_state(struct sysdev_class *class, 598static ssize_t show_node_state(struct device *dev,
602 struct sysdev_class_attribute *attr, char *buf) 599 struct device_attribute *attr, char *buf)
603{ 600{
604 struct node_attr *na = container_of(attr, struct node_attr, attr); 601 struct node_attr *na = container_of(attr, struct node_attr, attr);
605 return print_nodes_state(na->state, buf); 602 return print_nodes_state(na->state, buf);
606} 603}
607 604
608#define _NODE_ATTR(name, state) \ 605#define _NODE_ATTR(name, state) \
609 { _SYSDEV_CLASS_ATTR(name, 0444, show_node_state, NULL), state } 606 { __ATTR(name, 0444, show_node_state, NULL), state }
610 607
611static struct node_attr node_state_attr[] = { 608static struct node_attr node_state_attr[] = {
612 _NODE_ATTR(possible, N_POSSIBLE), 609 _NODE_ATTR(possible, N_POSSIBLE),
@@ -618,17 +615,26 @@ static struct node_attr node_state_attr[] = {
618#endif 615#endif
619}; 616};
620 617
621static struct sysdev_class_attribute *node_state_attrs[] = { 618static struct attribute *node_state_attrs[] = {
622 &node_state_attr[0].attr, 619 &node_state_attr[0].attr.attr,
623 &node_state_attr[1].attr, 620 &node_state_attr[1].attr.attr,
624 &node_state_attr[2].attr, 621 &node_state_attr[2].attr.attr,
625 &node_state_attr[3].attr, 622 &node_state_attr[3].attr.attr,
626#ifdef CONFIG_HIGHMEM 623#ifdef CONFIG_HIGHMEM
627 &node_state_attr[4].attr, 624 &node_state_attr[4].attr.attr,
628#endif 625#endif
629 NULL 626 NULL
630}; 627};
631 628
629static struct attribute_group memory_root_attr_group = {
630 .attrs = node_state_attrs,
631};
632
633static const struct attribute_group *cpu_root_attr_groups[] = {
634 &memory_root_attr_group,
635 NULL,
636};
637
632#define NODE_CALLBACK_PRI 2 /* lower than SLAB */ 638#define NODE_CALLBACK_PRI 2 /* lower than SLAB */
633static int __init register_node_type(void) 639static int __init register_node_type(void)
634{ 640{
@@ -637,7 +643,7 @@ static int __init register_node_type(void)
637 BUILD_BUG_ON(ARRAY_SIZE(node_state_attr) != NR_NODE_STATES); 643 BUILD_BUG_ON(ARRAY_SIZE(node_state_attr) != NR_NODE_STATES);
638 BUILD_BUG_ON(ARRAY_SIZE(node_state_attrs)-1 != NR_NODE_STATES); 644 BUILD_BUG_ON(ARRAY_SIZE(node_state_attrs)-1 != NR_NODE_STATES);
639 645
640 ret = sysdev_class_register(&node_class); 646 ret = subsys_system_register(&node_subsys, cpu_root_attr_groups);
641 if (!ret) { 647 if (!ret) {
642 hotplug_memory_notifier(node_memory_callback, 648 hotplug_memory_notifier(node_memory_callback,
643 NODE_CALLBACK_PRI); 649 NODE_CALLBACK_PRI);