From ffed79e366a08959be9ff47c838d5e42d059c188 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Thu, 7 Sep 2023 10:48:30 +0000 Subject: [PATCH] Revert "sched/psi: use kernfs polling functions for PSI trigger polling" This reverts commit 92cc0153324b6ae8577a39f5bf2cd83c9a34ea6a which is commit aff037078ecaecf34a7c2afab1341815f90fba5e upstream. It is part of a patch series that breaks the Android API. If this series is needed in Android devices in the future, it can come back in an ABI-safe manner. Bug: 161946584 Change-Id: I2c941ec44d5261a914d95591b7918e46f7db825a Signed-off-by: Greg Kroah-Hartman --- include/linux/psi.h | 5 ++--- include/linux/psi_types.h | 3 --- kernel/cgroup/cgroup.c | 2 +- kernel/sched/psi.c | 29 ++++++++--------------------- 4 files changed, 11 insertions(+), 28 deletions(-) diff --git a/include/linux/psi.h b/include/linux/psi.h index e0745873e3f2..ab26200c2803 100644 --- a/include/linux/psi.h +++ b/include/linux/psi.h @@ -23,9 +23,8 @@ void psi_memstall_enter(unsigned long *flags); void psi_memstall_leave(unsigned long *flags); int psi_show(struct seq_file *s, struct psi_group *group, enum psi_res res); -struct psi_trigger *psi_trigger_create(struct psi_group *group, char *buf, - enum psi_res res, struct file *file, - struct kernfs_open_file *of); +struct psi_trigger *psi_trigger_create(struct psi_group *group, + char *buf, enum psi_res res, struct file *file); void psi_trigger_destroy(struct psi_trigger *t); __poll_t psi_trigger_poll(void **trigger_ptr, struct file *file, diff --git a/include/linux/psi_types.h b/include/linux/psi_types.h index f1fd3a8044e0..040c089581c6 100644 --- a/include/linux/psi_types.h +++ b/include/linux/psi_types.h @@ -137,9 +137,6 @@ struct psi_trigger { /* Wait queue for polling */ wait_queue_head_t event_wait; - /* Kernfs file for cgroup triggers */ - struct kernfs_open_file *of; - /* Pending event flag */ int event; diff --git a/kernel/cgroup/cgroup.c b/kernel/cgroup/cgroup.c index 9a9603937e31..556c3eeb64dc 100644 --- a/kernel/cgroup/cgroup.c +++ b/kernel/cgroup/cgroup.c @@ -3777,7 +3777,7 @@ static ssize_t pressure_write(struct kernfs_open_file *of, char *buf, } psi = cgroup_psi(cgrp); - new = psi_trigger_create(psi, buf, res, of->file, of); + new = psi_trigger_create(psi, buf, res, of->file); if (IS_ERR(new)) { cgroup_put(cgrp); return PTR_ERR(new); diff --git a/kernel/sched/psi.c b/kernel/sched/psi.c index 2507c90b74c1..2183d3431cde 100644 --- a/kernel/sched/psi.c +++ b/kernel/sched/psi.c @@ -494,12 +494,8 @@ static u64 update_triggers(struct psi_group *group, u64 now, bool *update_total, continue; /* Generate an event */ - if (cmpxchg(&t->event, 0, 1) == 0) { - if (t->of) - kernfs_notify(t->of->kn); - else - wake_up_interruptible(&t->event_wait); - } + if (cmpxchg(&t->event, 0, 1) == 0) + wake_up_interruptible(&t->event_wait); t->last_event_time = now; /* Reset threshold breach flag once event got generated */ t->pending_event = false; @@ -1276,9 +1272,8 @@ int psi_show(struct seq_file *m, struct psi_group *group, enum psi_res res) return 0; } -struct psi_trigger *psi_trigger_create(struct psi_group *group, char *buf, - enum psi_res res, struct file *file, - struct kernfs_open_file *of) +struct psi_trigger *psi_trigger_create(struct psi_group *group, + char *buf, enum psi_res res, struct file *file) { struct psi_trigger *t; enum psi_states state; @@ -1337,9 +1332,7 @@ struct psi_trigger *psi_trigger_create(struct psi_group *group, char *buf, t->event = 0; t->last_event_time = 0; - t->of = of; - if (!of) - init_waitqueue_head(&t->event_wait); + init_waitqueue_head(&t->event_wait); t->pending_event = false; t->aggregator = privileged ? PSI_POLL : PSI_AVGS; @@ -1396,10 +1389,7 @@ void psi_trigger_destroy(struct psi_trigger *t) * being accessed later. Can happen if cgroup is deleted from under a * polling process. */ - if (t->of) - kernfs_notify(t->of->kn); - else - wake_up_interruptible(&t->event_wait); + wake_up_pollfree(&t->event_wait); if (t->aggregator == PSI_AVGS) { mutex_lock(&group->avgs_lock); @@ -1471,10 +1461,7 @@ __poll_t psi_trigger_poll(void **trigger_ptr, if (!t) return DEFAULT_POLLMASK | EPOLLERR | EPOLLPRI; - if (t->of) - kernfs_generic_poll(t->of, wait); - else - poll_wait(file, &t->event_wait, wait); + poll_wait(file, &t->event_wait, wait); if (cmpxchg(&t->event, 1, 0) == 1) ret |= EPOLLPRI; @@ -1544,7 +1531,7 @@ static ssize_t psi_write(struct file *file, const char __user *user_buf, return -EBUSY; } - new = psi_trigger_create(&psi_system, buf, res, file, NULL); + new = psi_trigger_create(&psi_system, buf, res, file); if (IS_ERR(new)) { mutex_unlock(&seq->lock); return PTR_ERR(new);