From 1564eb0e070f853905099863e4defb44eea3edb8 Mon Sep 17 00:00:00 2001 From: Huang Haowei Date: Wed, 12 Jul 2023 09:53:13 +0800 Subject: [PATCH 1/2] anolis: mm: coldpgs: relax in reclaim_coldpgs_read_stats ANBZ: #6075 The reclaim_coldpgs_read_stats function shows the statistics of reclaimed pages, but it may take up CPU for a long time to accumulate all the child memcgs, which may then result in scheduling delay. Signed-off-by: zhongjiang-ali Signed-off-by: Xu Yu Signed-off-by: Huang Haowei --- mm/coldpgs.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/mm/coldpgs.c b/mm/coldpgs.c index 8793f385e027..b53fde516225 100644 --- a/mm/coldpgs.c +++ b/mm/coldpgs.c @@ -1453,6 +1453,9 @@ static int reclaim_coldpgs_read_stats(struct seq_file *m, void *v) */ for (i = 0; i < RECLAIM_COLDPGS_STAT_MAX; i++) total->counts[i] += stats->counts[i]; + + /* Avoid taking up CPU too long time. */ + cond_resched(); } for (i = 0; i < RECLAIM_COLDPGS_STAT_MAX; i++) { -- Gitee From ba738b66b51e09343482a0765d7122934e182dc9 Mon Sep 17 00:00:00 2001 From: Huang Haowei Date: Wed, 12 Jul 2023 14:53:37 +0800 Subject: [PATCH 2/2] anolis: mm: coldpgs: batch free unref pages ANBZ: #6075 To free unref page list in one shot may result in scheduling delay, when the number of pages is enormous. This takes filter->batch into consideration when freeing unref page list in reclaim_coldpgs_from_list. Signed-off-by: Xu Yu Signed-off-by: Huang Haowei --- mm/coldpgs.c | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/mm/coldpgs.c b/mm/coldpgs.c index b53fde516225..9d98739c6cef 100644 --- a/mm/coldpgs.c +++ b/mm/coldpgs.c @@ -925,7 +925,33 @@ static unsigned long reclaim_coldpgs_from_list(struct mem_cgroup *memcg, #ifdef CONFIG_ARCH_WANT_BATCHED_UNMAP_TLB_FLUSH my_try_to_unmap_flush(); #endif - my_free_unref_page_list(&free_pages); + + if (filter->batch) { + /* Free pages in batch */ + LIST_HEAD(batch_free_pages); + + batch = 0; + + while (!list_empty(&free_pages)) { + page = lru_to_page(&free_pages); + list_move(&page->lru, &batch_free_pages); + + if (++batch >= filter->batch) { + my_free_unref_page_list(&batch_free_pages); + + cond_resched(); + batch = 0; + INIT_LIST_HEAD(&batch_free_pages); + } + } + + /* Don't forget the remaining pages */ + if (!list_empty(&batch_free_pages)) + my_free_unref_page_list(&batch_free_pages); + } else { + /* Free pages in one shot */ + my_free_unref_page_list(&free_pages); + } /* Put all pages back to the list */ list_splice(&keep_pages, list); -- Gitee