From: Alexander Duyck <alexander.duyck@gmail.com> To: linux-mm@kvack.org, linux-kernel@vger.kernel.org, linux-nvdimm@lists.01.org Cc: pavel.tatashin@microsoft.com, mhocko@suse.com, dave.hansen@intel.com, jglisse@redhat.com, akpm@linux-foundation.org, mingo@kernel.org, kirill.shutemov@linux.intel.com Subject: [PATCH 2/4] mm: Create non-atomic version of SetPageReserved for init use Date: Mon, 10 Sep 2018 16:43:48 -0700 [thread overview] Message-ID: <20180910234348.4068.92164.stgit@localhost.localdomain> (raw) In-Reply-To: <20180910232615.4068.29155.stgit@localhost.localdomain> From: Alexander Duyck <alexander.h.duyck@intel.com> 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 tried adding a bit of documentation based on commit <f1dd2cd13c4> ("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 <mhocko@suse.com> Signed-off-by: Alexander Duyck <alexander.h.duyck@intel.com> --- include/linux/page-flags.h | 1 + mm/page_alloc.c | 17 +++++++++++++++-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/include/linux/page-flags.h b/include/linux/page-flags.h index d00216cf00f8..1b1f8e0378ae 100644 --- a/include/linux/page-flags.h +++ b/include/linux/page-flags.h @@ -300,6 +300,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 89d2a2ab3fe6..a9b095a72fd9 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -1231,7 +1231,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); } } } @@ -5517,8 +5522,16 @@ void __meminit memmap_init_zone(unsigned long size, int nid, unsigned long zone, not_early: page = pfn_to_page(pfn); __init_single_page(page, pfn, zone, nid); + + /* + * Mark page reserved as it will need to wait for onlining + * phase for it to be fully associated with a zone. + * + * We can use the non-atomic __set_bit operation for setting + * the flag as we are still initializing the pages. + */ if (context == MEMMAP_HOTPLUG) - SetPageReserved(page); + __SetPageReserved(page); /* * Mark the block movable so that blocks are reserved for _______________________________________________ Linux-nvdimm mailing list Linux-nvdimm@lists.01.org https://lists.01.org/mailman/listinfo/linux-nvdimm
next prev parent reply other threads:[~2018-09-10 23:43 UTC|newest] Thread overview: 31+ messages / expand[flat|nested] mbox.gz Atom feed top 2018-09-10 23:43 [PATCH 0/4] Address issues slowing persistent memory initialization Alexander Duyck 2018-09-10 23:43 ` [PATCH 1/4] mm: Provide kernel parameter to allow disabling page init poisoning Alexander Duyck 2018-09-11 0:35 ` Alexander Duyck 2018-09-11 16:50 ` Dan Williams 2018-09-11 20:01 ` Alexander Duyck 2018-09-11 20:24 ` Dan Williams 2018-09-12 13:24 ` Pasha Tatashin 2018-09-12 14:10 ` Michal Hocko 2018-09-12 14:49 ` Alexander Duyck 2018-09-12 15:23 ` Dave Hansen 2018-09-12 16:36 ` Alexander Duyck 2018-09-12 16:43 ` Dave Hansen 2018-09-10 23:43 ` Alexander Duyck [this message] 2018-09-12 13:28 ` [PATCH 2/4] mm: Create non-atomic version of SetPageReserved for init use Pasha Tatashin 2018-09-10 23:43 ` [PATCH 3/4] mm: Defer ZONE_DEVICE page initialization to the point where we init pgmap Alexander Duyck 2018-09-11 7:49 ` kbuild test robot 2018-09-11 7:54 ` kbuild test robot 2018-09-11 22:35 ` Dan Williams 2018-09-12 0:51 ` Alexander Duyck 2018-09-12 0:59 ` Dan Williams 2018-09-12 13:59 ` Pasha Tatashin 2018-09-12 15:48 ` Alexander Duyck 2018-09-12 15:54 ` Pasha Tatashin 2018-09-12 16:44 ` Alexander Duyck 2018-09-12 16:50 ` Dan Williams 2018-09-12 17:46 ` Pasha Tatashin 2018-09-12 19:11 ` Dan Williams 2018-09-10 23:44 ` [PATCH 4/4] nvdimm: Trigger the device probe on a cpu local to the device Alexander Duyck 2018-09-11 0:37 ` Alexander Duyck 2018-09-12 5:48 ` Dan Williams 2018-09-12 13:44 ` Pasha Tatashin
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20180910234348.4068.92164.stgit@localhost.localdomain \ --to=alexander.duyck@gmail.com \ --cc=akpm@linux-foundation.org \ --cc=dave.hansen@intel.com \ --cc=jglisse@redhat.com \ --cc=kirill.shutemov@linux.intel.com \ --cc=linux-kernel@vger.kernel.org \ --cc=linux-mm@kvack.org \ --cc=linux-nvdimm@lists.01.org \ --cc=mhocko@suse.com \ --cc=mingo@kernel.org \ --cc=pavel.tatashin@microsoft.com \ --subject='Re: [PATCH 2/4] mm: Create non-atomic version of SetPageReserved for init use' \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).