| From foo@baz Wed Dec 15 03:01:20 PM CET 2021 |
| From: Mark-PK Tsai <mark-pk.tsai@mediatek.com> |
| Date: Mon, 13 Dec 2021 17:41:32 +0800 |
| Subject: memblock: align freed memory map on pageblock boundaries with SPARSEMEM |
| To: <stable@vger.kernel.org> |
| Cc: <rppt@kernel.org>, <akpm@linux-foundation.org>, <linux-arm-kernel@lists.infradead.org>, <linux-kernel@vger.kernel.org>, <linux-mm@kvack.org>, <linux@armlinux.org.uk>, <rppt@linux.ibm.com>, <tony@atomide.com>, <wangkefeng.wang@huawei.com>, <mark-pk.tsai@mediatek.com>, <yj.chiang@mediatek.com> |
| Message-ID: <20211213094135.1798-3-mark-pk.tsai@mediatek.com> |
| |
| From: Mike Rapoport <rppt@linux.ibm.com> |
| |
| [ Upstream commit f921f53e089a12a192808ac4319f28727b35dc0f ] |
| |
| When CONFIG_SPARSEMEM=y the ranges of the memory map that are freed are not |
| aligned to the pageblock boundaries which breaks assumptions about |
| homogeneity of the memory map throughout core mm code. |
| |
| Make sure that the freed memory map is always aligned on pageblock |
| boundaries regardless of the memory model selection. |
| |
| Signed-off-by: Mike Rapoport <rppt@linux.ibm.com> |
| Tested-by: Tony Lindgren <tony@atomide.com> |
| Link: https://lore.kernel.org/lkml/20210630071211.21011-1-rppt@kernel.org/ |
| [backport upstream modification in mm/memblock.c to arch/arm/mm/init.c] |
| Signed-off-by: Mark-PK Tsai <mark-pk.tsai@mediatek.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| arch/arm/mm/init.c | 8 +++++--- |
| 1 file changed, 5 insertions(+), 3 deletions(-) |
| |
| --- a/arch/arm/mm/init.c |
| +++ b/arch/arm/mm/init.c |
| @@ -313,14 +313,14 @@ static void __init free_unused_memmap(vo |
| */ |
| start = min(start, |
| ALIGN(prev_end, PAGES_PER_SECTION)); |
| -#else |
| +#endif |
| /* |
| * Align down here since many operations in VM subsystem |
| * presume that there are no holes in the memory map inside |
| * a pageblock |
| */ |
| start = round_down(start, pageblock_nr_pages); |
| -#endif |
| + |
| /* |
| * If we had a previous bank, and there is a space |
| * between the current bank and the previous, free it. |
| @@ -337,9 +337,11 @@ static void __init free_unused_memmap(vo |
| } |
| |
| #ifdef CONFIG_SPARSEMEM |
| - if (!IS_ALIGNED(prev_end, PAGES_PER_SECTION)) |
| + if (!IS_ALIGNED(prev_end, PAGES_PER_SECTION)) { |
| + prev_end = ALIGN(end, pageblock_nr_pages); |
| free_memmap(prev_end, |
| ALIGN(prev_end, PAGES_PER_SECTION)); |
| + } |
| #endif |
| } |
| |