| From 5b57b8f22709f07c0ab5921c94fd66e8c59c3e11 Mon Sep 17 00:00:00 2001 |
| From: Vlastimil Babka <vbabka@suse.cz> |
| Date: Thu, 30 Jan 2020 22:12:03 -0800 |
| Subject: mm/debug.c: always print flags in dump_page() |
| |
| From: Vlastimil Babka <vbabka@suse.cz> |
| |
| commit 5b57b8f22709f07c0ab5921c94fd66e8c59c3e11 upstream. |
| |
| Commit 76a1850e4572 ("mm/debug.c: __dump_page() prints an extra line") |
| inadvertently removed printing of page flags for pages that are neither |
| anon nor ksm nor have a mapping. Fix that. |
| |
| Using pr_cont() again would be a solution, but the commit explicitly |
| removed its use. Avoiding the danger of mixing up split lines from |
| multiple CPUs might be beneficial for near-panic dumps like this, so fix |
| this without reintroducing pr_cont(). |
| |
| Link: http://lkml.kernel.org/r/9f884d5c-ca60-dc7b-219c-c081c755fab6@suse.cz |
| Fixes: 76a1850e4572 ("mm/debug.c: __dump_page() prints an extra line") |
| Signed-off-by: Vlastimil Babka <vbabka@suse.cz> |
| Reported-by: Anshuman Khandual <anshuman.khandual@arm.com> |
| Reported-by: Michal Hocko <mhocko@kernel.org> |
| Acked-by: Michal Hocko <mhocko@suse.com> |
| Cc: David Hildenbrand <david@redhat.com> |
| Cc: Qian Cai <cai@lca.pw> |
| Cc: Oscar Salvador <osalvador@suse.de> |
| Cc: Mel Gorman <mgorman@techsingularity.net> |
| Cc: Mike Rapoport <rppt@linux.ibm.com> |
| Cc: Dan Williams <dan.j.williams@intel.com> |
| Cc: Pavel Tatashin <pavel.tatashin@microsoft.com> |
| Cc: Ralph Campbell <rcampbell@nvidia.com> |
| Signed-off-by: Andrew Morton <akpm@linux-foundation.org> |
| Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| mm/debug.c | 8 +++++--- |
| 1 file changed, 5 insertions(+), 3 deletions(-) |
| |
| --- a/mm/debug.c |
| +++ b/mm/debug.c |
| @@ -47,6 +47,7 @@ void __dump_page(struct page *page, cons |
| struct address_space *mapping; |
| bool page_poisoned = PagePoisoned(page); |
| int mapcount; |
| + char *type = ""; |
| |
| /* |
| * If struct page is poisoned don't access Page*() functions as that |
| @@ -78,9 +79,9 @@ void __dump_page(struct page *page, cons |
| page, page_ref_count(page), mapcount, |
| page->mapping, page_to_pgoff(page)); |
| if (PageKsm(page)) |
| - pr_warn("ksm flags: %#lx(%pGp)\n", page->flags, &page->flags); |
| + type = "ksm "; |
| else if (PageAnon(page)) |
| - pr_warn("anon flags: %#lx(%pGp)\n", page->flags, &page->flags); |
| + type = "anon "; |
| else if (mapping) { |
| if (mapping->host && mapping->host->i_dentry.first) { |
| struct dentry *dentry; |
| @@ -88,10 +89,11 @@ void __dump_page(struct page *page, cons |
| pr_warn("%ps name:\"%pd\"\n", mapping->a_ops, dentry); |
| } else |
| pr_warn("%ps\n", mapping->a_ops); |
| - pr_warn("flags: %#lx(%pGp)\n", page->flags, &page->flags); |
| } |
| BUILD_BUG_ON(ARRAY_SIZE(pageflag_names) != __NR_PAGEFLAGS + 1); |
| |
| + pr_warn("%sflags: %#lx(%pGp)\n", type, page->flags, &page->flags); |
| + |
| hex_only: |
| print_hex_dump(KERN_WARNING, "raw: ", DUMP_PREFIX_NONE, 32, |
| sizeof(unsigned long), page, |