Revert "FROMLIST: mm: multi-gen LRU: thrashing prevention"
This reverts commit e8507816d1757208e1f88e1798222c601550da34.
To be replaced with upstream version.
Bug: 249601646
Change-Id: I65c85dfac185be27bb14a8be7324c5cc985df9c8
Signed-off-by: Kalesh Singh <kaleshsingh@google.com>
diff --git a/mm/vmscan.c b/mm/vmscan.c
index 7f06bda..6b1ddca 100644
--- a/mm/vmscan.c
+++ b/mm/vmscan.c
@@ -4115,7 +4115,6 @@ static void inc_max_seq(struct lruvec *lruvec)
for (type = 0; type < ANON_AND_FILE; type++)
reset_ctrl_pos(lruvec, type, false);
- WRITE_ONCE(lrugen->timestamps[next], jiffies);
/* make sure preceding modifications appear */
smp_store_release(&lrugen->max_seq, lrugen->max_seq + 1);
@@ -4241,8 +4240,7 @@ static long get_nr_evictable(struct lruvec *lruvec, unsigned long max_seq,
return total > 0 ? total : 0;
}
-static bool age_lruvec(struct lruvec *lruvec, struct scan_control *sc,
- unsigned long min_ttl)
+static void age_lruvec(struct lruvec *lruvec, struct scan_control *sc)
{
bool need_aging;
long nr_to_scan;
@@ -4251,22 +4249,14 @@ static bool age_lruvec(struct lruvec *lruvec, struct scan_control *sc,
DEFINE_MAX_SEQ(lruvec);
DEFINE_MIN_SEQ(lruvec);
- if (min_ttl) {
- int gen = lru_gen_from_seq(min_seq[LRU_GEN_FILE]);
- unsigned long birth = READ_ONCE(lruvec->lrugen.timestamps[gen]);
-
- if (time_is_after_jiffies(birth + min_ttl))
- return false;
- }
-
mem_cgroup_calculate_protection(NULL, memcg);
if (mem_cgroup_below_min(memcg))
- return false;
+ return;
nr_to_scan = get_nr_evictable(lruvec, max_seq, min_seq, swappiness, &need_aging);
if (!nr_to_scan)
- return false;
+ return;
nr_to_scan >>= sc->priority;
@@ -4275,18 +4265,11 @@ static bool age_lruvec(struct lruvec *lruvec, struct scan_control *sc,
if (nr_to_scan && need_aging && (!mem_cgroup_below_low(memcg) || sc->memcg_low_reclaim))
try_to_inc_max_seq(lruvec, max_seq, sc, swappiness, false);
-
- return true;
}
-/* to protect the working set of the last N jiffies */
-static unsigned long lru_gen_min_ttl __read_mostly;
-
static void lru_gen_age_node(struct pglist_data *pgdat, struct scan_control *sc)
{
struct mem_cgroup *memcg;
- bool success = false;
- unsigned long min_ttl = READ_ONCE(lru_gen_min_ttl);
VM_BUG_ON(!current_is_kswapd());
@@ -4312,29 +4295,12 @@ static void lru_gen_age_node(struct pglist_data *pgdat, struct scan_control *sc)
do {
struct lruvec *lruvec = mem_cgroup_lruvec(memcg, pgdat);
- if (age_lruvec(lruvec, sc, min_ttl))
- success = true;
+ age_lruvec(lruvec, sc);
cond_resched();
} while ((memcg = mem_cgroup_iter(NULL, memcg, NULL)));
current->reclaim_state->mm_walk = NULL;
-
- /*
- * The main goal is to OOM kill if every generation from all memcgs is
- * younger than min_ttl. However, another theoretical possibility is all
- * memcgs are either below min or empty.
- */
- if (!success && mutex_trylock(&oom_lock)) {
- struct oom_control oc = {
- .gfp_mask = sc->gfp_mask,
- .order = sc->order,
- };
-
- out_of_memory(&oc);
-
- mutex_unlock(&oom_lock);
- }
}
/*
@@ -5053,28 +5019,6 @@ static void lru_gen_change_state(bool enable)
* sysfs interface
******************************************************************************/
-static ssize_t show_min_ttl(struct kobject *kobj, struct kobj_attribute *attr, char *buf)
-{
- return sprintf(buf, "%u\n", jiffies_to_msecs(READ_ONCE(lru_gen_min_ttl)));
-}
-
-static ssize_t store_min_ttl(struct kobject *kobj, struct kobj_attribute *attr,
- const char *buf, size_t len)
-{
- unsigned int msecs;
-
- if (kstrtouint(buf, 0, &msecs))
- return -EINVAL;
-
- WRITE_ONCE(lru_gen_min_ttl, msecs_to_jiffies(msecs));
-
- return len;
-}
-
-static struct kobj_attribute lru_gen_min_ttl_attr = __ATTR(
- min_ttl_ms, 0644, show_min_ttl, store_min_ttl
-);
-
static ssize_t show_enable(struct kobject *kobj, struct kobj_attribute *attr, char *buf)
{
unsigned int caps = 0;
@@ -5123,7 +5067,6 @@ static struct kobj_attribute lru_gen_enabled_attr = __ATTR(
);
static struct attribute *lru_gen_attrs[] = {
- &lru_gen_min_ttl_attr.attr,
&lru_gen_enabled_attr.attr,
NULL
};
@@ -5139,16 +5082,12 @@ static struct attribute_group lru_gen_attr_group = {
void lru_gen_init_lruvec(struct lruvec *lruvec)
{
- int i;
int gen, type, zone;
struct lru_gen_struct *lrugen = &lruvec->lrugen;
lrugen->max_seq = MIN_NR_GENS + 1;
lrugen->enabled = lru_gen_enabled();
- for (i = 0; i <= MIN_NR_GENS + 1; i++)
- lrugen->timestamps[i] = jiffies;
-
for_each_gen_type_zone(gen, type, zone)
INIT_LIST_HEAD(&lrugen->lists[gen][type][zone]);