From: Liu Shixin <liushixin2(a)huawei.com>
When a task in memcg readaheads file pages, page_cache_ra_unbounded()
will try to readahead nr_to_read pages. Even if the new allocated page
fails to charge, page_cache_ra_unbounded() still tries to readahead
next page. This leads to too much memory reclaim.
Stop readahead if mem_cgroup_charge() fails, i.e. add_to_page_cache_lru()
returns -ENOMEM.
Signed-off-by: Liu Shixin <liushixin2(a)huawei.com>
Signed-off-by: Jinjiang Tu <tujinjiang(a)huawei.com>
---
mm/readahead.c | 17 ++++++++++++-----
1 file changed, 12 insertions(+), 5 deletions(-)
diff --git a/mm/readahead.c b/mm/readahead.c
index ed23d5dec123..22dd9c8fe808 100644
--- a/mm/readahead.c
+++ b/mm/readahead.c
@@ -220,11 +220,18 @@ void page_cache_ra_unbounded(struct readahead_control *ractl,
if (mapping->a_ops->readpages) {
page->index = index + i;
list_add(&page->lru, &page_pool);
- } else if (add_to_page_cache_lru(page, mapping, index + i,
- gfp_mask) < 0) {
- put_page(page);
- read_pages(ractl, &page_pool, true);
- continue;
+ } else {
+ int ret;
+
+ ret = add_to_page_cache_lru(page, mapping, index + i,
+ gfp_mask);
+ if (ret < 0) {
+ put_page(page);
+ read_pages(ractl, &page_pool, true);
+ if (ret == -ENOMEM)
+ break;
+ continue;
+ }
}
if (i == nr_to_read - lookahead_size)
SetPageReadahead(page);
--
2.25.1