Re: [v6 00/15] complete deferred page initialization

From: Michal Hocko
Date: Fri Aug 11 2017 - 03:58:35 EST


[I am sorry I didn't get to your previous versions]

On Mon 07-08-17 16:38:34, Pavel Tatashin wrote:
[...]
> SMP machines can benefit from the DEFERRED_STRUCT_PAGE_INIT config option,
> which defers initializing struct pages until all cpus have been started so
> it can be done in parallel.
>
> However, this feature is sub-optimal, because the deferred page
> initialization code expects that the struct pages have already been zeroed,
> and the zeroing is done early in boot with a single thread only. Also, we
> access that memory and set flags before struct pages are initialized. All
> of this is fixed in this patchset.
>
> In this work we do the following:
> - Never read access struct page until it was initialized

How is this enforced? What about pfn walkers? E.g. page_ext
initialization code (page owner in particular)

> - Never set any fields in struct pages before they are initialized
> - Zero struct page at the beginning of struct page initialization

Please give us a more highlevel description of how your reimplementation
works and how is the patchset organized. I will go through those patches
but it is always good to give an overview in the cover letter to make
the review easier.

> Performance improvements on x86 machine with 8 nodes:
> Intel(R) Xeon(R) CPU E7-8895 v3 @ 2.60GHz
>
> Single threaded struct page init: 7.6s/T improvement
> Deferred struct page init: 10.2s/T improvement

What are before and after numbers and how have you measured them.
>
> Pavel Tatashin (15):
> x86/mm: reserve only exiting low pages
> x86/mm: setting fields in deferred pages
> sparc64/mm: setting fields in deferred pages
> mm: discard memblock data later
> mm: don't accessed uninitialized struct pages
> sparc64: simplify vmemmap_populate
> mm: defining memblock_virt_alloc_try_nid_raw
> mm: zero struct pages during initialization
> sparc64: optimized struct page zeroing
> x86/kasan: explicitly zero kasan shadow memory
> arm64/kasan: explicitly zero kasan shadow memory
> mm: explicitly zero pagetable memory
> mm: stop zeroing memory during allocation in vmemmap
> mm: optimize early system hash allocations
> mm: debug for raw alloctor
>
> arch/arm64/mm/kasan_init.c | 42 ++++++++++
> arch/sparc/include/asm/pgtable_64.h | 30 +++++++
> arch/sparc/mm/init_64.c | 31 +++-----
> arch/x86/kernel/setup.c | 5 +-
> arch/x86/mm/init_64.c | 9 ++-
> arch/x86/mm/kasan_init_64.c | 67 ++++++++++++++++
> include/linux/bootmem.h | 27 +++++++
> include/linux/memblock.h | 9 ++-
> include/linux/mm.h | 9 +++
> mm/memblock.c | 152 ++++++++++++++++++++++++++++--------
> mm/nobootmem.c | 16 ----
> mm/page_alloc.c | 31 +++++---
> mm/sparse-vmemmap.c | 10 ++-
> mm/sparse.c | 6 +-
> 14 files changed, 356 insertions(+), 88 deletions(-)
>
> --
> 2.14.0

--
Michal Hocko
SUSE Labs