FROMLIST: psi: introduce psi monitor
[GitHub/LineageOS/android_kernel_motorola_exynos9610.git] / kernel / cgroup / cgroup.c
index e6d49cc541026c919f51b480ea64c48999ecbd9d..c9ae1cf12e48c3592e0bb45bc1ff05887be13271 100644 (file)
@@ -3346,7 +3346,65 @@ static int cgroup_cpu_pressure_show(struct seq_file *seq, void *v)
 {
        return psi_show(seq, &seq_css(seq)->cgroup->psi, PSI_CPU);
 }
-#endif
+
+static ssize_t cgroup_pressure_write(struct kernfs_open_file *of, char *buf,
+                                         size_t nbytes, enum psi_res res)
+{
+       struct psi_trigger *new;
+       struct cgroup *cgrp;
+
+       cgrp = cgroup_kn_lock_live(of->kn, false);
+       if (!cgrp)
+               return -ENODEV;
+
+       cgroup_get(cgrp);
+       cgroup_kn_unlock(of->kn);
+
+       new = psi_trigger_create(&cgrp->psi, buf, nbytes, res);
+       if (IS_ERR(new)) {
+               cgroup_put(cgrp);
+               return PTR_ERR(new);
+       }
+
+       psi_trigger_replace(&of->priv, new);
+
+       cgroup_put(cgrp);
+
+       return nbytes;
+}
+
+static ssize_t cgroup_io_pressure_write(struct kernfs_open_file *of,
+                                         char *buf, size_t nbytes,
+                                         loff_t off)
+{
+       return cgroup_pressure_write(of, buf, nbytes, PSI_IO);
+}
+
+static ssize_t cgroup_memory_pressure_write(struct kernfs_open_file *of,
+                                         char *buf, size_t nbytes,
+                                         loff_t off)
+{
+       return cgroup_pressure_write(of, buf, nbytes, PSI_MEM);
+}
+
+static ssize_t cgroup_cpu_pressure_write(struct kernfs_open_file *of,
+                                         char *buf, size_t nbytes,
+                                         loff_t off)
+{
+       return cgroup_pressure_write(of, buf, nbytes, PSI_CPU);
+}
+
+static unsigned int cgroup_pressure_poll(struct kernfs_open_file *of,
+                                        poll_table *pt)
+{
+       return psi_trigger_poll(&of->priv, of->file, pt);
+}
+
+static void cgroup_pressure_release(struct kernfs_open_file *of)
+{
+       psi_trigger_replace(&of->priv, NULL);
+}
+#endif /* CONFIG_PSI */
 
 static int cgroup_file_open(struct kernfs_open_file *of)
 {
@@ -4463,18 +4521,27 @@ static struct cftype cgroup_base_files[] = {
                .name = "io.pressure",
                .flags = CFTYPE_NOT_ON_ROOT,
                .seq_show = cgroup_io_pressure_show,
+               .write = cgroup_io_pressure_write,
+               .poll = cgroup_pressure_poll,
+               .release = cgroup_pressure_release,
        },
        {
                .name = "memory.pressure",
                .flags = CFTYPE_NOT_ON_ROOT,
                .seq_show = cgroup_memory_pressure_show,
+               .write = cgroup_memory_pressure_write,
+               .poll = cgroup_pressure_poll,
+               .release = cgroup_pressure_release,
        },
        {
                .name = "cpu.pressure",
                .flags = CFTYPE_NOT_ON_ROOT,
                .seq_show = cgroup_cpu_pressure_show,
+               .write = cgroup_cpu_pressure_write,
+               .poll = cgroup_pressure_poll,
+               .release = cgroup_pressure_release,
        },
-#endif
+#endif /* CONFIG_PSI */
        { }     /* terminate */
 };