Received: by 10.223.185.116 with SMTP id b49csp3780186wrg; Mon, 26 Feb 2018 06:02:46 -0800 (PST) X-Google-Smtp-Source: AH8x225gT9agK/DWGt72HtTUe7yqW+L7TQRQO/TBnDlkaUwRf5Wp7J8/xMswS9MGi9XTPw+b6i+V X-Received: by 10.99.126.12 with SMTP id z12mr8561285pgc.142.1519653766593; Mon, 26 Feb 2018 06:02:46 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1519653766; cv=none; d=google.com; s=arc-20160816; b=CwGk4jK2kmWmhiZL4yfF8OgFM03FssQHt9XcgqKAcjQCgYdtiIMW7Ug+L+fqhEOJd+ rxtW7+7gVfzJUAMzXfaqTUE/1D6OPbUSuPC06RsN5WeSTE5GB0BKX/YNi9oKirPCkcr4 UuE2OpOc4B6SQNSVxmaWPeWGqPYQicA3AmxYhddA4DuvCJC21TZaOUVtqxUSsxUCUn+h C2yCOcOrP4e+WXOqQPBD7HYYDQ8HtFdOaD2Qoom1I3twQLV90URwphyr/cPAL7+/Zj+f ik7u2vnKQuUpydoIFIaLmfnplFk8/HfOEoOArOFg3Ibu+PlCCzMY18etwm29fj5zgOtb 60zQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:arc-authentication-results; bh=r+5RWTg8f6fescp5Ht/Hcx2/ME7P9VdAlu/AhpX9CMw=; b=fWfp/hCJsd/fWWKPGWiYEUeusglZBkrTgHXheL5ejfmLolAMIx1hwGKvbKLyNf3m0J oFseiZKNyf7SMisJO4Y0083Kp54IsvjOvU6aE5KQXt/XZ3C0+pMZ1lKQzOWWwD0f5WP1 HTHmNSt0foE7xro3v87dvVIj+L7IB1LfdIPpQZ7sYv97U4Gh2L9Zf6ieDAzKfNYsCHj1 eyoObig9gLclN/yVsh2lEQxh8wzZ/m31KK3Uo0swIRPz3tR2OmMQLUmc6n4YOLtmLukW D12D8VyIiYTVPQzrGqn+gsMbm7A03oarU8TSsHka8VHh0wiLXVy2A7e0pcQGVrb2cyYE GReg== 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 t14si6806534pfa.162.2018.02.26.06.02.29; Mon, 26 Feb 2018 06:02:46 -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 S1753213AbeBZNw7 (ORCPT + 99 others); Mon, 26 Feb 2018 08:52:59 -0500 Received: from mga04.intel.com ([192.55.52.120]:54609 "EHLO mga04.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753086AbeBZNww (ORCPT ); Mon, 26 Feb 2018 08:52:52 -0500 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga003.fm.intel.com ([10.253.24.29]) by fmsmga104.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 26 Feb 2018 05:52:52 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.47,396,1515484800"; d="scan'208";a="29836368" Received: from aaronlu.sh.intel.com ([10.239.159.135]) by FMSMGA003.fm.intel.com with ESMTP; 26 Feb 2018 05:52:49 -0800 From: Aaron Lu To: linux-mm@kvack.org, linux-kernel@vger.kernel.org Cc: Andrew Morton , Huang Ying , Dave Hansen , Kemi Wang , Tim Chen , Andi Kleen , Michal Hocko , Vlastimil Babka , Mel Gorman , Matthew Wilcox Subject: [PATCH v3 2/3] mm/free_pcppages_bulk: do not hold lock when picking pages to free Date: Mon, 26 Feb 2018 21:53:45 +0800 Message-Id: <20180226135346.7208-3-aaron.lu@intel.com> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180226135346.7208-1-aaron.lu@intel.com> References: <20180226135346.7208-1-aaron.lu@intel.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org When freeing a batch of pages from Per-CPU-Pages(PCP) back to buddy, the zone->lock is held and then pages are chosen from PCP's migratetype list. While there is actually no need to do this 'choose part' under lock since it's PCP pages, the only CPU that can touch them is us and irq is also disabled. Moving this part outside could reduce lock held time and improve performance. Test with will-it-scale/page_fault1 full load: kernel Broadwell(2S) Skylake(2S) Broadwell(4S) Skylake(4S) v4.16-rc2+ 9034215 7971818 13667135 15677465 this patch 9536374 +5.6% 8314710 +4.3% 14070408 +3.0% 16675866 +6.4% What the test does is: starts $nr_cpu processes and each will repeatedly do the following for 5 minutes: 1 mmap 128M anonymouse space; 2 write access to that space; 3 munmap. The score is the aggregated iteration. https://github.com/antonblanchard/will-it-scale/blob/master/tests/page_fault1.c Acked-by: Mel Gorman Signed-off-by: Aaron Lu --- mm/page_alloc.c | 33 ++++++++++++++++++--------------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 3154859cccd6..35576da0a6c9 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -1116,13 +1116,11 @@ static void free_pcppages_bulk(struct zone *zone, int count, int migratetype = 0; int batch_free = 0; bool isolated_pageblocks; + struct page *page, *tmp; + LIST_HEAD(head); pcp->count -= count; - spin_lock(&zone->lock); - isolated_pageblocks = has_isolate_pageblock(zone); - while (count) { - struct page *page; struct list_head *list; /* @@ -1144,26 +1142,31 @@ static void free_pcppages_bulk(struct zone *zone, int count, batch_free = count; do { - int mt; /* migratetype of the to-be-freed page */ - page = list_last_entry(list, struct page, lru); /* must delete as __free_one_page list manipulates */ list_del(&page->lru); - mt = get_pcppage_migratetype(page); - /* MIGRATE_ISOLATE page should not go to pcplists */ - VM_BUG_ON_PAGE(is_migrate_isolate(mt), page); - /* Pageblock could have been isolated meanwhile */ - if (unlikely(isolated_pageblocks)) - mt = get_pageblock_migratetype(page); - if (bulkfree_pcp_prepare(page)) continue; - __free_one_page(page, page_to_pfn(page), zone, 0, mt); - trace_mm_page_pcpu_drain(page, 0, mt); + list_add_tail(&page->lru, &head); } while (--count && --batch_free && !list_empty(list)); } + + spin_lock(&zone->lock); + isolated_pageblocks = has_isolate_pageblock(zone); + + list_for_each_entry_safe(page, tmp, &head, lru) { + int mt = get_pcppage_migratetype(page); + /* MIGRATE_ISOLATE page should not go to pcplists */ + VM_BUG_ON_PAGE(is_migrate_isolate(mt), page); + /* Pageblock could have been isolated meanwhile */ + if (unlikely(isolated_pageblocks)) + mt = get_pageblock_migratetype(page); + + __free_one_page(page, page_to_pfn(page), zone, 0, mt); + trace_mm_page_pcpu_drain(page, 0, mt); + } spin_unlock(&zone->lock); } -- 2.14.3