diff options
-rw-r--r-- | Documentation/filesystems/proc.txt | 44 | ||||
-rw-r--r-- | fs/proc/proc_misc.c | 15 | ||||
-rw-r--r-- | mm/vmalloc.c | 20 |
3 files changed, 77 insertions, 2 deletions
diff --git a/Documentation/filesystems/proc.txt b/Documentation/filesystems/proc.txt index 7f268f327d75..8c6384bdfed4 100644 --- a/Documentation/filesystems/proc.txt +++ b/Documentation/filesystems/proc.txt | |||
@@ -296,6 +296,7 @@ Table 1-4: Kernel info in /proc | |||
296 | uptime System uptime | 296 | uptime System uptime |
297 | version Kernel version | 297 | version Kernel version |
298 | video bttv info of video resources (2.4) | 298 | video bttv info of video resources (2.4) |
299 | vmallocinfo Show vmalloced areas | ||
299 | .............................................................................. | 300 | .............................................................................. |
300 | 301 | ||
301 | You can, for example, check which interrupts are currently in use and what | 302 | You can, for example, check which interrupts are currently in use and what |
@@ -557,6 +558,49 @@ VmallocTotal: total size of vmalloc memory area | |||
557 | VmallocUsed: amount of vmalloc area which is used | 558 | VmallocUsed: amount of vmalloc area which is used |
558 | VmallocChunk: largest contigious block of vmalloc area which is free | 559 | VmallocChunk: largest contigious block of vmalloc area which is free |
559 | 560 | ||
561 | .............................................................................. | ||
562 | |||
563 | vmallocinfo: | ||
564 | |||
565 | Provides information about vmalloced/vmaped areas. One line per area, | ||
566 | containing the virtual address range of the area, size in bytes, | ||
567 | caller information of the creator, and optional information depending | ||
568 | on the kind of area : | ||
569 | |||
570 | pages=nr number of pages | ||
571 | phys=addr if a physical address was specified | ||
572 | ioremap I/O mapping (ioremap() and friends) | ||
573 | vmalloc vmalloc() area | ||
574 | vmap vmap()ed pages | ||
575 | user VM_USERMAP area | ||
576 | vpages buffer for pages pointers was vmalloced (huge area) | ||
577 | N<node>=nr (Only on NUMA kernels) | ||
578 | Number of pages allocated on memory node <node> | ||
579 | |||
580 | > cat /proc/vmallocinfo | ||
581 | 0xffffc20000000000-0xffffc20000201000 2101248 alloc_large_system_hash+0x204 ... | ||
582 | /0x2c0 pages=512 vmalloc N0=128 N1=128 N2=128 N3=128 | ||
583 | 0xffffc20000201000-0xffffc20000302000 1052672 alloc_large_system_hash+0x204 ... | ||
584 | /0x2c0 pages=256 vmalloc N0=64 N1=64 N2=64 N3=64 | ||
585 | 0xffffc20000302000-0xffffc20000304000 8192 acpi_tb_verify_table+0x21/0x4f... | ||
586 | phys=7fee8000 ioremap | ||
587 | 0xffffc20000304000-0xffffc20000307000 12288 acpi_tb_verify_table+0x21/0x4f... | ||
588 | phys=7fee7000 ioremap | ||
589 | 0xffffc2000031d000-0xffffc2000031f000 8192 init_vdso_vars+0x112/0x210 | ||
590 | 0xffffc2000031f000-0xffffc2000032b000 49152 cramfs_uncompress_init+0x2e ... | ||
591 | /0x80 pages=11 vmalloc N0=3 N1=3 N2=2 N3=3 | ||
592 | 0xffffc2000033a000-0xffffc2000033d000 12288 sys_swapon+0x640/0xac0 ... | ||
593 | pages=2 vmalloc N1=2 | ||
594 | 0xffffc20000347000-0xffffc2000034c000 20480 xt_alloc_table_info+0xfe ... | ||
595 | /0x130 [x_tables] pages=4 vmalloc N0=4 | ||
596 | 0xffffffffa0000000-0xffffffffa000f000 61440 sys_init_module+0xc27/0x1d00 ... | ||
597 | pages=14 vmalloc N2=14 | ||
598 | 0xffffffffa000f000-0xffffffffa0014000 20480 sys_init_module+0xc27/0x1d00 ... | ||
599 | pages=4 vmalloc N1=4 | ||
600 | 0xffffffffa0014000-0xffffffffa0017000 12288 sys_init_module+0xc27/0x1d00 ... | ||
601 | pages=2 vmalloc N1=2 | ||
602 | 0xffffffffa0017000-0xffffffffa0022000 45056 sys_init_module+0xc27/0x1d00 ... | ||
603 | pages=10 vmalloc N0=10 | ||
560 | 604 | ||
561 | 1.3 IDE devices in /proc/ide | 605 | 1.3 IDE devices in /proc/ide |
562 | ---------------------------- | 606 | ---------------------------- |
diff --git a/fs/proc/proc_misc.c b/fs/proc/proc_misc.c index b14f43d25e9e..ded969862960 100644 --- a/fs/proc/proc_misc.c +++ b/fs/proc/proc_misc.c | |||
@@ -464,14 +464,25 @@ static const struct file_operations proc_slabstats_operations = { | |||
464 | #ifdef CONFIG_MMU | 464 | #ifdef CONFIG_MMU |
465 | static int vmalloc_open(struct inode *inode, struct file *file) | 465 | static int vmalloc_open(struct inode *inode, struct file *file) |
466 | { | 466 | { |
467 | return seq_open(file, &vmalloc_op); | 467 | unsigned int *ptr = NULL; |
468 | int ret; | ||
469 | |||
470 | if (NUMA_BUILD) | ||
471 | ptr = kmalloc(nr_node_ids * sizeof(unsigned int), GFP_KERNEL); | ||
472 | ret = seq_open(file, &vmalloc_op); | ||
473 | if (!ret) { | ||
474 | struct seq_file *m = file->private_data; | ||
475 | m->private = ptr; | ||
476 | } else | ||
477 | kfree(ptr); | ||
478 | return ret; | ||
468 | } | 479 | } |
469 | 480 | ||
470 | static const struct file_operations proc_vmalloc_operations = { | 481 | static const struct file_operations proc_vmalloc_operations = { |
471 | .open = vmalloc_open, | 482 | .open = vmalloc_open, |
472 | .read = seq_read, | 483 | .read = seq_read, |
473 | .llseek = seq_lseek, | 484 | .llseek = seq_lseek, |
474 | .release = seq_release, | 485 | .release = seq_release_private, |
475 | }; | 486 | }; |
476 | #endif | 487 | #endif |
477 | 488 | ||
diff --git a/mm/vmalloc.c b/mm/vmalloc.c index 6e45b0f3d125..35f293816294 100644 --- a/mm/vmalloc.c +++ b/mm/vmalloc.c | |||
@@ -931,6 +931,25 @@ static void s_stop(struct seq_file *m, void *p) | |||
931 | read_unlock(&vmlist_lock); | 931 | read_unlock(&vmlist_lock); |
932 | } | 932 | } |
933 | 933 | ||
934 | static void show_numa_info(struct seq_file *m, struct vm_struct *v) | ||
935 | { | ||
936 | if (NUMA_BUILD) { | ||
937 | unsigned int nr, *counters = m->private; | ||
938 | |||
939 | if (!counters) | ||
940 | return; | ||
941 | |||
942 | memset(counters, 0, nr_node_ids * sizeof(unsigned int)); | ||
943 | |||
944 | for (nr = 0; nr < v->nr_pages; nr++) | ||
945 | counters[page_to_nid(v->pages[nr])]++; | ||
946 | |||
947 | for_each_node_state(nr, N_HIGH_MEMORY) | ||
948 | if (counters[nr]) | ||
949 | seq_printf(m, " N%u=%u", nr, counters[nr]); | ||
950 | } | ||
951 | } | ||
952 | |||
934 | static int s_show(struct seq_file *m, void *p) | 953 | static int s_show(struct seq_file *m, void *p) |
935 | { | 954 | { |
936 | struct vm_struct *v = p; | 955 | struct vm_struct *v = p; |
@@ -967,6 +986,7 @@ static int s_show(struct seq_file *m, void *p) | |||
967 | if (v->flags & VM_VPAGES) | 986 | if (v->flags & VM_VPAGES) |
968 | seq_printf(m, " vpages"); | 987 | seq_printf(m, " vpages"); |
969 | 988 | ||
989 | show_numa_info(m, v); | ||
970 | seq_putc(m, '\n'); | 990 | seq_putc(m, '\n'); |
971 | return 0; | 991 | return 0; |
972 | } | 992 | } |