Received: by 2002:ac0:a5a6:0:0:0:0:0 with SMTP id m35-v6csp4213278imm; Tue, 25 Sep 2018 13:21:55 -0700 (PDT) X-Google-Smtp-Source: ACcGV60fg2/nmQt5WzDadCLblqCdzUL2v3iWuA2dWIK1y3CuO0KBWFSl7Oj8ie/AOQBqE1Reo1tl X-Received: by 2002:a65:4c43:: with SMTP id l3-v6mr2458421pgr.451.1537906915244; Tue, 25 Sep 2018 13:21:55 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1537906915; cv=none; d=google.com; s=arc-20160816; b=xF0ooKvULtLcBjsRxRNruilRGmMo/pnK+3T7B5+BsymIEQzzHXVvLmL+JmYXyQJpMb sGC+G/tVFukNWLhzK4wNRJHQazb/RKn1lmcMZ6rWhsZpTn1WfVgz9bTXkhqPG4OG3CoO YCUJvNjc+wKq2rQYPTC4T+NkHlGzsiaoXBXm5eHXpxy6KvyShI+Vp9cczNXYAF4HuM7n sLKPSBJ3v+ryO1PfgMa6FmgywEMH8DgzSk2okQIYBx8ONXMx6TkdNr5yQfzIS9ZKhbu7 Byej0rQQepiMgmGfo07xwzWEbIjhMJtHtDgKrmHhnDJanreGN8rwngrkD8j2C/XqLLsh LsOQ== 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:mime-version :user-agent:references:in-reply-to:message-id:date:cc:to:from :subject; bh=E9r7KhEKHjUQ1Pm7kAQ0/qTduElaq7EW1gzJiqC69fo=; b=Clu2G0IP5tgPORWoB5Hf9eWN9CB/LVjQpIhOhxKP6keEtxFK1BOjqN+RuI/bCnym4b /VsEMmcEQYupL5HL0tZKeBXWSRXnJZ0NNyT0b5++VH9hm0v+ysNxONbRbioFBje8HApv bxxAZ9q5o7/w5QPAHGV3fn2gGY0JGzj64qFBITu6XDl+P700M49WeHeRfpRFXwSZfjiC rSxuzRDYrvlGJXLr/BawzpgboBAa/Mc+VlckcmQP+X7Mo/jZiczNtsqycnfw2jfpRvKq bUrJNODIeY2qZn88UeV42COMDyoLV1zXquoLvK/Iml2noUXwfXvYH2gLFoYcU9jLG1EL 3q3g== 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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id i18-v6si3085367pfk.65.2018.09.25.13.21.39; Tue, 25 Sep 2018 13:21:55 -0700 (PDT) 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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726934AbeIZCa3 (ORCPT + 99 others); Tue, 25 Sep 2018 22:30:29 -0400 Received: from mga07.intel.com ([134.134.136.100]:6365 "EHLO mga07.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726086AbeIZCa3 (ORCPT ); Tue, 25 Sep 2018 22:30:29 -0400 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga006.jf.intel.com ([10.7.209.51]) by orsmga105.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 25 Sep 2018 13:21:12 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.54,303,1534834800"; d="scan'208";a="77230394" Received: from ahduyck-mobl.amr.corp.intel.com (HELO localhost.localdomain) ([10.7.198.152]) by orsmga006.jf.intel.com with ESMTP; 25 Sep 2018 13:20:47 -0700 Subject: [PATCH v5 3/4] mm: Create non-atomic version of SetPageReserved for init use From: Alexander Duyck To: linux-mm@kvack.org, akpm@linux-foundation.org, linux-kernel@vger.kernel.org, linux-nvdimm@lists.01.org Cc: pavel.tatashin@microsoft.com, mhocko@suse.com, dave.jiang@intel.com, dave.hansen@intel.com, jglisse@redhat.com, rppt@linux.vnet.ibm.com, dan.j.williams@intel.com, logang@deltatee.com, mingo@kernel.org, kirill.shutemov@linux.intel.com Date: Tue, 25 Sep 2018 13:20:47 -0700 Message-ID: <20180925202018.3576.11607.stgit@localhost.localdomain> In-Reply-To: <20180925200551.3576.18755.stgit@localhost.localdomain> References: <20180925200551.3576.18755.stgit@localhost.localdomain> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org It doesn't make much sense to use the atomic SetPageReserved at init time when we are using memset to clear the memory and manipulating the page flags via simple "&=" and "|=" operations in __init_single_page. This patch adds a non-atomic version __SetPageReserved that can be used during page init and shows about a 10% improvement in initialization times on the systems I have available for testing. On those systems I saw initialization times drop from around 35 seconds to around 32 seconds to initialize a 3TB block of persistent memory. I believe the main advantage of this is that it allows for more compiler optimization as the __set_bit operation can be reordered whereas the atomic version cannot. I tried adding a bit of documentation based on commit ("mm, memory_hotplug: do not associate hotadded memory to zones until online"). Ideally the reserved flag should be set earlier since there is a brief window where the page is initialization via __init_single_page and we have not set the PG_Reserved flag. I'm leaving that for a future patch set as that will require a more significant refactor. Acked-by: Michal Hocko Reviewed-by: Pavel Tatashin Signed-off-by: Alexander Duyck --- v4: Added comment about __set_bit vs set_bit to the patch description v5: No change include/linux/page-flags.h | 1 + mm/page_alloc.c | 9 +++++++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/include/linux/page-flags.h b/include/linux/page-flags.h index 934f91ef3f54..50ce1bddaf56 100644 --- a/include/linux/page-flags.h +++ b/include/linux/page-flags.h @@ -303,6 +303,7 @@ static inline void page_init_poison(struct page *page, size_t size) PAGEFLAG(Reserved, reserved, PF_NO_COMPOUND) __CLEARPAGEFLAG(Reserved, reserved, PF_NO_COMPOUND) + __SETPAGEFLAG(Reserved, reserved, PF_NO_COMPOUND) PAGEFLAG(SwapBacked, swapbacked, PF_NO_TAIL) __CLEARPAGEFLAG(SwapBacked, swapbacked, PF_NO_TAIL) __SETPAGEFLAG(SwapBacked, swapbacked, PF_NO_TAIL) diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 511447ac02cf..926ad3083b28 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -1238,7 +1238,12 @@ void __meminit reserve_bootmem_region(phys_addr_t start, phys_addr_t end) /* Avoid false-positive PageTail() */ INIT_LIST_HEAD(&page->lru); - SetPageReserved(page); + /* + * no need for atomic set_bit because the struct + * page is not visible yet so nobody should + * access it yet. + */ + __SetPageReserved(page); } } } @@ -5512,7 +5517,7 @@ void __meminit memmap_init_zone(unsigned long size, int nid, unsigned long zone, page = pfn_to_page(pfn); __init_single_page(page, pfn, zone, nid); if (context == MEMMAP_HOTPLUG) - SetPageReserved(page); + __SetPageReserved(page); /* * Mark the block movable so that blocks are reserved for