diff options
Diffstat (limited to 'mm/page_alloc.c')
| -rw-r--r-- | mm/page_alloc.c | 85 |
1 files changed, 80 insertions, 5 deletions
diff --git a/mm/page_alloc.c b/mm/page_alloc.c index a8182c89de59..d03c946d5566 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c | |||
| @@ -50,6 +50,7 @@ | |||
| 50 | #include <linux/kmemleak.h> | 50 | #include <linux/kmemleak.h> |
| 51 | #include <linux/memory.h> | 51 | #include <linux/memory.h> |
| 52 | #include <trace/events/kmem.h> | 52 | #include <trace/events/kmem.h> |
| 53 | #include <linux/ftrace_event.h> | ||
| 53 | 54 | ||
| 54 | #include <asm/tlbflush.h> | 55 | #include <asm/tlbflush.h> |
| 55 | #include <asm/div64.h> | 56 | #include <asm/div64.h> |
| @@ -288,10 +289,7 @@ static void bad_page(struct page *page) | |||
| 288 | 289 | ||
| 289 | printk(KERN_ALERT "BUG: Bad page state in process %s pfn:%05lx\n", | 290 | printk(KERN_ALERT "BUG: Bad page state in process %s pfn:%05lx\n", |
| 290 | current->comm, page_to_pfn(page)); | 291 | current->comm, page_to_pfn(page)); |
| 291 | printk(KERN_ALERT | 292 | dump_page(page); |
| 292 | "page:%p flags:%p count:%d mapcount:%d mapping:%p index:%lx\n", | ||
| 293 | page, (void *)page->flags, page_count(page), | ||
| 294 | page_mapcount(page), page->mapping, page->index); | ||
| 295 | 293 | ||
| 296 | dump_stack(); | 294 | dump_stack(); |
| 297 | out: | 295 | out: |
| @@ -3224,7 +3222,7 @@ static int __zone_pcp_update(void *data) | |||
| 3224 | int cpu; | 3222 | int cpu; |
| 3225 | unsigned long batch = zone_batchsize(zone), flags; | 3223 | unsigned long batch = zone_batchsize(zone), flags; |
| 3226 | 3224 | ||
| 3227 | for (cpu = 0; cpu < NR_CPUS; cpu++) { | 3225 | for_each_possible_cpu(cpu) { |
| 3228 | struct per_cpu_pageset *pset; | 3226 | struct per_cpu_pageset *pset; |
| 3229 | struct per_cpu_pages *pcp; | 3227 | struct per_cpu_pages *pcp; |
| 3230 | 3228 | ||
| @@ -5183,3 +5181,80 @@ bool is_free_buddy_page(struct page *page) | |||
| 5183 | return order < MAX_ORDER; | 5181 | return order < MAX_ORDER; |
| 5184 | } | 5182 | } |
| 5185 | #endif | 5183 | #endif |
| 5184 | |||
| 5185 | static struct trace_print_flags pageflag_names[] = { | ||
| 5186 | {1UL << PG_locked, "locked" }, | ||
| 5187 | {1UL << PG_error, "error" }, | ||
| 5188 | {1UL << PG_referenced, "referenced" }, | ||
| 5189 | {1UL << PG_uptodate, "uptodate" }, | ||
| 5190 | {1UL << PG_dirty, "dirty" }, | ||
| 5191 | {1UL << PG_lru, "lru" }, | ||
| 5192 | {1UL << PG_active, "active" }, | ||
| 5193 | {1UL << PG_slab, "slab" }, | ||
| 5194 | {1UL << PG_owner_priv_1, "owner_priv_1" }, | ||
| 5195 | {1UL << PG_arch_1, "arch_1" }, | ||
| 5196 | {1UL << PG_reserved, "reserved" }, | ||
| 5197 | {1UL << PG_private, "private" }, | ||
| 5198 | {1UL << PG_private_2, "private_2" }, | ||
| 5199 | {1UL << PG_writeback, "writeback" }, | ||
| 5200 | #ifdef CONFIG_PAGEFLAGS_EXTENDED | ||
| 5201 | {1UL << PG_head, "head" }, | ||
| 5202 | {1UL << PG_tail, "tail" }, | ||
| 5203 | #else | ||
| 5204 | {1UL << PG_compound, "compound" }, | ||
| 5205 | #endif | ||
| 5206 | {1UL << PG_swapcache, "swapcache" }, | ||
| 5207 | {1UL << PG_mappedtodisk, "mappedtodisk" }, | ||
| 5208 | {1UL << PG_reclaim, "reclaim" }, | ||
| 5209 | {1UL << PG_buddy, "buddy" }, | ||
| 5210 | {1UL << PG_swapbacked, "swapbacked" }, | ||
| 5211 | {1UL << PG_unevictable, "unevictable" }, | ||
| 5212 | #ifdef CONFIG_MMU | ||
| 5213 | {1UL << PG_mlocked, "mlocked" }, | ||
| 5214 | #endif | ||
| 5215 | #ifdef CONFIG_ARCH_USES_PG_UNCACHED | ||
| 5216 | {1UL << PG_uncached, "uncached" }, | ||
| 5217 | #endif | ||
| 5218 | #ifdef CONFIG_MEMORY_FAILURE | ||
| 5219 | {1UL << PG_hwpoison, "hwpoison" }, | ||
| 5220 | #endif | ||
| 5221 | {-1UL, NULL }, | ||
| 5222 | }; | ||
| 5223 | |||
| 5224 | static void dump_page_flags(unsigned long flags) | ||
| 5225 | { | ||
| 5226 | const char *delim = ""; | ||
| 5227 | unsigned long mask; | ||
| 5228 | int i; | ||
| 5229 | |||
| 5230 | printk(KERN_ALERT "page flags: %#lx(", flags); | ||
| 5231 | |||
| 5232 | /* remove zone id */ | ||
| 5233 | flags &= (1UL << NR_PAGEFLAGS) - 1; | ||
| 5234 | |||
| 5235 | for (i = 0; pageflag_names[i].name && flags; i++) { | ||
| 5236 | |||
| 5237 | mask = pageflag_names[i].mask; | ||
| 5238 | if ((flags & mask) != mask) | ||
| 5239 | continue; | ||
| 5240 | |||
| 5241 | flags &= ~mask; | ||
| 5242 | printk("%s%s", delim, pageflag_names[i].name); | ||
| 5243 | delim = "|"; | ||
| 5244 | } | ||
| 5245 | |||
| 5246 | /* check for left over flags */ | ||
| 5247 | if (flags) | ||
| 5248 | printk("%s%#lx", delim, flags); | ||
| 5249 | |||
| 5250 | printk(")\n"); | ||
| 5251 | } | ||
| 5252 | |||
| 5253 | void dump_page(struct page *page) | ||
| 5254 | { | ||
| 5255 | printk(KERN_ALERT | ||
| 5256 | "page:%p count:%d mapcount:%d mapping:%p index:%#lx\n", | ||
| 5257 | page, page_count(page), page_mapcount(page), | ||
| 5258 | page->mapping, page->index); | ||
| 5259 | dump_page_flags(page->flags); | ||
| 5260 | } | ||
