aboutsummaryrefslogtreecommitdiffstats
path: root/mm/page_alloc.c
diff options
context:
space:
mode:
authorSasha Levin <sasha.levin@oracle.com>2014-10-09 18:28:06 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2014-10-09 22:25:57 -0400
commit0bf55139782db1fa96af66e37cc84afde18443ef (patch)
treeb5a77c505a1960a3c05bb321e8cc6abdf299daee /mm/page_alloc.c
parentb208ce32927ac2c4bf14edebfb3197acd7673165 (diff)
mm: introduce dump_vma
Introduce a helper to dump information about a VMA, this also makes dump_page_flags more generic and re-uses that so the output looks very similar to dump_page: [ 61.903437] vma ffff88070f88be00 start 00007fff25970000 end 00007fff25992000 [ 61.903437] next ffff88070facd600 prev ffff88070face400 mm ffff88070fade000 [ 61.903437] prot 8000000000000025 anon_vma ffff88070fa1e200 vm_ops (null) [ 61.903437] pgoff 7ffffffdd file (null) private_data (null) [ 61.909129] flags: 0x100173(read|write|mayread|maywrite|mayexec|growsdown|account) [akpm@linux-foundation.org: make dump_vma() require CONFIG_DEBUG_VM] [swarren@nvidia.com: fix dump_vma() compilation] Signed-off-by: Sasha Levin <sasha.levin@oracle.com> Reviewed-by: Naoya Horiguchi <n-horiguchi@ah.jp.nec.com> Cc: Kirill A. Shutemov <kirill.shutemov@linux.intel.com> Cc: Konstantin Khlebnikov <khlebnikov@openvz.org> Cc: Rik van Riel <riel@redhat.com> Cc: Mel Gorman <mgorman@suse.de> Cc: Michal Hocko <mhocko@suse.cz> Cc: Hugh Dickins <hughd@google.com> Cc: Vlastimil Babka <vbabka@suse.cz> Cc: Michel Lespinasse <walken@google.com> Cc: Minchan Kim <minchan@kernel.org> Signed-off-by: Stephen Warren <swarren@nvidia.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'mm/page_alloc.c')
-rw-r--r--mm/page_alloc.c82
1 files changed, 73 insertions, 9 deletions
diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index f07588b11d59..3a950144f80b 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -6626,27 +6626,26 @@ static const struct trace_print_flags pageflag_names[] = {
6626#endif 6626#endif
6627}; 6627};
6628 6628
6629static void dump_page_flags(unsigned long flags) 6629static void dump_flags(unsigned long flags,
6630 const struct trace_print_flags *names, int count)
6630{ 6631{
6631 const char *delim = ""; 6632 const char *delim = "";
6632 unsigned long mask; 6633 unsigned long mask;
6633 int i; 6634 int i;
6634 6635
6635 BUILD_BUG_ON(ARRAY_SIZE(pageflag_names) != __NR_PAGEFLAGS); 6636 printk(KERN_ALERT "flags: %#lx(", flags);
6636
6637 printk(KERN_ALERT "page flags: %#lx(", flags);
6638 6637
6639 /* remove zone id */ 6638 /* remove zone id */
6640 flags &= (1UL << NR_PAGEFLAGS) - 1; 6639 flags &= (1UL << NR_PAGEFLAGS) - 1;
6641 6640
6642 for (i = 0; i < ARRAY_SIZE(pageflag_names) && flags; i++) { 6641 for (i = 0; i < count && flags; i++) {
6643 6642
6644 mask = pageflag_names[i].mask; 6643 mask = names[i].mask;
6645 if ((flags & mask) != mask) 6644 if ((flags & mask) != mask)
6646 continue; 6645 continue;
6647 6646
6648 flags &= ~mask; 6647 flags &= ~mask;
6649 printk("%s%s", delim, pageflag_names[i].name); 6648 printk("%s%s", delim, names[i].name);
6650 delim = "|"; 6649 delim = "|";
6651 } 6650 }
6652 6651
@@ -6664,12 +6663,14 @@ void dump_page_badflags(struct page *page, const char *reason,
6664 "page:%p count:%d mapcount:%d mapping:%p index:%#lx\n", 6663 "page:%p count:%d mapcount:%d mapping:%p index:%#lx\n",
6665 page, atomic_read(&page->_count), page_mapcount(page), 6664 page, atomic_read(&page->_count), page_mapcount(page),
6666 page->mapping, page->index); 6665 page->mapping, page->index);
6667 dump_page_flags(page->flags); 6666 BUILD_BUG_ON(ARRAY_SIZE(pageflag_names) != __NR_PAGEFLAGS);
6667 dump_flags(page->flags, pageflag_names, ARRAY_SIZE(pageflag_names));
6668 if (reason) 6668 if (reason)
6669 pr_alert("page dumped because: %s\n", reason); 6669 pr_alert("page dumped because: %s\n", reason);
6670 if (page->flags & badflags) { 6670 if (page->flags & badflags) {
6671 pr_alert("bad because of flags:\n"); 6671 pr_alert("bad because of flags:\n");
6672 dump_page_flags(page->flags & badflags); 6672 dump_flags(page->flags & badflags,
6673 pageflag_names, ARRAY_SIZE(pageflag_names));
6673 } 6674 }
6674 mem_cgroup_print_bad_page(page); 6675 mem_cgroup_print_bad_page(page);
6675} 6676}
@@ -6679,3 +6680,66 @@ void dump_page(struct page *page, const char *reason)
6679 dump_page_badflags(page, reason, 0); 6680 dump_page_badflags(page, reason, 0);
6680} 6681}
6681EXPORT_SYMBOL(dump_page); 6682EXPORT_SYMBOL(dump_page);
6683
6684#ifdef CONFIG_DEBUG_VM
6685
6686static const struct trace_print_flags vmaflags_names[] = {
6687 {VM_READ, "read" },
6688 {VM_WRITE, "write" },
6689 {VM_EXEC, "exec" },
6690 {VM_SHARED, "shared" },
6691 {VM_MAYREAD, "mayread" },
6692 {VM_MAYWRITE, "maywrite" },
6693 {VM_MAYEXEC, "mayexec" },
6694 {VM_MAYSHARE, "mayshare" },
6695 {VM_GROWSDOWN, "growsdown" },
6696 {VM_PFNMAP, "pfnmap" },
6697 {VM_DENYWRITE, "denywrite" },
6698 {VM_LOCKED, "locked" },
6699 {VM_IO, "io" },
6700 {VM_SEQ_READ, "seqread" },
6701 {VM_RAND_READ, "randread" },
6702 {VM_DONTCOPY, "dontcopy" },
6703 {VM_DONTEXPAND, "dontexpand" },
6704 {VM_ACCOUNT, "account" },
6705 {VM_NORESERVE, "noreserve" },
6706 {VM_HUGETLB, "hugetlb" },
6707 {VM_NONLINEAR, "nonlinear" },
6708#if defined(CONFIG_X86)
6709 {VM_PAT, "pat" },
6710#elif defined(CONFIG_PPC)
6711 {VM_SAO, "sao" },
6712#elif defined(CONFIG_PARISC) || defined(CONFIG_METAG) || defined(CONFIG_IA64)
6713 {VM_GROWSUP, "growsup" },
6714#elif !defined(CONFIG_MMU)
6715 {VM_MAPPED_COPY, "mappedcopy" },
6716#else
6717 {VM_ARCH_1, "arch_1" },
6718#endif
6719 {VM_DONTDUMP, "dontdump" },
6720#ifdef CONFIG_MEM_SOFT_DIRTY
6721 {VM_SOFTDIRTY, "softdirty" },
6722#endif
6723 {VM_MIXEDMAP, "mixedmap" },
6724 {VM_HUGEPAGE, "hugepage" },
6725 {VM_NOHUGEPAGE, "nohugepage" },
6726 {VM_MERGEABLE, "mergeable" },
6727};
6728
6729void dump_vma(const struct vm_area_struct *vma)
6730{
6731 printk(KERN_ALERT
6732 "vma %p start %p end %p\n"
6733 "next %p prev %p mm %p\n"
6734 "prot %lx anon_vma %p vm_ops %p\n"
6735 "pgoff %lx file %p private_data %p\n",
6736 vma, (void *)vma->vm_start, (void *)vma->vm_end, vma->vm_next,
6737 vma->vm_prev, vma->vm_mm,
6738 (unsigned long)pgprot_val(vma->vm_page_prot),
6739 vma->anon_vma, vma->vm_ops, vma->vm_pgoff,
6740 vma->vm_file, vma->vm_private_data);
6741 dump_flags(vma->vm_flags, vmaflags_names, ARRAY_SIZE(vmaflags_names));
6742}
6743EXPORT_SYMBOL(dump_vma);
6744
6745#endif /* CONFIG_DEBUG_VM */