Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp1629396imu; Tue, 6 Nov 2018 01:34:10 -0800 (PST) X-Google-Smtp-Source: AJdET5eNUEgE8KQ0GNHqVLVu2bbZ9ZfqQH2NhHub35CS+SuL5cKCkJZEG+rSB+BI1VN/1RHlKn+H X-Received: by 2002:a65:47ca:: with SMTP id f10mr5992973pgs.166.1541496849960; Tue, 06 Nov 2018 01:34:09 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1541496849; cv=none; d=google.com; s=arc-20160816; b=k5TILTI7eg9JHfX69MVgaN6XrpRigmUF9VvqYqbSzuaVGF0hCYnFuSGy4/EUafYCV6 JEj3iKc8YjxCsbxm/AaTqPBGJRCcnrgfHk5Icl+a8+1xlzlNKVkuxCkX41/Q3TOeNIRr dgHOpifLBW7QDw9nGaA3FtxIzDdKZhih1kid2fJu03Y+ltItQ6gj2q2URCUnbo7e22KZ ljPUtPwVFzyHbSbsVOM644iEzLYOjWkY+2RFwLU9LMVVss6FxOPZRwsujE0mqf4ZWI84 EwfuNA7D6fd0SQtjMi92EGhw+mHtwnDfskSKtDULN+4ZKab8PQ80OTLyHvs1MOlBn8MT C49w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding :content-language:in-reply-to:mime-version:user-agent:date :message-id:autocrypt:openpgp:from:references:cc:to:subject; bh=LQ+B8lOjhdEwIVBlxNlQdSAOQYmxRdmLT/WT88ocu5U=; b=H2HKjr/72V1CM+fbemBzOguzm6gat+hpNRtQqyIG0EHr5Uv9+wcTW1kEcS1PpP5UPG iPs62+5VsxPRDqj/3NjC6vy/3YUUGA8DP9MGTxK1hJkiu+6lytGAP86xi6X1p+l5QVCI iA1nEtVjJ2xPdFtyeWiUT13iP36qdyZNSGiqTOrbadQw8suEZHdgE2Uj5qzR6saiY0iE rFg6w9iFuthe4ou8Ey1+kfQV/xTSnsnOQPm4gBN0aJ17NpcDvs6l4C5wOg60IiQKLuXG dtP0Rl/cmmHTeXkSaqdv4aJ080P3Q1CPxzOInXS0oRa+kfQbFlZcyMUJ0hve0qFFm9ME WMWw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id i66-v6si47156265pfc.173.2018.11.06.01.33.54; Tue, 06 Nov 2018 01:34:09 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730216AbeKFS40 (ORCPT + 99 others); Tue, 6 Nov 2018 13:56:26 -0500 Received: from mx2.suse.de ([195.135.220.15]:42244 "EHLO mx1.suse.de" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1729272AbeKFS40 (ORCPT ); Tue, 6 Nov 2018 13:56:26 -0500 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay1.suse.de (unknown [195.135.220.254]) by mx1.suse.de (Postfix) with ESMTP id 00573B125; Tue, 6 Nov 2018 09:32:00 +0000 (UTC) Subject: Re: [PATCH v2 2/2] mm/page_alloc: use a single function to free page To: Aaron Lu Cc: linux-mm@kvack.org, linux-kernel@vger.kernel.org, netdev@vger.kernel.org, Andrew Morton , =?UTF-8?Q?Pawe=c5=82_Staszewski?= , Jesper Dangaard Brouer , Eric Dumazet , Tariq Toukan , Ilias Apalodimas , Yoel Caspersen , Mel Gorman , Saeed Mahameed , Michal Hocko , Dave Hansen , Alexander Duyck References: <20181105085820.6341-1-aaron.lu@intel.com> <20181105085820.6341-2-aaron.lu@intel.com> <20181106053037.GD6203@intel.com> <20181106084746.GA24198@intel.com> From: Vlastimil Babka Openpgp: preference=signencrypt Autocrypt: addr=vbabka@suse.cz; prefer-encrypt=mutual; keydata= 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 cqmP8roqufIAj+Ohhzs= Message-ID: <30aa9d1f-d619-c143-3de6-6876029538bc@suse.cz> Date: Tue, 6 Nov 2018 10:32:00 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.2.1 MIME-Version: 1.0 In-Reply-To: <20181106084746.GA24198@intel.com> Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 11/6/18 9:47 AM, Aaron Lu wrote: > On Tue, Nov 06, 2018 at 09:16:20AM +0100, Vlastimil Babka wrote: >> On 11/6/18 6:30 AM, Aaron Lu wrote: >>> We have multiple places of freeing a page, most of them doing similar >>> things and a common function can be used to reduce code duplicate. >>> >>> It also avoids bug fixed in one function but left in another. >>> >>> Signed-off-by: Aaron Lu >> >> Acked-by: Vlastimil Babka > > Thanks. > >> I assume there's no arch that would run page_ref_sub_and_test(1) slower >> than put_page_testzero(), for the critical __free_pages() case? > > Good question. > > I followed the non-arch specific calls and found that: > page_ref_sub_and_test() ends up calling atomic_sub_return(i, v) while > put_page_testzero() ends up calling atomic_sub_return(1, v). So they > should be same for archs that do not have their own implementations. x86 seems to distinguish between DECL and SUBL, see arch/x86/include/asm/atomic.h although I could not figure out where does e.g. arch_atomic_dec_and_test become atomic_dec_and_test to override the generic implementation. I don't know if the CPU e.g. executes DECL faster, but objectively it has one parameter less. Maybe it doesn't matter? > Back to your question: I don't know either. > If this is deemed unsafe, we can probably keep the ref modify part in > their original functions and only take the free part into a common > function. I guess you could also employ if (__builtin_constant_p(nr)) in free_the_page(), but the result will be ugly I guess, and maybe not worth it :) > Regards, > Aaron > >>> --- >>> v2: move comments close to code as suggested by Dave. >>> >>> mm/page_alloc.c | 36 ++++++++++++++++-------------------- >>> 1 file changed, 16 insertions(+), 20 deletions(-) >>> >>> diff --git a/mm/page_alloc.c b/mm/page_alloc.c >>> index 91a9a6af41a2..4faf6b7bf225 100644 >>> --- a/mm/page_alloc.c >>> +++ b/mm/page_alloc.c >>> @@ -4425,9 +4425,17 @@ unsigned long get_zeroed_page(gfp_t gfp_mask) >>> } >>> EXPORT_SYMBOL(get_zeroed_page); >>> >>> -void __free_pages(struct page *page, unsigned int order) >>> +static inline void free_the_page(struct page *page, unsigned int order, int nr) >>> { >>> - if (put_page_testzero(page)) { >>> + VM_BUG_ON_PAGE(page_ref_count(page) == 0, page); >>> + >>> + /* >>> + * Free a page by reducing its ref count by @nr. >>> + * If its refcount reaches 0, then according to its order: >>> + * order0: send to PCP; >>> + * high order: directly send to Buddy. >>> + */ >>> + if (page_ref_sub_and_test(page, nr)) { >>> if (order == 0) >>> free_unref_page(page); >>> else >>> @@ -4435,6 +4443,10 @@ void __free_pages(struct page *page, unsigned int order) >>> } >>> } >>> >>> +void __free_pages(struct page *page, unsigned int order) >>> +{ >>> + free_the_page(page, order, 1); >>> +} >>> EXPORT_SYMBOL(__free_pages); >>> >>> void free_pages(unsigned long addr, unsigned int order) >>> @@ -4481,16 +4493,7 @@ static struct page *__page_frag_cache_refill(struct page_frag_cache *nc, >>> >>> void __page_frag_cache_drain(struct page *page, unsigned int count) >>> { >>> - VM_BUG_ON_PAGE(page_ref_count(page) == 0, page); >>> - >>> - if (page_ref_sub_and_test(page, count)) { >>> - unsigned int order = compound_order(page); >>> - >>> - if (order == 0) >>> - free_unref_page(page); >>> - else >>> - __free_pages_ok(page, order); >>> - } >>> + free_the_page(page, compound_order(page), count); >>> } >>> EXPORT_SYMBOL(__page_frag_cache_drain); >>> >>> @@ -4555,14 +4558,7 @@ void page_frag_free(void *addr) >>> { >>> struct page *page = virt_to_head_page(addr); >>> >>> - if (unlikely(put_page_testzero(page))) { >>> - unsigned int order = compound_order(page); >>> - >>> - if (order == 0) >>> - free_unref_page(page); >>> - else >>> - __free_pages_ok(page, order); >>> - } >>> + free_the_page(page, compound_order(page), 1); >>> } >>> EXPORT_SYMBOL(page_frag_free); >>> >>> >>