aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/base/node.c
diff options
context:
space:
mode:
authorGrant Likely <grant.likely@secretlab.ca>2010-12-30 00:20:30 -0500
committerGrant Likely <grant.likely@secretlab.ca>2010-12-30 00:21:47 -0500
commitd392da5207352f09030e95d9ea335a4225667ec0 (patch)
tree7d6cd1932afcad0a5619a5c504a6d93ca318187c /drivers/base/node.c
parente39d5ef678045d61812c1401f04fe8edb14d6359 (diff)
parent387c31c7e5c9805b0aef8833d1731a5fe7bdea14 (diff)
Merge v2.6.37-rc8 into powerpc/next
Diffstat (limited to 'drivers/base/node.c')
-rw-r--r--drivers/base/node.c22
1 files changed, 19 insertions, 3 deletions
diff --git a/drivers/base/node.c b/drivers/base/node.c
index 2872e86837b2..ce012a9c6201 100644
--- a/drivers/base/node.c
+++ b/drivers/base/node.c
@@ -160,6 +160,18 @@ static ssize_t node_read_numastat(struct sys_device * dev,
160} 160}
161static SYSDEV_ATTR(numastat, S_IRUGO, node_read_numastat, NULL); 161static SYSDEV_ATTR(numastat, S_IRUGO, node_read_numastat, NULL);
162 162
163static ssize_t node_read_vmstat(struct sys_device *dev,
164 struct sysdev_attribute *attr, char *buf)
165{
166 int nid = dev->id;
167 return sprintf(buf,
168 "nr_written %lu\n"
169 "nr_dirtied %lu\n",
170 node_page_state(nid, NR_WRITTEN),
171 node_page_state(nid, NR_DIRTIED));
172}
173static SYSDEV_ATTR(vmstat, S_IRUGO, node_read_vmstat, NULL);
174
163static ssize_t node_read_distance(struct sys_device * dev, 175static ssize_t node_read_distance(struct sys_device * dev,
164 struct sysdev_attribute *attr, char * buf) 176 struct sysdev_attribute *attr, char * buf)
165{ 177{
@@ -243,6 +255,7 @@ int register_node(struct node *node, int num, struct node *parent)
243 sysdev_create_file(&node->sysdev, &attr_meminfo); 255 sysdev_create_file(&node->sysdev, &attr_meminfo);
244 sysdev_create_file(&node->sysdev, &attr_numastat); 256 sysdev_create_file(&node->sysdev, &attr_numastat);
245 sysdev_create_file(&node->sysdev, &attr_distance); 257 sysdev_create_file(&node->sysdev, &attr_distance);
258 sysdev_create_file(&node->sysdev, &attr_vmstat);
246 259
247 scan_unevictable_register_node(node); 260 scan_unevictable_register_node(node);
248 261
@@ -267,6 +280,7 @@ void unregister_node(struct node *node)
267 sysdev_remove_file(&node->sysdev, &attr_meminfo); 280 sysdev_remove_file(&node->sysdev, &attr_meminfo);
268 sysdev_remove_file(&node->sysdev, &attr_numastat); 281 sysdev_remove_file(&node->sysdev, &attr_numastat);
269 sysdev_remove_file(&node->sysdev, &attr_distance); 282 sysdev_remove_file(&node->sysdev, &attr_distance);
283 sysdev_remove_file(&node->sysdev, &attr_vmstat);
270 284
271 scan_unevictable_unregister_node(node); 285 scan_unevictable_unregister_node(node);
272 hugetlb_unregister_node(node); /* no-op, if memoryless node */ 286 hugetlb_unregister_node(node); /* no-op, if memoryless node */
@@ -409,25 +423,27 @@ static int link_mem_sections(int nid)
409 unsigned long start_pfn = NODE_DATA(nid)->node_start_pfn; 423 unsigned long start_pfn = NODE_DATA(nid)->node_start_pfn;
410 unsigned long end_pfn = start_pfn + NODE_DATA(nid)->node_spanned_pages; 424 unsigned long end_pfn = start_pfn + NODE_DATA(nid)->node_spanned_pages;
411 unsigned long pfn; 425 unsigned long pfn;
426 struct memory_block *mem_blk = NULL;
412 int err = 0; 427 int err = 0;
413 428
414 for (pfn = start_pfn; pfn < end_pfn; pfn += PAGES_PER_SECTION) { 429 for (pfn = start_pfn; pfn < end_pfn; pfn += PAGES_PER_SECTION) {
415 unsigned long section_nr = pfn_to_section_nr(pfn); 430 unsigned long section_nr = pfn_to_section_nr(pfn);
416 struct mem_section *mem_sect; 431 struct mem_section *mem_sect;
417 struct memory_block *mem_blk;
418 int ret; 432 int ret;
419 433
420 if (!present_section_nr(section_nr)) 434 if (!present_section_nr(section_nr))
421 continue; 435 continue;
422 mem_sect = __nr_to_section(section_nr); 436 mem_sect = __nr_to_section(section_nr);
423 mem_blk = find_memory_block(mem_sect); 437 mem_blk = find_memory_block_hinted(mem_sect, mem_blk);
424 ret = register_mem_sect_under_node(mem_blk, nid); 438 ret = register_mem_sect_under_node(mem_blk, nid);
425 if (!err) 439 if (!err)
426 err = ret; 440 err = ret;
427 441
428 /* discard ref obtained in find_memory_block() */ 442 /* discard ref obtained in find_memory_block() */
429 kobject_put(&mem_blk->sysdev.kobj);
430 } 443 }
444
445 if (mem_blk)
446 kobject_put(&mem_blk->sysdev.kobj);
431 return err; 447 return err;
432} 448}
433 449