| 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 |
| |