Commit d4726d77 authored by Rob Clark's avatar Rob Clark

drm/msm: Add a way to override processes comm/cmdline

In the cause of using the GPU via virtgpu, the host side process is
really a sort of proxy, and not terribly interesting from the PoV of
crash/fault logging.  Add a way to override these per process so that
we can see the guest process's name.

v2: Handle kmalloc failure, add comment to explain kstrdup returns
    NULL if passed NULL [Dan Carpenter]
Signed-off-by: default avatarRob Clark <robdclark@chromium.org>
Link: https://lore.kernel.org/r/20220317165144.222101-4-robdclark@gmail.comSigned-off-by: default avatarRob Clark <robdclark@chromium.org>
parent 39ba0c0d
...@@ -290,11 +290,48 @@ int adreno_get_param(struct msm_gpu *gpu, struct msm_file_private *ctx, ...@@ -290,11 +290,48 @@ int adreno_get_param(struct msm_gpu *gpu, struct msm_file_private *ctx,
int adreno_set_param(struct msm_gpu *gpu, struct msm_file_private *ctx, int adreno_set_param(struct msm_gpu *gpu, struct msm_file_private *ctx,
uint32_t param, uint64_t value, uint32_t len) uint32_t param, uint64_t value, uint32_t len)
{ {
/* No pointer params yet */ switch (param) {
case MSM_PARAM_COMM:
case MSM_PARAM_CMDLINE:
/* kstrdup_quotable_cmdline() limits to PAGE_SIZE, so
* that should be a reasonable upper bound
*/
if (len > PAGE_SIZE)
return -EINVAL;
break;
default:
if (len != 0) if (len != 0)
return -EINVAL; return -EINVAL;
}
switch (param) { switch (param) {
case MSM_PARAM_COMM:
case MSM_PARAM_CMDLINE: {
char *str, **paramp;
str = kmalloc(len + 1, GFP_KERNEL);
if (!str)
return -ENOMEM;
if (copy_from_user(str, u64_to_user_ptr(value), len)) {
kfree(str);
return -EFAULT;
}
/* Ensure string is null terminated: */
str[len] = '\0';
if (param == MSM_PARAM_COMM) {
paramp = &ctx->comm;
} else {
paramp = &ctx->cmdline;
}
kfree(*paramp);
*paramp = str;
return 0;
}
case MSM_PARAM_SYSPROF: case MSM_PARAM_SYSPROF:
if (!capable(CAP_SYS_ADMIN)) if (!capable(CAP_SYS_ADMIN))
return -EPERM; return -EPERM;
......
...@@ -353,13 +353,21 @@ static void retire_submits(struct msm_gpu *gpu); ...@@ -353,13 +353,21 @@ static void retire_submits(struct msm_gpu *gpu);
static void get_comm_cmdline(struct msm_gem_submit *submit, char **comm, char **cmd) static void get_comm_cmdline(struct msm_gem_submit *submit, char **comm, char **cmd)
{ {
struct msm_file_private *ctx = submit->queue->ctx;
struct task_struct *task; struct task_struct *task;
/* Note that kstrdup will return NULL if argument is NULL: */
*comm = kstrdup(ctx->comm, GFP_KERNEL);
*cmd = kstrdup(ctx->cmdline, GFP_KERNEL);
task = get_pid_task(submit->pid, PIDTYPE_PID); task = get_pid_task(submit->pid, PIDTYPE_PID);
if (!task) if (!task)
return; return;
if (!*comm)
*comm = kstrdup(task->comm, GFP_KERNEL); *comm = kstrdup(task->comm, GFP_KERNEL);
if (!*cmd)
*cmd = kstrdup_quotable_cmdline(task, GFP_KERNEL); *cmd = kstrdup_quotable_cmdline(task, GFP_KERNEL);
put_task_struct(task); put_task_struct(task);
......
...@@ -355,6 +355,12 @@ struct msm_file_private { ...@@ -355,6 +355,12 @@ struct msm_file_private {
*/ */
int sysprof; int sysprof;
/** comm: Overridden task comm, see MSM_PARAM_COMM */
char *comm;
/** cmdline: Overridden task cmdline, see MSM_PARAM_CMDLINE */
char *cmdline;
/** /**
* entities: * entities:
* *
......
...@@ -61,6 +61,8 @@ void __msm_file_private_destroy(struct kref *kref) ...@@ -61,6 +61,8 @@ void __msm_file_private_destroy(struct kref *kref)
} }
msm_gem_address_space_put(ctx->aspace); msm_gem_address_space_put(ctx->aspace);
kfree(ctx->comm);
kfree(ctx->cmdline);
kfree(ctx); kfree(ctx);
} }
......
...@@ -82,6 +82,8 @@ struct drm_msm_timespec { ...@@ -82,6 +82,8 @@ struct drm_msm_timespec {
#define MSM_PARAM_FAULTS 0x09 /* RO */ #define MSM_PARAM_FAULTS 0x09 /* RO */
#define MSM_PARAM_SUSPENDS 0x0a /* RO */ #define MSM_PARAM_SUSPENDS 0x0a /* RO */
#define MSM_PARAM_SYSPROF 0x0b /* WO: 1 preserves perfcntrs, 2 also disables suspend */ #define MSM_PARAM_SYSPROF 0x0b /* WO: 1 preserves perfcntrs, 2 also disables suspend */
#define MSM_PARAM_COMM 0x0c /* WO: override for task->comm */
#define MSM_PARAM_CMDLINE 0x0d /* WO: override for task cmdline */
/* For backwards compat. The original support for preemption was based on /* For backwards compat. The original support for preemption was based on
* a single ring per priority level so # of priority levels equals the # * a single ring per priority level so # of priority levels equals the #
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment