shrink_lruvec(lruvec, sc);
/*
- * Limit reclaim has historically picked one
- * memcg and scanned it with decreasing
- * priority levels until nr_to_reclaim had
- * been reclaimed. This priority cycle is
- * thus over after a single memcg.
- *
- * Direct reclaim and kswapd, on the other
- * hand, have to scan all memory cgroups to
- * fulfill the overall scan target for the
+ * Direct reclaim and kswapd have to scan all memory
+ * cgroups to fulfill the overall scan target for the
* zone.
+ *
+ * Limit reclaim, on the other hand, only cares about
+ * nr_to_reclaim pages to be reclaimed and it will
+ * retry with decreasing priority if one round over the
+ * whole hierarchy is not sufficient.
*/
- if (!global_reclaim(sc)) {
+ if (!global_reclaim(sc) &&
+ sc->nr_reclaimed >= sc->nr_to_reclaim) {
mem_cgroup_iter_break(root, memcg);
break;
}