Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756123AbdCGTo1 (ORCPT ); Tue, 7 Mar 2017 14:44:27 -0500 Received: from mail-io0-f194.google.com ([209.85.223.194]:35665 "EHLO mail-io0-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755608AbdCGTn1 (ORCPT ); Tue, 7 Mar 2017 14:43:27 -0500 MIME-Version: 1.0 In-Reply-To: References: <20161216120009.20064-1-vbabka@suse.cz> <20161216120009.20064-2-vbabka@suse.cz> From: Tony Luck Date: Tue, 7 Mar 2017 11:36:36 -0800 Message-ID: Subject: Re: [PATCH v2 2/2] mm, page_alloc: avoid page_to_pfn() when merging buddies To: Vlastimil Babka Cc: Andrew Morton , "linux-mm@kvack.org" , Linux Kernel Mailing List , Joonsoo Kim , Michal Hocko , Mel Gorman , "Kirill A. Shutemov" , Johannes Weiner Content-Type: text/plain; charset=UTF-8 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 1147 Lines: 26 On Tue, Mar 7, 2017 at 10:40 AM, Tony Luck 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