Re: [PATCH v2 2/2] mm, page_alloc: avoid page_to_pfn() when merging buddies

From: Tony Luck
Date: Tue Mar 07 2017 - 14:44:42 EST


On Tue, Mar 7, 2017 at 10:40 AM, Tony Luck <tony.luck@xxxxxxxxx> wrote:
> The commit messages talks about the "only caller" of page_is_buddy().
> But grep shows two call sites:
>
> mm/page_alloc.c:816: if (!page_is_buddy(page, buddy, order))
> mm/page_alloc.c:876: if (page_is_buddy(higher_page,

and it looks like the second one is the problem:

if ((order < MAX_ORDER-2) && pfn_valid_within(buddy_pfn)) {
struct page *higher_page, *higher_buddy;
combined_pfn = buddy_pfn & pfn;
higher_page = page + (combined_pfn - pfn);
buddy_pfn = __find_buddy_pfn(combined_pfn, order + 1);
higher_buddy = higher_page + (buddy_pfn - combined_pfn);
if (page_is_buddy(higher_page, higher_buddy, order + 1)) {
list_add_tail(&page->lru,
&zone->free_area[order].free_list[migratetype]);
goto out;
}
}

Although outer "if" checked for pfn_valid_within(buddy_pfn),
we actually pass "higher_buddy" to this call of page_is_buddy().

-Tony