5 #include <linux/module.h>
17 #include <linux/device.h>
19 #include <linux/slab.h>
21 static struct bus_type node_subsys = {
37 cpulist_scnprintf(buf,
PAGE_SIZE-2, mask) :
38 cpumask_scnprintf(buf,
PAGE_SIZE-2, mask);
47 return node_read_cpumap(dev, 0, buf);
52 return node_read_cpumap(dev, 1, buf);
58 #define K(x) ((x) << (PAGE_SHIFT - 10))
66 si_meminfo_node(&i, nid);
68 "Node %d MemTotal: %8lu kB\n"
69 "Node %d MemFree: %8lu kB\n"
70 "Node %d MemUsed: %8lu kB\n"
71 "Node %d Active: %8lu kB\n"
72 "Node %d Inactive: %8lu kB\n"
73 "Node %d Active(anon): %8lu kB\n"
74 "Node %d Inactive(anon): %8lu kB\n"
75 "Node %d Active(file): %8lu kB\n"
76 "Node %d Inactive(file): %8lu kB\n"
77 "Node %d Unevictable: %8lu kB\n"
78 "Node %d Mlocked: %8lu kB\n",
95 "Node %d HighTotal: %8lu kB\n"
96 "Node %d HighFree: %8lu kB\n"
97 "Node %d LowTotal: %8lu kB\n"
98 "Node %d LowFree: %8lu kB\n",
105 "Node %d Dirty: %8lu kB\n"
106 "Node %d Writeback: %8lu kB\n"
107 "Node %d FilePages: %8lu kB\n"
108 "Node %d Mapped: %8lu kB\n"
109 "Node %d AnonPages: %8lu kB\n"
110 "Node %d Shmem: %8lu kB\n"
111 "Node %d KernelStack: %8lu kB\n"
112 "Node %d PageTables: %8lu kB\n"
113 "Node %d NFS_Unstable: %8lu kB\n"
114 "Node %d Bounce: %8lu kB\n"
115 "Node %d WritebackTmp: %8lu kB\n"
116 "Node %d Slab: %8lu kB\n"
117 "Node %d SReclaimable: %8lu kB\n"
118 "Node %d SUnreclaim: %8lu kB\n"
119 #ifdef CONFIG_TRANSPARENT_HUGEPAGE
120 "Node %d AnonHugePages: %8lu kB\n"
127 #ifdef CONFIG_TRANSPARENT_HUGEPAGE
144 #ifdef CONFIG_TRANSPARENT_HUGEPAGE
166 "interleave_hit %lu\n"
186 n +=
sprintf(buf+n,
"%s %lu\n", vmstat_text[i],
209 len +=
sprintf(buf + len, "\n");
214 #ifdef CONFIG_HUGETLBFS
227 static inline bool hugetlb_register_node(
struct node *
node)
229 if (__hugetlb_register_node &&
231 __hugetlb_register_node(node);
237 static inline void hugetlb_unregister_node(
struct node *node)
239 if (__hugetlb_unregister_node)
240 __hugetlb_unregister_node(node);
246 __hugetlb_register_node = doregister;
247 __hugetlb_unregister_node = unregister;
250 static inline void hugetlb_register_node(
struct node *node) {}
252 static inline void hugetlb_unregister_node(
struct node *node) {}
267 node->
dev.bus = &node_subsys;
278 scan_unevictable_register_node(node);
280 hugetlb_register_node(node);
282 compaction_register_node(node);
303 scan_unevictable_unregister_node(node);
304 hugetlb_unregister_node(node);
328 kobject_name(&obj->
kobj));
349 kobject_name(&obj->
kobj));
356 #ifdef CONFIG_MEMORY_HOTPLUG_SPARSE
357 #define page_initialized(page) (page->lru.next)
359 static int get_nid_for_pfn(
unsigned long pfn)
366 if (!page_initialized(page))
368 return pfn_to_nid(pfn);
372 int register_mem_sect_under_node(
struct memory_block *mem_blk,
int nid)
375 unsigned long pfn, sect_start_pfn, sect_end_pfn;
384 sect_end_pfn += PAGES_PER_SECTION - 1;
385 for (pfn = sect_start_pfn; pfn <= sect_end_pfn; pfn++) {
388 page_nid = get_nid_for_pfn(pfn);
395 kobject_name(&mem_blk->
dev.kobj));
408 int unregister_mem_sect_under_nodes(
struct memory_block *mem_blk,
409 unsigned long phys_index)
412 unsigned long pfn, sect_start_pfn, sect_end_pfn;
422 sect_start_pfn = section_nr_to_pfn(phys_index);
423 sect_end_pfn = sect_start_pfn + PAGES_PER_SECTION - 1;
424 for (pfn = sect_start_pfn; pfn <= sect_end_pfn; pfn++) {
427 nid = get_nid_for_pfn(pfn);
435 kobject_name(&mem_blk->
dev.kobj));
443 static int link_mem_sections(
int nid)
445 unsigned long start_pfn =
NODE_DATA(nid)->node_start_pfn;
446 unsigned long end_pfn = start_pfn +
NODE_DATA(nid)->node_spanned_pages;
451 for (pfn = start_pfn; pfn < end_pfn; pfn += PAGES_PER_SECTION) {
452 unsigned long section_nr = pfn_to_section_nr(pfn);
453 struct mem_section *mem_sect;
456 if (!present_section_nr(section_nr))
458 mem_sect = __nr_to_section(section_nr);
463 (section_nr <= mem_blk->end_section_nr))
468 ret = register_mem_sect_under_node(mem_blk, nid);
480 #ifdef CONFIG_HUGETLBFS
487 struct node *node =
container_of(work,
struct node, node_work);
497 if (!hugetlb_register_node(node))
498 hugetlb_unregister_node(node);
501 static void init_node_hugetlb_work(
int nid)
536 static int link_mem_sections(
int nid) {
return 0; }
539 #if !defined(CONFIG_MEMORY_HOTPLUG_SPARSE) || \
540 !defined(CONFIG_HUGETLBFS)
541 static inline int node_memory_callback(
struct notifier_block *
self,
542 unsigned long action,
void *arg)
547 static void init_node_hugetlb_work(
int nid) { }
572 error = link_mem_sections(nid);
575 init_node_hugetlb_work(nid);
610 return print_nodes_state(na->
state, buf);
613 #define _NODE_ATTR(name, state) \
614 { __ATTR(name, 0444, show_node_state, NULL), state }
616 static struct node_attr node_state_attr[] = {
621 #ifdef CONFIG_HIGHMEM
626 static struct attribute *node_state_attrs[] = {
627 &node_state_attr[0].
attr.attr,
628 &node_state_attr[1].
attr.attr,
629 &node_state_attr[2].
attr.attr,
630 &node_state_attr[3].
attr.attr,
631 #ifdef CONFIG_HIGHMEM
632 &node_state_attr[4].
attr.attr,
638 .attrs = node_state_attrs,
642 &memory_root_attr_group,
646 #define NODE_CALLBACK_PRI 2
647 static int __init register_node_type(
void)