1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * Basic Node interface support 4 */ 5 6 #include <linux/module.h> 7 #include <linux/init.h> 8 #include <linux/mm.h> 9 #include <linux/memory.h> 10 #include <linux/vmstat.h> 11 #include <linux/notifier.h> 12 #include <linux/node.h> 13 #include <linux/hugetlb.h> 14 #include <linux/compaction.h> 15 #include <linux/cpumask.h> 16 #include <linux/topology.h> 17 #include <linux/nodemask.h> 18 #include <linux/cpu.h> 19 #include <linux/device.h> 20 #include <linux/swap.h> 21 #include <linux/slab.h> 22 23 static struct bus_type node_subsys = { 24 .name = "node", 25 .dev_name = "node", 26 }; 27 28 29 static ssize_t node_read_cpumap(struct device *dev, bool list, char *buf) 30 { 31 ssize_t n; 32 cpumask_var_t mask; 33 struct node *node_dev = to_node(dev); 34 35 /* 2008/04/07: buf currently PAGE_SIZE, need 9 chars per 32 bits. */ 36 BUILD_BUG_ON((NR_CPUS/32 * 9) > (PAGE_SIZE-1)); 37 38 if (!alloc_cpumask_var(&mask, GFP_KERNEL)) 39 return 0; 40 41 cpumask_and(mask, cpumask_of_node(node_dev->dev.id), cpu_online_mask); 42 n = cpumap_print_to_pagebuf(list, buf, mask); 43 free_cpumask_var(mask); 44 45 return n; 46 } 47 48 static inline ssize_t node_read_cpumask(struct device *dev, 49 struct device_attribute *attr, char *buf) 50 { 51 return node_read_cpumap(dev, false, buf); 52 } 53 static inline ssize_t node_read_cpulist(struct device *dev, 54 struct device_attribute *attr, char *buf) 55 { 56 return node_read_cpumap(dev, true, buf); 57 } 58 59 static DEVICE_ATTR(cpumap, S_IRUGO, node_read_cpumask, NULL); 60 static DEVICE_ATTR(cpulist, S_IRUGO, node_read_cpulist, NULL); 61 62 #define K(x) ((x) << (PAGE_SHIFT - 10)) 63 static ssize_t node_read_meminfo(struct device *dev, 64 struct device_attribute *attr, char *buf) 65 { 66 int n; 67 int nid = dev->id; 68 struct pglist_data *pgdat = NODE_DATA(nid); 69 struct sysinfo i; 70 unsigned long sreclaimable, sunreclaimable; 71 72 si_meminfo_node(&i, nid); 73 sreclaimable = node_page_state(pgdat, NR_SLAB_RECLAIMABLE); 74 sunreclaimable = node_page_state(pgdat, NR_SLAB_UNRECLAIMABLE); 75 n = sprintf(buf, 76 "Node %d MemTotal: %8lu kB\n" 77 "Node %d MemFree: %8lu kB\n" 78 "Node %d MemUsed: %8lu kB\n" 79 "Node %d Active: %8lu kB\n" 80 "Node %d Inactive: %8lu kB\n" 81 "Node %d Active(anon): %8lu kB\n" 82 "Node %d Inactive(anon): %8lu kB\n" 83 "Node %d Active(file): %8lu kB\n" 84 "Node %d Inactive(file): %8lu kB\n" 85 "Node %d Unevictable: %8lu kB\n" 86 "Node %d Mlocked: %8lu kB\n", 87 nid, K(i.totalram), 88 nid, K(i.freeram), 89 nid, K(i.totalram - i.freeram), 90 nid, K(node_page_state(pgdat, NR_ACTIVE_ANON) + 91 node_page_state(pgdat, NR_ACTIVE_FILE)), 92 nid, K(node_page_state(pgdat, NR_INACTIVE_ANON) + 93 node_page_state(pgdat, NR_INACTIVE_FILE)), 94 nid, K(node_page_state(pgdat, NR_ACTIVE_ANON)), 95 nid, K(node_page_state(pgdat, NR_INACTIVE_ANON)), 96 nid, K(node_page_state(pgdat, NR_ACTIVE_FILE)), 97 nid, K(node_page_state(pgdat, NR_INACTIVE_FILE)), 98 nid, K(node_page_state(pgdat, NR_UNEVICTABLE)), 99 nid, K(sum_zone_node_page_state(nid, NR_MLOCK))); 100 101 #ifdef CONFIG_HIGHMEM 102 n += sprintf(buf + n, 103 "Node %d HighTotal: %8lu kB\n" 104 "Node %d HighFree: %8lu kB\n" 105 "Node %d LowTotal: %8lu kB\n" 106 "Node %d LowFree: %8lu kB\n", 107 nid, K(i.totalhigh), 108 nid, K(i.freehigh), 109 nid, K(i.totalram - i.totalhigh), 110 nid, K(i.freeram - i.freehigh)); 111 #endif 112 n += sprintf(buf + n, 113 "Node %d Dirty: %8lu kB\n" 114 "Node %d Writeback: %8lu kB\n" 115 "Node %d FilePages: %8lu kB\n" 116 "Node %d Mapped: %8lu kB\n" 117 "Node %d AnonPages: %8lu kB\n" 118 "Node %d Shmem: %8lu kB\n" 119 "Node %d KernelStack: %8lu kB\n" 120 "Node %d PageTables: %8lu kB\n" 121 "Node %d NFS_Unstable: %8lu kB\n" 122 "Node %d Bounce: %8lu kB\n" 123 "Node %d WritebackTmp: %8lu kB\n" 124 "Node %d KReclaimable: %8lu kB\n" 125 "Node %d Slab: %8lu kB\n" 126 "Node %d SReclaimable: %8lu kB\n" 127 "Node %d SUnreclaim: %8lu kB\n" 128 #ifdef CONFIG_TRANSPARENT_HUGEPAGE 129 "Node %d AnonHugePages: %8lu kB\n" 130 "Node %d ShmemHugePages: %8lu kB\n" 131 "Node %d ShmemPmdMapped: %8lu kB\n" 132 #endif 133 , 134 nid, K(node_page_state(pgdat, NR_FILE_DIRTY)), 135 nid, K(node_page_state(pgdat, NR_WRITEBACK)), 136 nid, K(node_page_state(pgdat, NR_FILE_PAGES)), 137 nid, K(node_page_state(pgdat, NR_FILE_MAPPED)), 138 nid, K(node_page_state(pgdat, NR_ANON_MAPPED)), 139 nid, K(i.sharedram), 140 nid, sum_zone_node_page_state(nid, NR_KERNEL_STACK_KB), 141 nid, K(sum_zone_node_page_state(nid, NR_PAGETABLE)), 142 nid, K(node_page_state(pgdat, NR_UNSTABLE_NFS)), 143 nid, K(sum_zone_node_page_state(nid, NR_BOUNCE)), 144 nid, K(node_page_state(pgdat, NR_WRITEBACK_TEMP)), 145 nid, K(sreclaimable + 146 node_page_state(pgdat, NR_KERNEL_MISC_RECLAIMABLE)), 147 nid, K(sreclaimable + sunreclaimable), 148 nid, K(sreclaimable), 149 nid, K(sunreclaimable) 150 #ifdef CONFIG_TRANSPARENT_HUGEPAGE 151 , 152 nid, K(node_page_state(pgdat, NR_ANON_THPS) * 153 HPAGE_PMD_NR), 154 nid, K(node_page_state(pgdat, NR_SHMEM_THPS) * 155 HPAGE_PMD_NR), 156 nid, K(node_page_state(pgdat, NR_SHMEM_PMDMAPPED) * 157 HPAGE_PMD_NR) 158 #endif 159 ); 160 n += hugetlb_report_node_meminfo(nid, buf + n); 161 return n; 162 } 163 164 #undef K 165 static DEVICE_ATTR(meminfo, S_IRUGO, node_read_meminfo, NULL); 166 167 static ssize_t node_read_numastat(struct device *dev, 168 struct device_attribute *attr, char *buf) 169 { 170 return sprintf(buf, 171 "numa_hit %lu\n" 172 "numa_miss %lu\n" 173 "numa_foreign %lu\n" 174 "interleave_hit %lu\n" 175 "local_node %lu\n" 176 "other_node %lu\n", 177 sum_zone_numa_state(dev->id, NUMA_HIT), 178 sum_zone_numa_state(dev->id, NUMA_MISS), 179 sum_zone_numa_state(dev->id, NUMA_FOREIGN), 180 sum_zone_numa_state(dev->id, NUMA_INTERLEAVE_HIT), 181 sum_zone_numa_state(dev->id, NUMA_LOCAL), 182 sum_zone_numa_state(dev->id, NUMA_OTHER)); 183 } 184 static DEVICE_ATTR(numastat, S_IRUGO, node_read_numastat, NULL); 185 186 static ssize_t node_read_vmstat(struct device *dev, 187 struct device_attribute *attr, char *buf) 188 { 189 int nid = dev->id; 190 struct pglist_data *pgdat = NODE_DATA(nid); 191 int i; 192 int n = 0; 193 194 for (i = 0; i < NR_VM_ZONE_STAT_ITEMS; i++) 195 n += sprintf(buf+n, "%s %lu\n", vmstat_text[i], 196 sum_zone_node_page_state(nid, i)); 197 198 #ifdef CONFIG_NUMA 199 for (i = 0; i < NR_VM_NUMA_STAT_ITEMS; i++) 200 n += sprintf(buf+n, "%s %lu\n", 201 vmstat_text[i + NR_VM_ZONE_STAT_ITEMS], 202 sum_zone_numa_state(nid, i)); 203 #endif 204 205 for (i = 0; i < NR_VM_NODE_STAT_ITEMS; i++) 206 n += sprintf(buf+n, "%s %lu\n", 207 vmstat_text[i + NR_VM_ZONE_STAT_ITEMS + 208 NR_VM_NUMA_STAT_ITEMS], 209 node_page_state(pgdat, i)); 210 211 return n; 212 } 213 static DEVICE_ATTR(vmstat, S_IRUGO, node_read_vmstat, NULL); 214 215 static ssize_t node_read_distance(struct device *dev, 216 struct device_attribute *attr, char *buf) 217 { 218 int nid = dev->id; 219 int len = 0; 220 int i; 221 222 /* 223 * buf is currently PAGE_SIZE in length and each node needs 4 chars 224 * at the most (distance + space or newline). 225 */ 226 BUILD_BUG_ON(MAX_NUMNODES * 4 > PAGE_SIZE); 227 228 for_each_online_node(i) 229 len += sprintf(buf + len, "%s%d", i ? " " : "", node_distance(nid, i)); 230 231 len += sprintf(buf + len, "\n"); 232 return len; 233 } 234 static DEVICE_ATTR(distance, S_IRUGO, node_read_distance, NULL); 235 236 static struct attribute *node_dev_attrs[] = { 237 &dev_attr_cpumap.attr, 238 &dev_attr_cpulist.attr, 239 &dev_attr_meminfo.attr, 240 &dev_attr_numastat.attr, 241 &dev_attr_distance.attr, 242 &dev_attr_vmstat.attr, 243 NULL 244 }; 245 ATTRIBUTE_GROUPS(node_dev); 246 247 #ifdef CONFIG_HUGETLBFS 248 /* 249 * hugetlbfs per node attributes registration interface: 250 * When/if hugetlb[fs] subsystem initializes [sometime after this module], 251 * it will register its per node attributes for all online nodes with 252 * memory. It will also call register_hugetlbfs_with_node(), below, to 253 * register its attribute registration functions with this node driver. 254 * Once these hooks have been initialized, the node driver will call into 255 * the hugetlb module to [un]register attributes for hot-plugged nodes. 256 */ 257 static node_registration_func_t __hugetlb_register_node; 258 static node_registration_func_t __hugetlb_unregister_node; 259 260 static inline bool hugetlb_register_node(struct node *node) 261 { 262 if (__hugetlb_register_node && 263 node_state(node->dev.id, N_MEMORY)) { 264 __hugetlb_register_node(node); 265 return true; 266 } 267 return false; 268 } 269 270 static inline void hugetlb_unregister_node(struct node *node) 271 { 272 if (__hugetlb_unregister_node) 273 __hugetlb_unregister_node(node); 274 } 275 276 void register_hugetlbfs_with_node(node_registration_func_t doregister, 277 node_registration_func_t unregister) 278 { 279 __hugetlb_register_node = doregister; 280 __hugetlb_unregister_node = unregister; 281 } 282 #else 283 static inline void hugetlb_register_node(struct node *node) {} 284 285 static inline void hugetlb_unregister_node(struct node *node) {} 286 #endif 287 288 static void node_device_release(struct device *dev) 289 { 290 struct node *node = to_node(dev); 291 292 #if defined(CONFIG_MEMORY_HOTPLUG_SPARSE) && defined(CONFIG_HUGETLBFS) 293 /* 294 * We schedule the work only when a memory section is 295 * onlined/offlined on this node. When we come here, 296 * all the memory on this node has been offlined, 297 * so we won't enqueue new work to this work. 298 * 299 * The work is using node->node_work, so we should 300 * flush work before freeing the memory. 301 */ 302 flush_work(&node->node_work); 303 #endif 304 kfree(node); 305 } 306 307 /* 308 * register_node - Setup a sysfs device for a node. 309 * @num - Node number to use when creating the device. 310 * 311 * Initialize and register the node device. 312 */ 313 static int register_node(struct node *node, int num) 314 { 315 int error; 316 317 node->dev.id = num; 318 node->dev.bus = &node_subsys; 319 node->dev.release = node_device_release; 320 node->dev.groups = node_dev_groups; 321 error = device_register(&node->dev); 322 323 if (error) 324 put_device(&node->dev); 325 else { 326 hugetlb_register_node(node); 327 328 compaction_register_node(node); 329 } 330 return error; 331 } 332 333 /** 334 * unregister_node - unregister a node device 335 * @node: node going away 336 * 337 * Unregisters a node device @node. All the devices on the node must be 338 * unregistered before calling this function. 339 */ 340 void unregister_node(struct node *node) 341 { 342 hugetlb_unregister_node(node); /* no-op, if memoryless node */ 343 344 device_unregister(&node->dev); 345 } 346 347 struct node *node_devices[MAX_NUMNODES]; 348 349 /* 350 * register cpu under node 351 */ 352 int register_cpu_under_node(unsigned int cpu, unsigned int nid) 353 { 354 int ret; 355 struct device *obj; 356 357 if (!node_online(nid)) 358 return 0; 359 360 obj = get_cpu_device(cpu); 361 if (!obj) 362 return 0; 363 364 ret = sysfs_create_link(&node_devices[nid]->dev.kobj, 365 &obj->kobj, 366 kobject_name(&obj->kobj)); 367 if (ret) 368 return ret; 369 370 return sysfs_create_link(&obj->kobj, 371 &node_devices[nid]->dev.kobj, 372 kobject_name(&node_devices[nid]->dev.kobj)); 373 } 374 375 int unregister_cpu_under_node(unsigned int cpu, unsigned int nid) 376 { 377 struct device *obj; 378 379 if (!node_online(nid)) 380 return 0; 381 382 obj = get_cpu_device(cpu); 383 if (!obj) 384 return 0; 385 386 sysfs_remove_link(&node_devices[nid]->dev.kobj, 387 kobject_name(&obj->kobj)); 388 sysfs_remove_link(&obj->kobj, 389 kobject_name(&node_devices[nid]->dev.kobj)); 390 391 return 0; 392 } 393 394 #ifdef CONFIG_MEMORY_HOTPLUG_SPARSE 395 static int __ref get_nid_for_pfn(unsigned long pfn) 396 { 397 if (!pfn_valid_within(pfn)) 398 return -1; 399 #ifdef CONFIG_DEFERRED_STRUCT_PAGE_INIT 400 if (system_state < SYSTEM_RUNNING) 401 return early_pfn_to_nid(pfn); 402 #endif 403 return pfn_to_nid(pfn); 404 } 405 406 /* register memory section under specified node if it spans that node */ 407 int register_mem_sect_under_node(struct memory_block *mem_blk, void *arg) 408 { 409 int ret, nid = *(int *)arg; 410 unsigned long pfn, sect_start_pfn, sect_end_pfn; 411 412 mem_blk->nid = nid; 413 414 sect_start_pfn = section_nr_to_pfn(mem_blk->start_section_nr); 415 sect_end_pfn = section_nr_to_pfn(mem_blk->end_section_nr); 416 sect_end_pfn += PAGES_PER_SECTION - 1; 417 for (pfn = sect_start_pfn; pfn <= sect_end_pfn; pfn++) { 418 int page_nid; 419 420 /* 421 * memory block could have several absent sections from start. 422 * skip pfn range from absent section 423 */ 424 if (!pfn_present(pfn)) { 425 pfn = round_down(pfn + PAGES_PER_SECTION, 426 PAGES_PER_SECTION) - 1; 427 continue; 428 } 429 430 /* 431 * We need to check if page belongs to nid only for the boot 432 * case, during hotplug we know that all pages in the memory 433 * block belong to the same node. 434 */ 435 if (system_state == SYSTEM_BOOTING) { 436 page_nid = get_nid_for_pfn(pfn); 437 if (page_nid < 0) 438 continue; 439 if (page_nid != nid) 440 continue; 441 } 442 ret = sysfs_create_link_nowarn(&node_devices[nid]->dev.kobj, 443 &mem_blk->dev.kobj, 444 kobject_name(&mem_blk->dev.kobj)); 445 if (ret) 446 return ret; 447 448 return sysfs_create_link_nowarn(&mem_blk->dev.kobj, 449 &node_devices[nid]->dev.kobj, 450 kobject_name(&node_devices[nid]->dev.kobj)); 451 } 452 /* mem section does not span the specified node */ 453 return 0; 454 } 455 456 /* unregister memory section under all nodes that it spans */ 457 int unregister_mem_sect_under_nodes(struct memory_block *mem_blk, 458 unsigned long phys_index) 459 { 460 NODEMASK_ALLOC(nodemask_t, unlinked_nodes, GFP_KERNEL); 461 unsigned long pfn, sect_start_pfn, sect_end_pfn; 462 463 if (!mem_blk) { 464 NODEMASK_FREE(unlinked_nodes); 465 return -EFAULT; 466 } 467 if (!unlinked_nodes) 468 return -ENOMEM; 469 nodes_clear(*unlinked_nodes); 470 471 sect_start_pfn = section_nr_to_pfn(phys_index); 472 sect_end_pfn = sect_start_pfn + PAGES_PER_SECTION - 1; 473 for (pfn = sect_start_pfn; pfn <= sect_end_pfn; pfn++) { 474 int nid; 475 476 nid = get_nid_for_pfn(pfn); 477 if (nid < 0) 478 continue; 479 if (!node_online(nid)) 480 continue; 481 if (node_test_and_set(nid, *unlinked_nodes)) 482 continue; 483 sysfs_remove_link(&node_devices[nid]->dev.kobj, 484 kobject_name(&mem_blk->dev.kobj)); 485 sysfs_remove_link(&mem_blk->dev.kobj, 486 kobject_name(&node_devices[nid]->dev.kobj)); 487 } 488 NODEMASK_FREE(unlinked_nodes); 489 return 0; 490 } 491 492 int link_mem_sections(int nid, unsigned long start_pfn, unsigned long end_pfn) 493 { 494 return walk_memory_range(start_pfn, end_pfn, (void *)&nid, 495 register_mem_sect_under_node); 496 } 497 498 #ifdef CONFIG_HUGETLBFS 499 /* 500 * Handle per node hstate attribute [un]registration on transistions 501 * to/from memoryless state. 502 */ 503 static void node_hugetlb_work(struct work_struct *work) 504 { 505 struct node *node = container_of(work, struct node, node_work); 506 507 /* 508 * We only get here when a node transitions to/from memoryless state. 509 * We can detect which transition occurred by examining whether the 510 * node has memory now. hugetlb_register_node() already check this 511 * so we try to register the attributes. If that fails, then the 512 * node has transitioned to memoryless, try to unregister the 513 * attributes. 514 */ 515 if (!hugetlb_register_node(node)) 516 hugetlb_unregister_node(node); 517 } 518 519 static void init_node_hugetlb_work(int nid) 520 { 521 INIT_WORK(&node_devices[nid]->node_work, node_hugetlb_work); 522 } 523 524 static int node_memory_callback(struct notifier_block *self, 525 unsigned long action, void *arg) 526 { 527 struct memory_notify *mnb = arg; 528 int nid = mnb->status_change_nid; 529 530 switch (action) { 531 case MEM_ONLINE: 532 case MEM_OFFLINE: 533 /* 534 * offload per node hstate [un]registration to a work thread 535 * when transitioning to/from memoryless state. 536 */ 537 if (nid != NUMA_NO_NODE) 538 schedule_work(&node_devices[nid]->node_work); 539 break; 540 541 case MEM_GOING_ONLINE: 542 case MEM_GOING_OFFLINE: 543 case MEM_CANCEL_ONLINE: 544 case MEM_CANCEL_OFFLINE: 545 default: 546 break; 547 } 548 549 return NOTIFY_OK; 550 } 551 #endif /* CONFIG_HUGETLBFS */ 552 #endif /* CONFIG_MEMORY_HOTPLUG_SPARSE */ 553 554 #if !defined(CONFIG_MEMORY_HOTPLUG_SPARSE) || \ 555 !defined(CONFIG_HUGETLBFS) 556 static inline int node_memory_callback(struct notifier_block *self, 557 unsigned long action, void *arg) 558 { 559 return NOTIFY_OK; 560 } 561 562 static void init_node_hugetlb_work(int nid) { } 563 564 #endif 565 566 int __register_one_node(int nid) 567 { 568 int error; 569 int cpu; 570 571 node_devices[nid] = kzalloc(sizeof(struct node), GFP_KERNEL); 572 if (!node_devices[nid]) 573 return -ENOMEM; 574 575 error = register_node(node_devices[nid], nid); 576 577 /* link cpu under this node */ 578 for_each_present_cpu(cpu) { 579 if (cpu_to_node(cpu) == nid) 580 register_cpu_under_node(cpu, nid); 581 } 582 583 /* initialize work queue for memory hot plug */ 584 init_node_hugetlb_work(nid); 585 586 return error; 587 } 588 589 void unregister_one_node(int nid) 590 { 591 if (!node_devices[nid]) 592 return; 593 594 unregister_node(node_devices[nid]); 595 node_devices[nid] = NULL; 596 } 597 598 /* 599 * node states attributes 600 */ 601 602 static ssize_t print_nodes_state(enum node_states state, char *buf) 603 { 604 int n; 605 606 n = scnprintf(buf, PAGE_SIZE - 1, "%*pbl", 607 nodemask_pr_args(&node_states[state])); 608 buf[n++] = '\n'; 609 buf[n] = '\0'; 610 return n; 611 } 612 613 struct node_attr { 614 struct device_attribute attr; 615 enum node_states state; 616 }; 617 618 static ssize_t show_node_state(struct device *dev, 619 struct device_attribute *attr, char *buf) 620 { 621 struct node_attr *na = container_of(attr, struct node_attr, attr); 622 return print_nodes_state(na->state, buf); 623 } 624 625 #define _NODE_ATTR(name, state) \ 626 { __ATTR(name, 0444, show_node_state, NULL), state } 627 628 static struct node_attr node_state_attr[] = { 629 [N_POSSIBLE] = _NODE_ATTR(possible, N_POSSIBLE), 630 [N_ONLINE] = _NODE_ATTR(online, N_ONLINE), 631 [N_NORMAL_MEMORY] = _NODE_ATTR(has_normal_memory, N_NORMAL_MEMORY), 632 #ifdef CONFIG_HIGHMEM 633 [N_HIGH_MEMORY] = _NODE_ATTR(has_high_memory, N_HIGH_MEMORY), 634 #endif 635 [N_MEMORY] = _NODE_ATTR(has_memory, N_MEMORY), 636 [N_CPU] = _NODE_ATTR(has_cpu, N_CPU), 637 }; 638 639 static struct attribute *node_state_attrs[] = { 640 &node_state_attr[N_POSSIBLE].attr.attr, 641 &node_state_attr[N_ONLINE].attr.attr, 642 &node_state_attr[N_NORMAL_MEMORY].attr.attr, 643 #ifdef CONFIG_HIGHMEM 644 &node_state_attr[N_HIGH_MEMORY].attr.attr, 645 #endif 646 &node_state_attr[N_MEMORY].attr.attr, 647 &node_state_attr[N_CPU].attr.attr, 648 NULL 649 }; 650 651 static struct attribute_group memory_root_attr_group = { 652 .attrs = node_state_attrs, 653 }; 654 655 static const struct attribute_group *cpu_root_attr_groups[] = { 656 &memory_root_attr_group, 657 NULL, 658 }; 659 660 #define NODE_CALLBACK_PRI 2 /* lower than SLAB */ 661 static int __init register_node_type(void) 662 { 663 int ret; 664 665 BUILD_BUG_ON(ARRAY_SIZE(node_state_attr) != NR_NODE_STATES); 666 BUILD_BUG_ON(ARRAY_SIZE(node_state_attrs)-1 != NR_NODE_STATES); 667 668 ret = subsys_system_register(&node_subsys, cpu_root_attr_groups); 669 if (!ret) { 670 static struct notifier_block node_memory_callback_nb = { 671 .notifier_call = node_memory_callback, 672 .priority = NODE_CALLBACK_PRI, 673 }; 674 register_hotmemory_notifier(&node_memory_callback_nb); 675 } 676 677 /* 678 * Note: we're not going to unregister the node class if we fail 679 * to register the node state class attribute files. 680 */ 681 return ret; 682 } 683 postcore_initcall(register_node_type); 684