Re: [PATCH] mm: Improve dump_page() for compound pages

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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





[Index of Archives]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Bugtraq]     [Linux OMAP]     [Linux MIPS]     [eCos]     [Asterisk Internet PBX]     [Linux API]

  Powered by Linux