memcg: prevent OOM with too many dirty pages
[platform/adaptation/renesas_rcar/renesas_kernel.git] / mm / vmscan.c
index 8880401..ca43aa0 100644 (file)
@@ -720,9 +720,26 @@ static unsigned long shrink_page_list(struct list_head *page_list,
                        (PageSwapCache(page) && (sc->gfp_mask & __GFP_IO));
 
                if (PageWriteback(page)) {
-                       nr_writeback++;
-                       unlock_page(page);
-                       goto keep;
+                       /*
+                        * memcg doesn't have any dirty pages throttling so we
+                        * could easily OOM just because too many pages are in
+                        * writeback from reclaim and there is nothing else to
+                        * reclaim.
+                        *
+                        * Check may_enter_fs, certainly because a loop driver
+                        * thread might enter reclaim, and deadlock if it waits
+                        * on a page for which it is needed to do the write
+                        * (loop masks off __GFP_IO|__GFP_FS for this reason);
+                        * but more thought would probably show more reasons.
+                        */
+                       if (!global_reclaim(sc) && PageReclaim(page) &&
+                                       may_enter_fs)
+                               wait_on_page_writeback(page);
+                       else {
+                               nr_writeback++;
+                               unlock_page(page);
+                               goto keep;
+                       }
                }
 
                references = page_check_references(page, sc);