History

sched: psi: fix unprivileged polling against cgroups

519fabc7aaba ("psi: remove 500ms min window size limitation for triggers") breaks unprivileged psi polling on cgroups. Historically, we had a privilege check for polling in the open() of a pressure file in /proc, but were erroneously missing it for the open() of cgroup pressure files. When unprivileged polling was introduced in d82caa273565 ("sched/psi: Allow unprivileged polling of N*2s period"), it needed to filter privileges depending on the exact polling parameters, and as such moved the CAP_SYS_RESOURCE check from the proc open() callback to psi_trigger_create(). Both the proc files as well as cgroup files go through this during write(). This implicitly added the missing check for privileges required for HT polling for cgroups. When 519fabc7aaba ("psi: remove 500ms min window size limitation for triggers") followed right after to remove further restrictions on the RT polling window, it incorrectly assumed the cgroup privilege check was still missing and added it to the cgroup open(), mirroring what we used to do for proc files in the past. As a result, unprivileged poll requests that would be supported now get rejected when opening the cgroup pressure file for writing. Remove the cgroup open() check. psi_trigger_create() handles it.

Johannes Weiner committed 3 years ago

Commit 8b39d201 parent eab03c21 file · +0 −12Browse files

Unified · Split

kernel/cgroup/cgroup.c+0−12
@@ -3885,14 +3885,6 @@ static __poll_t cgroup_pressure_poll(struct kernfs_open_file *of, · 3884 unmodified lines
3885 return psi_trigger_poll(&ctx->psi.trigger, of->file, pt);3885 return psi_trigger_poll(&ctx->psi.trigger, of->file, pt);
3886}3886}
3887 3887
3888static int cgroup_pressure_open(struct kernfs_open_file *of)
3889{
3890 if (of->file->f_mode & FMODE_WRITE && !capable(CAP_SYS_RESOURCE))
3891 return -EPERM;
3892
3893 return 0;
3894}
3895
3896static void cgroup_pressure_release(struct kernfs_open_file *of)3888static void cgroup_pressure_release(struct kernfs_open_file *of)
3897{3889{
3898 struct cgroup_file_ctx *ctx = of->priv;3890 struct cgroup_file_ctx *ctx = of->priv;
@@ -5299,7 +5291,6 @@ static struct cftype cgroup_psi_files[] = { · 1400 unmodified lines
5299 {5291 {
5300 .name = "io.pressure",5292 .name = "io.pressure",
5301 .file_offset = offsetof(struct cgroup, psi_files[PSI_IO]),5293 .file_offset = offsetof(struct cgroup, psi_files[PSI_IO]),
5302 .open = cgroup_pressure_open,
5303 .seq_show = cgroup_io_pressure_show,5294 .seq_show = cgroup_io_pressure_show,
5304 .write = cgroup_io_pressure_write,5295 .write = cgroup_io_pressure_write,
5305 .poll = cgroup_pressure_poll,5296 .poll = cgroup_pressure_poll,
@@ -5308,7 +5299,6 @@ static struct cftype cgroup_psi_files[] = { · 2 unmodified lines
5308 {5299 {
5309 .name = "memory.pressure",5300 .name = "memory.pressure",
5310 .file_offset = offsetof(struct cgroup, psi_files[PSI_MEM]),5301 .file_offset = offsetof(struct cgroup, psi_files[PSI_MEM]),
5311 .open = cgroup_pressure_open,
5312 .seq_show = cgroup_memory_pressure_show,5302 .seq_show = cgroup_memory_pressure_show,
5313 .write = cgroup_memory_pressure_write,5303 .write = cgroup_memory_pressure_write,
5314 .poll = cgroup_pressure_poll,5304 .poll = cgroup_pressure_poll,
@@ -5317,7 +5307,6 @@ static struct cftype cgroup_psi_files[] = { · 2 unmodified lines
5317 {5307 {
5318 .name = "cpu.pressure",5308 .name = "cpu.pressure",
5319 .file_offset = offsetof(struct cgroup, psi_files[PSI_CPU]),5309 .file_offset = offsetof(struct cgroup, psi_files[PSI_CPU]),
5320 .open = cgroup_pressure_open,
5321 .seq_show = cgroup_cpu_pressure_show,5310 .seq_show = cgroup_cpu_pressure_show,
5322 .write = cgroup_cpu_pressure_write,5311 .write = cgroup_cpu_pressure_write,
5323 .poll = cgroup_pressure_poll,5312 .poll = cgroup_pressure_poll,
@@ -5327,7 +5316,6 @@ static struct cftype cgroup_psi_files[] = { · 3 unmodified lines
5327 {5316 {
5328 .name = "irq.pressure",5317 .name = "irq.pressure",
5329 .file_offset = offsetof(struct cgroup, psi_files[PSI_IRQ]),5318 .file_offset = offsetof(struct cgroup, psi_files[PSI_IRQ]),
5330 .open = cgroup_pressure_open,
5331 .seq_show = cgroup_irq_pressure_show,5319 .seq_show = cgroup_irq_pressure_show,
5332 .write = cgroup_irq_pressure_write,5320 .write = cgroup_irq_pressure_write,
5333 .poll = cgroup_pressure_poll,5321 .poll = cgroup_pressure_poll,