Received: by 2002:ac0:a5a6:0:0:0:0:0 with SMTP id m35-v6csp74581imm; Thu, 20 Sep 2018 15:28:29 -0700 (PDT) X-Google-Smtp-Source: ANB0VdYgO9aZQPlZXnQZZcpQih6c7qyhTB+kE4RlrbtNC6q+bBx0gM0FZc9/N1CDfh5vkO0MHEdD X-Received: by 2002:a63:f206:: with SMTP id v6-v6mr35016016pgh.319.1537482508974; Thu, 20 Sep 2018 15:28:28 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1537482508; cv=none; d=google.com; s=arc-20160816; b=KmEB36ZTwQBj1FW+7zLZvjOjeSrsGhMxlSW+k3QPe02r4rdT4iR4KPYa6jvpK3zt93 L92iOxnZ4++D+godN7BgnGDr8FVYgoluUnW0GKdCRgnT062hVibREjD3i0bdk5p5iRCp IczLlmzf3nsuA+0+GXm068yzvBi1iEDhELFa1mAAagS5l1+nOFO3SYhnw8B95YTRwQSA bFWYK6S+ctMHAILxGLtCyMqFAOvUXvzkqvlf4XJ1diAfvny8f4JqEjELCLlzjO1Zc3Qr ItyFs9qB1dL8GN9Ow9+kE6C2SrgEMEXqpY1RpvZJAlLwRr8DWuE152AKs6eJSTjE0e5T huhw== 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=rtBDAMbGmBlNQ1vdQfjvBiLqtdFJw4/gYxGBxmLdmPM=; b=i5etgtVDo3XdTXOJS2zMSoGbUW9IJmuq21MzqSs2Jxzm5Rzt/LEi9CAHyCqppKQfZG xi5LDzuM2rJ9/M7xxiaox8w0McQuyXevUAPHFyOwTwOzMIgCcceCdIb/n64ZC2/yE8QC LzJiQzPvHapGSbAOGmtWfNFiN/fvXjGNG/O0a1jHyh+7HDyZ3PpEOdd3VY2PwnETiCuT BE6H7KzR3UKp33XSMhkiKfTlBK+G3Ggi86vbNUqceSMHOJ82f1pQNEppLF0f0u8ENvqc Uk/p3eDrDUh8PSXO6EUsUePP9SEgUEjsRYt1v/e7g0BYGMZ/rmBUuzZc778+dGgUiNl+ jBRA== 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 d32-v6si24359548pla.93.2018.09.20.15.28.13; Thu, 20 Sep 2018 15:28:28 -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 S1727210AbeIUENi (ORCPT + 99 others); Fri, 21 Sep 2018 00:13:38 -0400 Received: from mga01.intel.com ([192.55.52.88]:46584 "EHLO mga01.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725808AbeIUENi (ORCPT ); Fri, 21 Sep 2018 00:13:38 -0400 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga003.jf.intel.com ([10.7.209.27]) by fmsmga101.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 20 Sep 2018 15:27:56 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.54,282,1534834800"; d="scan'208";a="85285823" Received: from ahduyck-mobl.amr.corp.intel.com (HELO localhost.localdomain) ([10.7.198.152]) by orsmga003.jf.intel.com with ESMTP; 20 Sep 2018 15:27:53 -0700 Subject: [PATCH v4 2/5] mm: Create non-atomic version of SetPageReserved for init use From: Alexander Duyck To: linux-mm@kvack.org, linux-kernel@vger.kernel.org, linux-nvdimm@lists.01.org Cc: pavel.tatashin@microsoft.com, mhocko@suse.com, dave.jiang@intel.com, mingo@kernel.org, dave.hansen@intel.com, jglisse@redhat.com, akpm@linux-foundation.org, logang@deltatee.com, dan.j.williams@intel.com, kirill.shutemov@linux.intel.com Date: Thu, 20 Sep 2018 15:27:53 -0700 Message-ID: <20180920222641.19464.75787.stgit@localhost.localdomain> In-Reply-To: <20180920215824.19464.8884.stgit@localhost.localdomain> References: <20180920215824.19464.8884.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 Signed-off-by: Alexander Duyck --- v4: Added comment about __set_bit vs set_bit to the patch description 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 712cab17f86f..29bd662fffd7 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -1239,7 +1239,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); } } } @@ -5513,7 +5518,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