Quoting Matt Roper (2018-02-01 19:53:11) > Drivers will need to save/restore the appropriate cgroup data for the process > submitting a driver request. Add an interface for drivers to determine the > cgroup for the userspace process submitting a driver request. > > Cc: Tejun Heo <tj@xxxxxxxxxx> > Cc: cgroups@xxxxxxxxxxxxxxx > Signed-off-by: Matt Roper <matthew.d.roper@xxxxxxxxx> > --- > include/linux/cgroup.h | 6 ++++++ > kernel/cgroup/cgroup_driver.c | 24 ++++++++++++++++++++++++ > 2 files changed, 30 insertions(+) > > diff --git a/include/linux/cgroup.h b/include/linux/cgroup.h > index 0ba1374122c7..05ebfb97bcde 100644 > --- a/include/linux/cgroup.h > +++ b/include/linux/cgroup.h > @@ -842,6 +842,7 @@ void cgroup_driver_release(struct cgroup_driver *drv); > struct cgroup_driver_data * cgroup_driver_get_data(struct cgroup_driver *drv, > struct cgroup *cgrp, > bool *is_new); > +struct cgroup *cgroup_for_driver_process(struct pid *pid); > > #else /* !CONFIG_CGROUP_DRIVER */ > > @@ -857,6 +858,11 @@ cgroup_driver_get_data(struct cgroup_driver *drv, > { > return ERR_PTR(-EINVAL); > } > +static inline struct cgroup * > +cgroup_for_driver_process(struct pid *pid) > +{ > + return NULL; > +} > > #endif /* !CONFIG_CGROUP_DRIVER */ > > diff --git a/kernel/cgroup/cgroup_driver.c b/kernel/cgroup/cgroup_driver.c > index 0d893395dc7b..4f870cbb9212 100644 > --- a/kernel/cgroup/cgroup_driver.c > +++ b/kernel/cgroup/cgroup_driver.c > @@ -128,3 +128,27 @@ cgroup_driver_get_data(struct cgroup_driver *drv, > return data; > } > EXPORT_SYMBOL(cgroup_driver_get_data); > + > +/** > + * cgroup_for_driver_process - return the cgroup for a process > + * @pid: process to lookup cgroup for > + * > + * Returns the cgroup from the v2 hierarchy that a process belongs to. > + * This function is intended to be called from drivers and will obtain > + * the necessary cgroup locks. > + * > + * RETURNS: > + * Process' cgroup in the default (v2) hierarchy > + */ > +struct cgroup * > +cgroup_for_driver_process(struct pid *pid) > +{ > + struct task_struct *task = pid_task(pid, PIDTYPE_PID); > + > + mutex_lock(&cgroup_mutex); > + spin_lock_irq(&css_set_lock); > + task_cgroup_from_root(task, &cgrp_dfl_root); > + spin_unlock_irq(&css_set_lock); > + mutex_unlock(&cgroup_mutex); Gut feeling says use task = get_pid_task(); if (!task) return NULL and put_task_struct(task); for safety. Shouldn't there be a return here? > +} -Chris -- To unsubscribe from this list: send the line "unsubscribe cgroups" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html