Received: by 10.223.185.116 with SMTP id b49csp7074066wrg; Wed, 28 Feb 2018 22:29:18 -0800 (PST) X-Google-Smtp-Source: AG47ELuPLyIB/bt9y0ySK+l8ADOrGmDY9VSMZMGUN43AzW1/qqfwGWmv/akr2O9psp8SxPq3o2gD X-Received: by 10.98.153.157 with SMTP id t29mr833720pfk.201.1519885758277; Wed, 28 Feb 2018 22:29:18 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1519885758; cv=none; d=google.com; s=arc-20160816; b=L+r1sI+1jzOXWxsq1DjT+y2T1dSbT1hzGPV6jGyKOiKxCoYOoTbACFR4tgm5Pmu9P3 fQmVw2kPNuSrBelfkyJfYmPF3Z4tQv1/JzwDJ/WxTf3AFUVNMT0X1gk4ExwKj9YrrxAl vV6xtL73gKj5pLuFnqEfP1f6c21vS4nXeIGzjJ97MNJ5DmWjC1/lB+A8CSn75b2muAWb /Ipho0qo/eHA9harXOVSvycKHcSIuYW6DHvwO1wNEbCkYpJp6bO20+4CK4EQ9+cjiHIl /Sb5sItJ3icEWwVKVRXpQau1QP08jyHa32kTkYBGw3GMgkvdeRBiBKqxqy6JHiQxsPM4 kMOA== 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=og1Qgugcdzz4gkhcsxzW7VrgLE8hkxLniKMKZyBiASU=; b=m4lRpuquHJw5Cf75dobvx575XmjQvvBIYBVivFb8hnr2NPOtCqXz35uyArQ3e8SjkX QsMC4Y6+saZSZDPTu8uT58LWCjxdJtfN25uR0+K+axWhLFvak9qZQeee75HK9Ahn65k2 PFl8RlaiR7/FJkJYiLDByHX9KD2UAArKBM2mvWLnM6Jm1weGJj3K/EKKdQluX9pgiTUJ nzFz9ovK4SQ5x1IWma9O/SFdn6TjAAAuhG0c54cb1aPLW0gJ19lWxDwDIMvQi4gJXMn1 1qxwkMU5r39K9UJ9q05Q9JiY6vu/UHI8IHX9e9UB2XhNoeiKxTlXxDxxFIY1BoPkYNuV U5HA== 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 5-v6si2571091plf.396.2018.02.28.22.29.03; Wed, 28 Feb 2018 22:29:18 -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 S966374AbeCAG14 (ORCPT + 99 others); Thu, 1 Mar 2018 01:27:56 -0500 Received: from mga03.intel.com ([134.134.136.65]:12103 "EHLO mga03.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S966268AbeCAG1y (ORCPT ); Thu, 1 Mar 2018 01:27:54 -0500 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by orsmga103.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 28 Feb 2018 22:27:54 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.47,407,1515484800"; d="scan'208";a="33761283" Received: from aaronlu.sh.intel.com ([10.239.159.135]) by fmsmga004.fm.intel.com with ESMTP; 28 Feb 2018 22:27:52 -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 , David Rientjes Subject: [PATCH v4 2/3] mm/free_pcppages_bulk: do not hold lock when picking pages to free Date: Thu, 1 Mar 2018 14:28:44 +0800 Message-Id: <20180301062845.26038-3-aaron.lu@intel.com> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180301062845.26038-1-aaron.lu@intel.com> References: <20180301062845.26038-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 | 39 +++++++++++++++++++++++---------------- 1 file changed, 23 insertions(+), 16 deletions(-) diff --git a/mm/page_alloc.c b/mm/page_alloc.c index faa33eac1635..dafdcdec9c1f 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -1116,12 +1116,10 @@ static void free_pcppages_bulk(struct zone *zone, int count, int migratetype = 0; int batch_free = 0; bool isolated_pageblocks; - - spin_lock(&zone->lock); - isolated_pageblocks = has_isolate_pageblock(zone); + struct page *page, *tmp; + LIST_HEAD(head); while (count) { - struct page *page; struct list_head *list; /* @@ -1143,27 +1141,36 @@ 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 */ + /* must delete to avoid corrupting pcp list */ list_del(&page->lru); pcp->count--; - 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); + + /* + * Use safe version since after __free_one_page(), + * page->lru.next will not point to original list. + */ + 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