diff --git a/drivers/of/of_reserved_mem.c b/drivers/of/of_reserved_mem.c index 4ea756ac1a69..9ecee51266cf 100644 --- a/drivers/of/of_reserved_mem.c +++ b/drivers/of/of_reserved_mem.c @@ -542,6 +542,8 @@ static void __init fdt_init_reserved_mem_node(struct reserved_mem *rmem) memblock_memsize_record(rmem->name, rmem->base, rmem->size, nomap, reusable); + if (reusable && !of_flat_dt_is_compatible(node, "shared-dma-pool")) + memblock_memsize_mod_reusable_size(rmem->size); } } diff --git a/include/linux/memblock.h b/include/linux/memblock.h index 5d3811b4e9aa..f5dea093d7e1 100644 --- a/include/linux/memblock.h +++ b/include/linux/memblock.h @@ -603,6 +603,7 @@ extern void memblock_memsize_mod_kernel_size(long size); extern void __init memblock_memsize_mod_memmap_size(long size); extern void __init memblock_memsize_kernel_code_data(unsigned long code, unsigned long data, unsigned long ro, unsigned long bss); +extern void memblock_memsize_mod_reusable_size(long size); #else static inline void __init_memblock memblock_memsize_record(const char *name, phys_addr_t base, phys_addr_t size, bool nomap, bool reusable) { } @@ -613,6 +614,7 @@ static inline void memblock_memsize_mod_kernel_size(long size) { } static inline void __init memblock_memsize_mod_memmap_size(long size) { } static inline void __init memblock_memsize_kernel_code_data(unsigned long code, unsigned long data, unsigned long ro, unsigned long bss) { } +static inline void memblock_memsize_mod_reusable_size(long size) { } #endif #endif /* _LINUX_MEMBLOCK_H */ diff --git a/mm/memblock.c b/mm/memblock.c index df8bdd8079ea..35c438146233 100644 --- a/mm/memblock.c +++ b/mm/memblock.c @@ -2084,6 +2084,7 @@ static unsigned long memsize_code __initdata_memblock; static unsigned long memsize_data __initdata_memblock; static unsigned long memsize_ro __initdata_memblock; static unsigned long memsize_bss __initdata_memblock; +static long memsize_reusable_size; void __init memblock_memsize_enable_tracking(void) { @@ -2133,6 +2134,11 @@ static void __init_memblock memsize_get_valid_name(char *valid_name, const char strscpy(valid_name, head, valid_size); } +void memblock_memsize_mod_reusable_size(long size) +{ + memsize_reusable_size += size; +} + static inline struct memsize_rgn_struct * __init_memblock memsize_get_new_rgn(void) { if (memsize_rgn_count == ARRAY_SIZE(memsize_rgn)) { @@ -2802,6 +2808,7 @@ static int memblock_memsize_show(struct seq_file *m, void *private) etc -= memsize_code + memsize_data + memsize_ro + memsize_bss + memsize_memmap; + system += memsize_reusable_size; sort(memsize_rgn, memsize_rgn_count, sizeof(memsize_rgn[0]), memsize_rgn_cmp, NULL); for (i = 0; i < memsize_rgn_count; i++) {