Revert "sched/psi: use kernfs polling functions for PSI trigger polling"

This reverts commit 92cc015332 which is
commit aff037078e 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 <gregkh@google.com>
This commit is contained in:
Greg Kroah-Hartman
2023-09-07 10:48:30 +00:00
parent 8976ff249f
commit ffed79e366
4 changed files with 11 additions and 28 deletions

View File

@@ -23,9 +23,8 @@ void psi_memstall_enter(unsigned long *flags);
void psi_memstall_leave(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); 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, struct psi_trigger *psi_trigger_create(struct psi_group *group,
enum psi_res res, struct file *file, char *buf, enum psi_res res, struct file *file);
struct kernfs_open_file *of);
void psi_trigger_destroy(struct psi_trigger *t); void psi_trigger_destroy(struct psi_trigger *t);
__poll_t psi_trigger_poll(void **trigger_ptr, struct file *file, __poll_t psi_trigger_poll(void **trigger_ptr, struct file *file,

View File

@@ -137,9 +137,6 @@ struct psi_trigger {
/* Wait queue for polling */ /* Wait queue for polling */
wait_queue_head_t event_wait; wait_queue_head_t event_wait;
/* Kernfs file for cgroup triggers */
struct kernfs_open_file *of;
/* Pending event flag */ /* Pending event flag */
int event; int event;

View File

@@ -3777,7 +3777,7 @@ static ssize_t pressure_write(struct kernfs_open_file *of, char *buf,
} }
psi = cgroup_psi(cgrp); 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)) { if (IS_ERR(new)) {
cgroup_put(cgrp); cgroup_put(cgrp);
return PTR_ERR(new); return PTR_ERR(new);

View File

@@ -494,12 +494,8 @@ static u64 update_triggers(struct psi_group *group, u64 now, bool *update_total,
continue; continue;
/* Generate an event */ /* Generate an event */
if (cmpxchg(&t->event, 0, 1) == 0) { if (cmpxchg(&t->event, 0, 1) == 0)
if (t->of) wake_up_interruptible(&t->event_wait);
kernfs_notify(t->of->kn);
else
wake_up_interruptible(&t->event_wait);
}
t->last_event_time = now; t->last_event_time = now;
/* Reset threshold breach flag once event got generated */ /* Reset threshold breach flag once event got generated */
t->pending_event = false; 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; return 0;
} }
struct psi_trigger *psi_trigger_create(struct psi_group *group, char *buf, struct psi_trigger *psi_trigger_create(struct psi_group *group,
enum psi_res res, struct file *file, char *buf, enum psi_res res, struct file *file)
struct kernfs_open_file *of)
{ {
struct psi_trigger *t; struct psi_trigger *t;
enum psi_states state; enum psi_states state;
@@ -1337,9 +1332,7 @@ struct psi_trigger *psi_trigger_create(struct psi_group *group, char *buf,
t->event = 0; t->event = 0;
t->last_event_time = 0; t->last_event_time = 0;
t->of = of; init_waitqueue_head(&t->event_wait);
if (!of)
init_waitqueue_head(&t->event_wait);
t->pending_event = false; t->pending_event = false;
t->aggregator = privileged ? PSI_POLL : PSI_AVGS; 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 * being accessed later. Can happen if cgroup is deleted from under a
* polling process. * polling process.
*/ */
if (t->of) wake_up_pollfree(&t->event_wait);
kernfs_notify(t->of->kn);
else
wake_up_interruptible(&t->event_wait);
if (t->aggregator == PSI_AVGS) { if (t->aggregator == PSI_AVGS) {
mutex_lock(&group->avgs_lock); mutex_lock(&group->avgs_lock);
@@ -1471,10 +1461,7 @@ __poll_t psi_trigger_poll(void **trigger_ptr,
if (!t) if (!t)
return DEFAULT_POLLMASK | EPOLLERR | EPOLLPRI; return DEFAULT_POLLMASK | EPOLLERR | EPOLLPRI;
if (t->of) poll_wait(file, &t->event_wait, wait);
kernfs_generic_poll(t->of, wait);
else
poll_wait(file, &t->event_wait, wait);
if (cmpxchg(&t->event, 1, 0) == 1) if (cmpxchg(&t->event, 1, 0) == 1)
ret |= EPOLLPRI; ret |= EPOLLPRI;
@@ -1544,7 +1531,7 @@ static ssize_t psi_write(struct file *file, const char __user *user_buf,
return -EBUSY; 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)) { if (IS_ERR(new)) {
mutex_unlock(&seq->lock); mutex_unlock(&seq->lock);
return PTR_ERR(new); return PTR_ERR(new);