diff --git a/mm/vmscan.c b/mm/vmscan.c
index 61a66881235d44e4370759e5a7358047b3df8584..8dfa59866af23748336c3d26c0470b8b6ca19857 100644
--- a/mm/vmscan.c
+++ b/mm/vmscan.c
@@ -2112,7 +2112,12 @@ static void shrink_mem_cgroup_zone(int priority, struct mem_cgroup_zone *mz,
 		 * with multiple processes reclaiming pages, the total
 		 * freeing target can get unreasonably large.
 		 */
-		if (nr_reclaimed >= nr_to_reclaim && priority < DEF_PRIORITY)
+		if (nr_reclaimed >= nr_to_reclaim)
+			nr_to_reclaim = 0;
+		else
+			nr_to_reclaim -= nr_reclaimed;
+
+		if (!nr_to_reclaim && priority < DEF_PRIORITY)
 			break;
 	}
 	blk_finish_plug(&plug);