Signed-off-by: Matt Roper <matthew.d.roper@xxxxxxxxx> --- include/drm/drm_file.h | 20 ++++++++++++++++++++ kernel/cgroup/cgroup_driver.c | 12 ++++++++++-- 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/include/drm/drm_file.h b/include/drm/drm_file.h index 0e0c868451a5..72ac40530ad3 100644 --- a/include/drm/drm_file.h +++ b/include/drm/drm_file.h @@ -32,6 +32,7 @@ #include <linux/types.h> #include <linux/completion.h> +#include <linux/cgroup.h> #include <uapi/drm/drm.h> @@ -378,4 +379,23 @@ void drm_event_cancel_free(struct drm_device *dev, void drm_send_event_locked(struct drm_device *dev, struct drm_pending_event *e); void drm_send_event(struct drm_device *dev, struct drm_pending_event *e); +#ifdef CONFIG_CGROUPS +/** + * drm_file_get_cgroup - obtain cgroup for drm_file's owning process + * @file_priv: DRM file + * + * Obtains the cgroup from a specific hierarchy that the drm_file's owning + * process belongs to. The cgroup may be used to set driver-specific + * policy (priority, vram usage, etc.). + */ +static inline struct cgroup * +drm_file_get_cgroup(struct drm_file *file_priv) +{ + return cgroup_for_driver_process(file_priv->pid); +} +#else +static inline struct cgroup * +drm_file_get_cgroup(struct drm_file *file_priv) { return NULL; } +#endif + #endif /* _DRM_FILE_H_ */ diff --git a/kernel/cgroup/cgroup_driver.c b/kernel/cgroup/cgroup_driver.c index 4f870cbb9212..db0e268b9546 100644 --- a/kernel/cgroup/cgroup_driver.c +++ b/kernel/cgroup/cgroup_driver.c @@ -4,6 +4,7 @@ #include <linux/hashtable.h> #include <linux/mm.h> +#include <linux/sched/task.h> /* * General data structure returned by cgroup_driver_init() and used as a @@ -143,12 +144,19 @@ EXPORT_SYMBOL(cgroup_driver_get_data); struct cgroup * cgroup_for_driver_process(struct pid *pid) { - struct task_struct *task = pid_task(pid, PIDTYPE_PID); + struct task_struct *task; + struct cgroup *cgrp; + + read_lock(&tasklist_lock); + task = pid_task(pid, PIDTYPE_PID); + read_unlock(&tasklist_lock); mutex_lock(&cgroup_mutex); spin_lock_irq(&css_set_lock); - task_cgroup_from_root(task, &cgrp_dfl_root); + cgrp = task_cgroup_from_root(task, &cgrp_dfl_root); spin_unlock_irq(&css_set_lock); mutex_unlock(&cgroup_mutex); + + return cgrp; } EXPORT_SYMBOL(cgroup_for_driver_process); -- 2.14.3 -- 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