[v6 00/15] complete deferred page initialization

Michal Hocko mhocko at kernel.org
Fri Aug 11 00:58:26 PDT 2017


[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



More information about the linux-arm-kernel mailing list