The patch titled Subject: mm/page_alloc: clear pages in alloc_contig_pages() with init_on_alloc=1 or __GFP_ZERO has been removed from the -mm tree. Its filename was mm-page_alloc-clear-pages-in-alloc_contig_pages-with-init_on_alloc=1-or-__gfp_zero.patch This patch was dropped because it is obsolete ------------------------------------------------------ From: David Hildenbrand <david@xxxxxxxxxx> Subject: mm/page_alloc: clear pages in alloc_contig_pages() with init_on_alloc=1 or __GFP_ZERO commit 6471384af2a6 ("mm: security: introduce init_on_alloc=1 and init_on_free=1 boot options") resulted with init_on_alloc=1 in all pages leaving the buddy via alloc_pages() and friends to be initialized/cleared/zeroed on allocation. However, the same logic is currently not applied to alloc_contig_pages(): allocated pages leaving the buddy aren't cleared with init_on_alloc=1 and init_on_free=0. Let's also properly clear pages on that allocation path and add support for __GFP_ZERO. With this change, we will see double clearing of pages in some cases. One example are gigantic pages (either allocated via CMA, or allocated dynamically via alloc_contig_pages()) - which is the right thing to do (and to be optimized outside of the buddy in the callers) as discussed in https://lkml.kernel.org/r/20201019182853.7467-1-gpiccoli@xxxxxxxxxxxxx This change implies that with init_on_alloc=1 - All CMA allocations will be cleared - Gigantic pages allocated via alloc_contig_pages() will be cleared - virtio-mem memory to be unplugged will be cleared. While this is suboptimal, it's similar to memory balloon drivers handling, where all pages to be inflated will get cleared as well. __GFP_ZERO is not used yet. It's intended to be used in https://lkml.kernel.org/r/20201029162718.29910-1-david@xxxxxxxxxx and I can move that change into a separate patch if desired. Link: https://lkml.kernel.org/r/20201110193240.25401-1-david@xxxxxxxxxx Signed-off-by: David Hildenbrand <david@xxxxxxxxxx> Cc: Alexander Potapenko <glider@xxxxxxxxxx> Cc: Michal Hocko <mhocko@xxxxxxxx> Cc: Mike Kravetz <mike.kravetz@xxxxxxxxxx> Cc: Vlastimil Babka <vbabka@xxxxxxx> Cc: Mike Rapoport <rppt@xxxxxxxxxxxxx> Cc: Oscar Salvador <osalvador@xxxxxxx> Cc: Kees Cook <keescook@xxxxxxxxxxxx> Cc: Michael Ellerman <mpe@xxxxxxxxxxxxxx> Signed-off-by: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx> --- mm/page_alloc.c | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) --- a/mm/page_alloc.c~mm-page_alloc-clear-pages-in-alloc_contig_pages-with-init_on_alloc=1-or-__gfp_zero +++ a/mm/page_alloc.c @@ -8477,6 +8477,19 @@ static int __alloc_contig_migrate_range( return 0; } +static void __alloc_contig_clear_range(unsigned long start_pfn, + unsigned long end_pfn) +{ + unsigned long pfn; + + for (pfn = start_pfn; pfn < end_pfn; pfn += MAX_ORDER_NR_PAGES) { + cond_resched(); + kernel_init_free_pages(pfn_to_page(pfn), + min_t(unsigned long, end_pfn - pfn, + MAX_ORDER_NR_PAGES)); + } +} + /** * alloc_contig_range() -- tries to allocate given range of pages * @start: start PFN to allocate @@ -8485,7 +8498,8 @@ static int __alloc_contig_migrate_range( * #MIGRATE_MOVABLE or #MIGRATE_CMA). All pageblocks * in range must have the same migratetype and it must * be either of the two. - * @gfp_mask: GFP mask to use during compaction + * @gfp_mask: GFP mask to use during compaction. __GFP_ZERO clears allocated + * pages. * * The PFN range does not have to be pageblock or MAX_ORDER_NR_PAGES * aligned. The PFN range must belong to a single zone. @@ -8512,7 +8526,7 @@ int alloc_contig_range(unsigned long sta .mode = MIGRATE_SYNC, .ignore_skip_hint = true, .no_set_skip_hint = true, - .gfp_mask = current_gfp_context(gfp_mask), + .gfp_mask = current_gfp_context(gfp_mask & ~__GFP_ZERO), .alloc_contig = true, }; INIT_LIST_HEAD(&cc.migratepages); @@ -8626,6 +8640,9 @@ int alloc_contig_range(unsigned long sta if (end != outer_end) free_contig_range(end, outer_end - end); + if (!want_init_on_free() && want_init_on_alloc(gfp_mask)) + __alloc_contig_clear_range(start, end); + done: undo_isolate_page_range(pfn_max_align_down(start), pfn_max_align_up(end), migratetype); @@ -8679,7 +8696,8 @@ static bool zone_spans_last_pfn(const st /** * alloc_contig_pages() -- tries to find and allocate contiguous range of pages * @nr_pages: Number of contiguous pages to allocate - * @gfp_mask: GFP mask to limit search and used during compaction + * @gfp_mask: GFP mask to limit search and used during compaction. __GFP_ZERO + * clears allocated pages. * @nid: Target node * @nodemask: Mask for other possible nodes * _ Patches currently in -mm which might be from david@xxxxxxxxxx are mm-page_alloc-clear-all-pages-in-post_alloc_hook-with-init_on_alloc=1.patch