|
@@ -97,8 +97,13 @@ struct scan_control {
|
|
|
/* Can pages be swapped as part of reclaim? */
|
|
|
unsigned int may_swap:1;
|
|
|
|
|
|
- /* Can cgroups be reclaimed below their normal consumption range? */
|
|
|
- unsigned int may_thrash:1;
|
|
|
+ /*
|
|
|
+ * Cgroups are not reclaimed below their configured memory.low,
|
|
|
+ * unless we threaten to OOM. If any cgroups are skipped due to
|
|
|
+ * memory.low and nothing was reclaimed, go back for memory.low.
|
|
|
+ */
|
|
|
+ unsigned int memcg_low_reclaim:1;
|
|
|
+ unsigned int memcg_low_skipped:1;
|
|
|
|
|
|
unsigned int hibernation_mode:1;
|
|
|
|
|
@@ -2512,8 +2517,10 @@ static bool shrink_node(pg_data_t *pgdat, struct scan_control *sc)
|
|
|
unsigned long scanned;
|
|
|
|
|
|
if (mem_cgroup_low(root, memcg)) {
|
|
|
- if (!sc->may_thrash)
|
|
|
+ if (!sc->memcg_low_reclaim) {
|
|
|
+ sc->memcg_low_skipped = 1;
|
|
|
continue;
|
|
|
+ }
|
|
|
mem_cgroup_events(memcg, MEMCG_LOW, 1);
|
|
|
}
|
|
|
|
|
@@ -2768,9 +2775,10 @@ retry:
|
|
|
return 1;
|
|
|
|
|
|
/* Untapped cgroup reserves? Don't OOM, retry. */
|
|
|
- if (!sc->may_thrash) {
|
|
|
+ if (sc->memcg_low_skipped) {
|
|
|
sc->priority = initial_priority;
|
|
|
- sc->may_thrash = 1;
|
|
|
+ sc->memcg_low_reclaim = 1;
|
|
|
+ sc->memcg_low_skipped = 0;
|
|
|
goto retry;
|
|
|
}
|
|
|
|