blob: 642df8d1397848f7ce41dbba169e7e1dfc1e86a0 [file] [log] [blame] [edit]
From 8c9812418883b04e3a7a2e5db12012dc2e1b6b14 Mon Sep 17 00:00:00 2001
From: Koki Ryu <kokiryu@google.com>
Date: Thu, 22 Dec 2022 17:30:17 +0900
Subject: [PATCH] CHROMIUM: Add userspace notification for MGLRU generation
creation
Add sysfs_notify so that every time a new MGLRU
generation is created so that user space programs can notice that by
polling /sys/kernel/mm/lru_gen/admin.
BUG=b:260967742
TEST=Built.
Run /google/data/ro/users/su/suleiman/tests/poll.c on /sys/kernel/mm/lru_gen/admin
while generating memory pressure with /google/data/ro/users/su/suleiman/tests/memtoy,
ensuring it returns a POLLPRI event.
Also made sure kernel built with USE=lockdebug doesn't have warnings.
Signed-off-by: Koki Ryu <kokiryu@google.com>
Signed-off-by: Suleiman Souhlal <suleiman@google.com>
Change-Id: I86aa889e360d219939c8e673067822cf340c0f01
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/third_party/kernel/+/4393685
[rebase66(tzungbi):
Revised commit message.
Imported message from https://crrev.com/c/3936130.
Squashed:
FIXUP: CHROMIUM: MGLRU: sysfs notification using a kernfs_node
(https://crrev.com/c/4917866)
]
Signed-off-by: Tzung-Bi Shih <tzungbi@chromium.org>
---
mm/vmscan.c | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/mm/vmscan.c b/mm/vmscan.c
index 499d93c0574fb44dd9ee50f4fe09273c1e3927b4..0536a047e73f09b024977e3fbad42946a5cea333 100644
--- a/mm/vmscan.c
+++ b/mm/vmscan.c
@@ -2545,6 +2545,8 @@ static bool can_age_anon_pages(struct pglist_data *pgdat,
#ifdef CONFIG_LRU_GEN
+static struct kernfs_node *lru_gen_admin_node;
+
#ifdef CONFIG_LRU_GEN_ENABLED
DEFINE_STATIC_KEY_ARRAY_TRUE(lru_gen_caps, NR_LRU_GEN_CAPS);
#define get_cap(cap) static_branch_likely(&lru_gen_caps[cap])
@@ -3836,6 +3838,7 @@ static bool try_to_inc_max_seq(struct lruvec *lruvec, unsigned long seq,
struct lru_gen_mm_state *mm_state = get_mm_state(lruvec);
VM_WARN_ON_ONCE(seq > READ_ONCE(lrugen->max_seq));
+ kernfs_notify(lru_gen_admin_node);
if (!mm_state)
return inc_max_seq(lruvec, seq, can_swap, force_scan);
@@ -5762,11 +5765,14 @@ void lru_gen_exit_memcg(struct mem_cgroup *memcg)
static int __init init_lru_gen(void)
{
+ struct kernfs_node *tmp;
BUILD_BUG_ON(MIN_NR_GENS + 1 >= MAX_NR_GENS);
BUILD_BUG_ON(BIT(LRU_GEN_WIDTH) <= MAX_NR_GENS);
if (sysfs_create_group(mm_kobj, &lru_gen_attr_group))
pr_err("lru_gen: failed to create sysfs group\n");
+ tmp = kernfs_find_and_get(mm_kobj->sd, "lru_gen");
+ lru_gen_admin_node = kernfs_find_and_get(tmp, "admin");
debugfs_create_file("lru_gen", 0644, NULL, NULL, &lru_gen_rw_fops);
debugfs_create_file("lru_gen_full", 0444, NULL, NULL, &lru_gen_ro_fops);
--
2.44.0.396.g6e790dbe36-goog