mm: dump_page(): additional diagnostics for huge pinned pages
As part of pin_user_pages() and related API calls, pages are "dma-pinned". For the case of compound pages of order > 1, the per-page accounting of dma pins is accomplished via the 3rd struct page in the compound page. In order to support debugging of any pin_user_pages()- related problems, enhance dump_page() so as to report the pin count in that case. Documentation/core-api/pin_user_pages.rst is also updated accordingly. Signed-off-by: John Hubbard <jhubbard@nvidia.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Acked-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com> Cc: Jan Kara <jack@suse.cz> Cc: Matthew Wilcox <willy@infradead.org> Cc: Ira Weiny <ira.weiny@intel.com> Cc: Jérôme Glisse <jglisse@redhat.com> Cc: Al Viro <viro@zeniv.linux.org.uk> Cc: Christoph Hellwig <hch@infradead.org> Cc: Dan Williams <dan.j.williams@intel.com> Cc: Dave Chinner <david@fromorbit.com> Cc: Jason Gunthorpe <jgg@ziepe.ca> Cc: Jonathan Corbet <corbet@lwn.net> Cc: Michal Hocko <mhocko@suse.com> Cc: Mike Kravetz <mike.kravetz@oracle.com> Cc: Shuah Khan <shuah@kernel.org> Cc: Vlastimil Babka <vbabka@suse.cz> Link: http://lkml.kernel.org/r/20200211001536.1027652-13-jhubbard@nvidia.com Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
6197ab984b
commit
dc8fb2f282
|
@ -238,6 +238,13 @@ long-term [R]DMA pins in place, or during pin/unpin transitions.
|
|||
(...unless it was already out of balance due to a long-term RDMA pin being in
|
||||
place.)
|
||||
|
||||
Other diagnostics
|
||||
=================
|
||||
|
||||
dump_page() has been enhanced slightly, to handle these new counting fields, and
|
||||
to better report on compound pages in general. Specifically, for compound pages
|
||||
with order > 1, the exact (hpage_pinned_refcount) pincount is reported.
|
||||
|
||||
References
|
||||
==========
|
||||
|
||||
|
|
21
mm/debug.c
21
mm/debug.c
|
@ -85,11 +85,22 @@ void __dump_page(struct page *page, const char *reason)
|
|||
mapcount = PageSlab(head) ? 0 : page_mapcount(page);
|
||||
|
||||
if (compound)
|
||||
pr_warn("page:%px refcount:%d mapcount:%d mapping:%p "
|
||||
"index:%#lx head:%px order:%u compound_mapcount:%d\n",
|
||||
page, page_ref_count(head), mapcount,
|
||||
mapping, page_to_pgoff(page), head,
|
||||
compound_order(head), compound_mapcount(page));
|
||||
if (hpage_pincount_available(page)) {
|
||||
pr_warn("page:%px refcount:%d mapcount:%d mapping:%p "
|
||||
"index:%#lx head:%px order:%u "
|
||||
"compound_mapcount:%d compound_pincount:%d\n",
|
||||
page, page_ref_count(head), mapcount,
|
||||
mapping, page_to_pgoff(page), head,
|
||||
compound_order(head), compound_mapcount(page),
|
||||
compound_pincount(page));
|
||||
} else {
|
||||
pr_warn("page:%px refcount:%d mapcount:%d mapping:%p "
|
||||
"index:%#lx head:%px order:%u "
|
||||
"compound_mapcount:%d\n",
|
||||
page, page_ref_count(head), mapcount,
|
||||
mapping, page_to_pgoff(page), head,
|
||||
compound_order(head), compound_mapcount(page));
|
||||
}
|
||||
else
|
||||
pr_warn("page:%px refcount:%d mapcount:%d mapping:%p index:%#lx\n",
|
||||
page, page_ref_count(page), mapcount,
|
||||
|
|
Loading…
Reference in New Issue