diff options
Diffstat (limited to 'mm/debug.c')
-rw-r--r-- | mm/debug.c | 60 |
1 files changed, 14 insertions, 46 deletions
diff --git a/mm/debug.c b/mm/debug.c index 0328fd377545..231e1452a912 100644 --- a/mm/debug.c +++ b/mm/debug.c | |||
@@ -28,36 +28,6 @@ const struct trace_print_flags vmaflag_names[] = { | |||
28 | {0, NULL} | 28 | {0, NULL} |
29 | }; | 29 | }; |
30 | 30 | ||
31 | static void dump_flags(unsigned long flags, | ||
32 | const struct trace_print_flags *names, int count) | ||
33 | { | ||
34 | const char *delim = ""; | ||
35 | unsigned long mask; | ||
36 | int i; | ||
37 | |||
38 | pr_emerg("flags: %#lx(", flags); | ||
39 | |||
40 | /* remove zone id */ | ||
41 | flags &= (1UL << NR_PAGEFLAGS) - 1; | ||
42 | |||
43 | for (i = 0; i < count && flags; i++) { | ||
44 | |||
45 | mask = names[i].mask; | ||
46 | if ((flags & mask) != mask) | ||
47 | continue; | ||
48 | |||
49 | flags &= ~mask; | ||
50 | pr_cont("%s%s", delim, names[i].name); | ||
51 | delim = "|"; | ||
52 | } | ||
53 | |||
54 | /* check for left over flags */ | ||
55 | if (flags) | ||
56 | pr_cont("%s%#lx", delim, flags); | ||
57 | |||
58 | pr_cont(")\n"); | ||
59 | } | ||
60 | |||
61 | void dump_page_badflags(struct page *page, const char *reason, | 31 | void dump_page_badflags(struct page *page, const char *reason, |
62 | unsigned long badflags) | 32 | unsigned long badflags) |
63 | { | 33 | { |
@@ -68,15 +38,15 @@ void dump_page_badflags(struct page *page, const char *reason, | |||
68 | pr_cont(" compound_mapcount: %d", compound_mapcount(page)); | 38 | pr_cont(" compound_mapcount: %d", compound_mapcount(page)); |
69 | pr_cont("\n"); | 39 | pr_cont("\n"); |
70 | BUILD_BUG_ON(ARRAY_SIZE(pageflag_names) != __NR_PAGEFLAGS + 1); | 40 | BUILD_BUG_ON(ARRAY_SIZE(pageflag_names) != __NR_PAGEFLAGS + 1); |
71 | dump_flags(page->flags, pageflag_names, | 41 | pr_emerg("flags: %#lx(%pGp)\n", page->flags, &page->flags); |
72 | ARRAY_SIZE(pageflag_names) - 1); | 42 | |
73 | if (reason) | 43 | if (reason) |
74 | pr_alert("page dumped because: %s\n", reason); | 44 | pr_alert("page dumped because: %s\n", reason); |
75 | if (page->flags & badflags) { | 45 | |
76 | pr_alert("bad because of flags:\n"); | 46 | badflags &= page->flags; |
77 | dump_flags(page->flags & badflags, pageflag_names, | 47 | if (badflags) |
78 | ARRAY_SIZE(pageflag_names) - 1); | 48 | pr_alert("bad because of flags: %#lx(%pGp)\n", badflags, |
79 | } | 49 | &badflags); |
80 | #ifdef CONFIG_MEMCG | 50 | #ifdef CONFIG_MEMCG |
81 | if (page->mem_cgroup) | 51 | if (page->mem_cgroup) |
82 | pr_alert("page->mem_cgroup:%p\n", page->mem_cgroup); | 52 | pr_alert("page->mem_cgroup:%p\n", page->mem_cgroup); |
@@ -96,13 +66,14 @@ void dump_vma(const struct vm_area_struct *vma) | |||
96 | pr_emerg("vma %p start %p end %p\n" | 66 | pr_emerg("vma %p start %p end %p\n" |
97 | "next %p prev %p mm %p\n" | 67 | "next %p prev %p mm %p\n" |
98 | "prot %lx anon_vma %p vm_ops %p\n" | 68 | "prot %lx anon_vma %p vm_ops %p\n" |
99 | "pgoff %lx file %p private_data %p\n", | 69 | "pgoff %lx file %p private_data %p\n" |
70 | "flags: %#lx(%pGv)\n", | ||
100 | vma, (void *)vma->vm_start, (void *)vma->vm_end, vma->vm_next, | 71 | vma, (void *)vma->vm_start, (void *)vma->vm_end, vma->vm_next, |
101 | vma->vm_prev, vma->vm_mm, | 72 | vma->vm_prev, vma->vm_mm, |
102 | (unsigned long)pgprot_val(vma->vm_page_prot), | 73 | (unsigned long)pgprot_val(vma->vm_page_prot), |
103 | vma->anon_vma, vma->vm_ops, vma->vm_pgoff, | 74 | vma->anon_vma, vma->vm_ops, vma->vm_pgoff, |
104 | vma->vm_file, vma->vm_private_data); | 75 | vma->vm_file, vma->vm_private_data, |
105 | dump_flags(vma->vm_flags, vmaflag_names, ARRAY_SIZE(vmaflag_names) - 1); | 76 | vma->vm_flags, &vma->vm_flags); |
106 | } | 77 | } |
107 | EXPORT_SYMBOL(dump_vma); | 78 | EXPORT_SYMBOL(dump_vma); |
108 | 79 | ||
@@ -136,7 +107,7 @@ void dump_mm(const struct mm_struct *mm) | |||
136 | #if defined(CONFIG_NUMA_BALANCING) || defined(CONFIG_COMPACTION) | 107 | #if defined(CONFIG_NUMA_BALANCING) || defined(CONFIG_COMPACTION) |
137 | "tlb_flush_pending %d\n" | 108 | "tlb_flush_pending %d\n" |
138 | #endif | 109 | #endif |
139 | "%s", /* This is here to hold the comma */ | 110 | "def_flags: %#lx(%pGv)\n", |
140 | 111 | ||
141 | mm, mm->mmap, mm->vmacache_seqnum, mm->task_size, | 112 | mm, mm->mmap, mm->vmacache_seqnum, mm->task_size, |
142 | #ifdef CONFIG_MMU | 113 | #ifdef CONFIG_MMU |
@@ -170,11 +141,8 @@ void dump_mm(const struct mm_struct *mm) | |||
170 | #if defined(CONFIG_NUMA_BALANCING) || defined(CONFIG_COMPACTION) | 141 | #if defined(CONFIG_NUMA_BALANCING) || defined(CONFIG_COMPACTION) |
171 | mm->tlb_flush_pending, | 142 | mm->tlb_flush_pending, |
172 | #endif | 143 | #endif |
173 | "" /* This is here to not have a comma! */ | 144 | mm->def_flags, &mm->def_flags |
174 | ); | 145 | ); |
175 | |||
176 | dump_flags(mm->def_flags, vmaflag_names, | ||
177 | ARRAY_SIZE(vmaflag_names) - 1); | ||
178 | } | 146 | } |
179 | 147 | ||
180 | #endif /* CONFIG_DEBUG_VM */ | 148 | #endif /* CONFIG_DEBUG_VM */ |