@@ -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_ */
@@ -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);
Signed-off-by: Matt Roper <matthew.d.roper@intel.com> --- include/drm/drm_file.h | 20 ++++++++++++++++++++ kernel/cgroup/cgroup_driver.c | 12 ++++++++++-- 2 files changed, 30 insertions(+), 2 deletions(-)