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: Rob Clark <robdclark@chromium.org> Link: https://lore.kernel.org/r/20220317165144.222101-4-robdclark@gmail.com Signed-off-by: Rob Clark <robdclark@chromium.org>
This commit is contained in:
parent
39ba0c0d6c
commit
d4726d7700
5 changed files with 60 additions and 5 deletions
|
@ -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) {
|
||||||
if (len != 0)
|
case MSM_PARAM_COMM:
|
||||||
return -EINVAL;
|
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)
|
||||||
|
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,14 +353,22 @@ 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;
|
||||||
|
|
||||||
*comm = kstrdup(task->comm, GFP_KERNEL);
|
if (!*comm)
|
||||||
*cmd = kstrdup_quotable_cmdline(task, GFP_KERNEL);
|
*comm = kstrdup(task->comm, GFP_KERNEL);
|
||||||
|
|
||||||
|
if (!*cmd)
|
||||||
|
*cmd = kstrdup_quotable_cmdline(task, GFP_KERNEL);
|
||||||
|
|
||||||
put_task_struct(task);
|
put_task_struct(task);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
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 {
|
||||||
#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 #
|
||||||
|
|
Loading…
Add table
Reference in a new issue