ANDROID: mm: memblock: avoid to create memmap for memblock nomap regions

This 'commit 86588296acbf ("fdt: Properly handle "no-map" field in the
memory region")' is keeping the no-map regions in memblock.memory with
MEMBLOCK_NOMAP flag set to use no-map memory for EFI using memblock
api's, but during the initialization sparse_init mark all memblock.memory
as present using for_each_mem_pfn_range, which is creating the memmap for
no-map memblock regions.

Upstream has suggested to make use of bootloader to pass this as not a
memory,but because of possibility that some bootloaders might not support
this and also due to time constraints in evaluating this approach on 5.10,
Use command line parameter as a temporary solution. Get in the appropriate
solution later after further discussion with upstream.

Add kernel param "android12_only.will_be_removed_soon.memblock_nomap_remove"
which when enabled will remove page structs for these regions using memblock_remove.
With this change we will be able to save ~11MB memory for ~612MB carve out.

android12_only.will_be_removed_soon.memblock_nomap_remove=true:
[    0.000000] memblock_alloc_exact_nid_raw: 115343360 bytes
align=0x200000 nid=0 from=0x0000000080000000 max_addr=0x0000000000000000
sparse_buffer_init+0x60/0x8c
[    0.000000] memblock_reserve: [0x0000000932c00000-0x00000009399fffff]
memblock_alloc_range_nid+0xbc/0x1a0
[    0.000000] On node 0 totalpages: 1627824
[    0.000000] DMA32 zone: 5383 pages used for memmap
[    0.000000] Normal zone: 20052 pages used for memmap

Default or android12_only.will_be_removed_soon.memblock_nomap_remove=false:
[    0.000000] memblock_alloc_exact_nid_raw: 117440512 bytes
align=0x200000 nid=0 from=0x0000000080000000 max_addr=0x0000000000000000
sparse_buffer_init+0x60/0x8c
[    0.000000] memblock_reserve: [0x0000000932a00000-0x00000009399fffff]
memblock_alloc_range_nid+0xbc/0x1a0
[    0.000000] On node 0 totalpages: 1788416
[    0.000000] DMA32 zone: 8192 pages used for memmap
[    0.000000] Normal zone: 20052 pages used for memmap.

Change-Id: I34a7d46f02a6df7c769af3e53e44e49d6fc515af
Bug: 227974747
Link: https://lore.kernel.org/all/20210115172949.GA1495225@robh.at.kernel.org
Signed-off-by: Faiyaz Mohammed <quic_faiyazm@quicinc.com>
Signed-off-by: Vijayanand Jitta <quic_vjitta@quicinc.com>
This commit is contained in:
Vijayanand Jitta
2022-08-11 20:05:52 +05:30
committed by Todd Kjos
parent 97e5ac2b55
commit 3c2f107ad2
4 changed files with 23 additions and 0 deletions

View File

@@ -2533,6 +2533,12 @@
memblock=debug [KNL] Enable memblock debug messages.
android12_only.will_be_removed_soon.memblock_nomap_remove= [KNL]
Setting this to true through kernel command line will
call memblock_remove on the regions marked with no-map
property thereby saving memory by removing page structs
for those regions. By default this is set to false.
load_ramdisk= [RAM] [Deprecated]
lockd.nlm_grace_period=P [NFS] Assign grace period.

View File

@@ -1181,6 +1181,9 @@ int __init __weak early_init_dt_reserve_memory_arch(phys_addr_t base,
if (memblock_is_region_reserved(base, size))
return -EBUSY;
if (memblock_is_nomap_remove())
return memblock_remove(base, size);
return memblock_mark_nomap(base, size);
}
return memblock_reserve(base, size);

View File

@@ -487,6 +487,7 @@ bool memblock_is_map_memory(phys_addr_t addr);
bool memblock_is_region_memory(phys_addr_t base, phys_addr_t size);
bool memblock_is_reserved(phys_addr_t addr);
bool memblock_is_region_reserved(phys_addr_t base, phys_addr_t size);
bool memblock_is_nomap_remove(void);
void memblock_dump_all(void);

View File

@@ -152,6 +152,7 @@ static __refdata struct memblock_type *memblock_memory = &memblock.memory;
} while (0)
static int memblock_debug __initdata_memblock;
static bool memblock_nomap_remove __initdata_memblock;
static bool system_has_some_mirror __initdata_memblock = false;
static int memblock_can_resize __initdata_memblock;
static int memblock_memory_in_slab __initdata_memblock = 0;
@@ -1904,6 +1905,18 @@ static int __init early_memblock(char *p)
}
early_param("memblock", early_memblock);
static int __init early_memblock_nomap(char *str)
{
kstrtobool(str, &memblock_nomap_remove);
return 0;
}
early_param("android12_only.will_be_removed_soon.memblock_nomap_remove", early_memblock_nomap);
bool __init memblock_is_nomap_remove(void)
{
return memblock_nomap_remove;
}
static void __init __free_pages_memory(unsigned long start, unsigned long end)
{
int order;