[PATCH v2 0/1] Skip over regions of invalid pfns with NUMA=n && HAVE_MEMBLOCK=y

From: Eugeniu Rosca
Date: Sun Jan 21 2018 - 09:50:28 EST


Hello MM/kernel experts,

I include this cover letter to present some background and motivation
behind the patch, although the description included in the patch itself
should be reach enough already.

The context of this change is some effort to optimize the boot time of
Rcar Gen3 SoC family, which at its roots is driven by automotive
requirements like (well-known?) "2-seconds-to-rear-view-camera".

To fulfill those, we create a defconfig based on vanilla arm64
defconfig, which is then tailored to Rcar Gen3 SoC needs. This allows
us to reduce the kernel binary image size by almost 50%. We are very
picky during this cleanup process, to the point that, as showcased
with this patch, we start to submit changes in MM core part, where
(to be honest) we don't have much expertise.

As mentioned in the description of attached patch, disabling NUMA in
the v4.15-rc8 arm64 kernel decreases the binary Image by 64kB, but,
at the same time, increases the H3ULCB boot time by ~140ms, which is
counterintuitive, since by disabling NUMA we expect to get rid of
unused NUMA infrastructure and skip unneeded NUMA init.

As already mentioned in the attached patch, the slowdown happens because
v4.11-rc1 commit b92df1de5d28 ("mm: page_alloc: skip over regions of
invalid pfns where possible") conditions itself on
CONFIG_HAVE_MEMBLOCK_NODE_MAP, which on arm64 depends on NUMA:
$> git grep HAVE_MEMBLOCK_NODE_MAP | grep arm64
arch/arm64/Kconfig: select HAVE_MEMBLOCK_NODE_MAP if NUMA

The attached patch attempts to present some evidence that the
aforementioned commit can speed up the execution of memmap_init_zone()
not only on arm64 NUMA, but also on arm64 non-NUMA machines. This is
achieved by "relaxing" the dependency of memblock_next_valid_pfn()
from being guarded by CONFIG_HAVE_MEMBLOCK_NODE_MAP to being
guarded by the more generic CONFIG_HAVE_MEMBLOCK.

If this doesn't sound of feel right, I would appreciate your feedback.
I will definitely participate in testing any alternative proposals
that may arise in your mind. TIA!

Best regards,
Eugeniu.

Changes v1->v2:
- Fix ARCH=tile build error [1], signalled by kbuild test robot
- Re-measure Rcar H3ULCB boot time improvement on v4.15-rc8

Eugeniu Rosca (1):
mm: page_alloc: skip over regions of invalid pfns on UMA

include/linux/memblock.h | 3 ++-
mm/memblock.c | 2 ++
mm/page_alloc.c | 2 +-
3 files changed, 5 insertions(+), 2 deletions(-)

[1] kbuild test robot reported for ARCH=tile with [PATCH v1]:

mm/page_alloc.c: In function 'memmap_init_zone':
>> mm/page_alloc.c:5359:10: error: implicit declaration of function
>> 'memblock_next_valid_pfn'; did you mean 'memblock_virt_alloc_low'?
>> [-Werror=implicit-function-declaration]
pfn = memblock_next_valid_pfn(pfn, end_pfn) - 1;
^~~~~~~~~~~~~~~~~~~~~~~
memblock_virt_alloc_low
cc1: some warnings being treated as errors

--
2.14.2