On 2/10/20 4:42 AM, Kirill A. Shutemov wrote: ... >> @@ -66,25 +68,32 @@ void __dump_page(struct page *page, const char *reason) >> goto hex_only; >> } >> >> - mapping = page_mapping(page); >> + if (page < head || (page >= head + MAX_ORDER_NR_PAGES)) { >> + /* Corrupt page, cannot call page_mapping */ >> + mapping = page->mapping; >> + head = page; >> + compound = false; >> + } else { >> + mapping = page_mapping(page); >> + } >> >> /* >> * Avoid VM_BUG_ON() in page_mapcount(). >> * page->_mapcount space in struct page is used by sl[aou]b pages to >> * encode own info. >> */ >> - mapcount = PageSlab(page) ? 0 : page_mapcount(page); >> + mapcount = PageSlab(head) ? 0 : page_mapcount(head); > > This is wrong. We want to see mapcount for the tail page, not head. > I see what you mean: page_mapcount(page) sums up both the page's and the head page's mapcount in some cases. The function doesn't seem to work correctly unless it is fed the tail page. Here, even though the "head" variable's meaning is overloaded (=="head page, unless the tail page was corrupted, in which case, tail page"), it would still be accurate to change that line back to the original line, so that it once again reads: mapcount = PageSlab(page) ? 0 : page_mapcount(page); Matthew? (Also, I see that __page_mapcount is EXPORT-ed, which is odd: nothing uses it other than page_mapcount. Micro-housecleaning time maybe...) thanks, -- John Hubbard NVIDIA