ANDROID: cgroup: Fix for a partially backported patch

The backports of 0d2b5955b36250a9428c832664f2079cbf723bec upstream
commit to 4.14 and 4.19 stable kernels drop changes to
cgroup_pressure_*() functions which breaks PSI cgroup file handlers
in Android Common Kernels.
The partial backport changes cgroup_file_open to allocate struct
cgroup_file_ctx and use kernfs_open_file.priv to point to it while
skipping the accompanying changes in cgroup_pressure_*(). This
leads to cgroup_pressure_*() functions treating kernfs_open_file.priv
as a pointer to struct psi_trigger instead of struct cgroup_file_ctx.
This partial backport works fine in upstream stable kernels because
they are missing PSI feature there, however in Android, PSI is
backported in 4.14 and 4.19 kernels and therefore the missing pieces
result in PSI feature being broken.
Fix this by adding the dropped pieces from the original patch.

Link to the original patch: https://lore.kernel.org/r/20211213191833.916632-3-tj@kernel.org/
Link to the 4.19 backport: https://lore.kernel.org/r/20220414110848.311690316@linuxfoundation.org/

Bug: 233410456
Signed-off-by: Suren Baghdasaryan <surenb@google.com>
Change-Id: Ib8858fa85a7a1fb82904cea0c8c903fd900d6316
This commit is contained in:
Suren Baghdasaryan 2022-07-20 09:54:33 -07:00
parent 0768ae32c8
commit a8de508bc7

View file

@ -3520,6 +3520,7 @@ static int cgroup_cpu_pressure_show(struct seq_file *seq, void *v)
static ssize_t cgroup_pressure_write(struct kernfs_open_file *of, char *buf, static ssize_t cgroup_pressure_write(struct kernfs_open_file *of, char *buf,
size_t nbytes, enum psi_res res) size_t nbytes, enum psi_res res)
{ {
struct cgroup_file_ctx *ctx = of->priv;
struct psi_trigger *new; struct psi_trigger *new;
struct cgroup *cgrp; struct cgroup *cgrp;
@ -3531,7 +3532,7 @@ static ssize_t cgroup_pressure_write(struct kernfs_open_file *of, char *buf,
cgroup_kn_unlock(of->kn); cgroup_kn_unlock(of->kn);
/* Allow only one trigger per file descriptor */ /* Allow only one trigger per file descriptor */
if (of->priv) { if (ctx->psi.trigger) {
cgroup_put(cgrp); cgroup_put(cgrp);
return -EBUSY; return -EBUSY;
} }
@ -3542,7 +3543,7 @@ static ssize_t cgroup_pressure_write(struct kernfs_open_file *of, char *buf,
return PTR_ERR(new); return PTR_ERR(new);
} }
smp_store_release(&of->priv, new); smp_store_release(&ctx->psi.trigger, new);
cgroup_put(cgrp); cgroup_put(cgrp);
return nbytes; return nbytes;
@ -3572,12 +3573,16 @@ static ssize_t cgroup_cpu_pressure_write(struct kernfs_open_file *of,
static __poll_t cgroup_pressure_poll(struct kernfs_open_file *of, static __poll_t cgroup_pressure_poll(struct kernfs_open_file *of,
poll_table *pt) poll_table *pt)
{ {
return psi_trigger_poll(&of->priv, of->file, pt); struct cgroup_file_ctx *ctx = of->priv;
return psi_trigger_poll(&ctx->psi.trigger, of->file, pt);
} }
static void cgroup_pressure_release(struct kernfs_open_file *of) static void cgroup_pressure_release(struct kernfs_open_file *of)
{ {
psi_trigger_destroy(of->priv); struct cgroup_file_ctx *ctx = of->priv;
psi_trigger_destroy(ctx->psi.trigger);
} }
bool cgroup_psi_enabled(void) bool cgroup_psi_enabled(void)