The patch titled Subject: mm/vmscan.c: fix potential deadlock in reclaim_pages() has been added to the -mm tree. Its filename is mm-vmscanc-fix-potential-deadlock-in-reclaim_pages.patch This patch should soon appear at https://ozlabs.org/~akpm/mmots/broken-out/mm-vmscanc-fix-potential-deadlock-in-reclaim_pages.patch and later at https://ozlabs.org/~akpm/mmotm/broken-out/mm-vmscanc-fix-potential-deadlock-in-reclaim_pages.patch Before you just go and hit "reply", please: a) Consider who else should be cc'ed b) Prefer to cc a suitable mailing list as well c) Ideally: find the original patch on the mailing list and do a reply-to-all to that, adding suitable additional cc's *** Remember to use Documentation/process/submit-checklist.rst when testing your code *** The -mm tree is included into linux-next and is updated there every 3-4 working days ------------------------------------------------------ From: Yu Zhao <yuzhao@xxxxxxxxxx> Subject: mm/vmscan.c: fix potential deadlock in reclaim_pages() Use memalloc_noreclaim_save()/memalloc_noreclaim_restore() in reclaim_pages() to prevent the page reclaim from going into the block I/O layer recursively and deadlock. Link: https://lkml.kernel.org/r/20210614194727.2684053-1-yuzhao@xxxxxxxxxx Signed-off-by: Yu Zhao <yuzhao@xxxxxxxxxx> Cc: Minchan Kim <minchan@xxxxxxxxxx> Signed-off-by: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx> --- mm/vmscan.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) --- a/mm/vmscan.c~mm-vmscanc-fix-potential-deadlock-in-reclaim_pages +++ a/mm/vmscan.c @@ -1707,6 +1707,7 @@ unsigned int reclaim_clean_pages_from_li unsigned int nr_reclaimed; struct page *page, *next; LIST_HEAD(clean_pages); + unsigned int noreclaim_flag; list_for_each_entry_safe(page, next, page_list, lru) { if (!PageHuge(page) && page_is_file_lru(page) && @@ -1717,8 +1718,17 @@ unsigned int reclaim_clean_pages_from_li } } + /* + * We should be safe here since we are only dealing with file pages and + * we are not kswapd and therefore cannot write dirty file pages. But + * call memalloc_noreclaim_save() anyway, just in case these conditions + * change in the future. + */ + noreclaim_flag = memalloc_noreclaim_save(); nr_reclaimed = shrink_page_list(&clean_pages, zone->zone_pgdat, &sc, &stat, true); + memalloc_noreclaim_restore(noreclaim_flag); + list_splice(&clean_pages, page_list); mod_node_page_state(zone->zone_pgdat, NR_ISOLATED_FILE, -(long)nr_reclaimed); @@ -2312,6 +2322,7 @@ unsigned long reclaim_pages(struct list_ LIST_HEAD(node_page_list); struct reclaim_stat dummy_stat; struct page *page; + unsigned int noreclaim_flag; struct scan_control sc = { .gfp_mask = GFP_KERNEL, .priority = DEF_PRIORITY, @@ -2320,6 +2331,8 @@ unsigned long reclaim_pages(struct list_ .may_swap = 1, }; + noreclaim_flag = memalloc_noreclaim_save(); + while (!list_empty(page_list)) { page = lru_to_page(page_list); if (nid == NUMA_NO_NODE) { @@ -2356,6 +2369,8 @@ unsigned long reclaim_pages(struct list_ } } + memalloc_noreclaim_restore(noreclaim_flag); + return nr_reclaimed; } _ Patches currently in -mm which might be from yuzhao@xxxxxxxxxx are mm-vmscanc-fix-potential-deadlock-in-reclaim_pages.patch