Commit d4726d77 authored by Rob Clark's avatar Rob Clark
Browse files

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.com


Signed-off-by: default avatarRob Clark <robdclark@chromium.org>
parent 39ba0c0d
Loading
Loading
Loading
Loading
+40 −3
Original line number Diff line number Diff line
@@ -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,
		     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)
			return -EINVAL;
	}

	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:
		if (!capable(CAP_SYS_ADMIN))
			return -EPERM;
+10 −2
Original line number Diff line number Diff line
@@ -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)
{
	struct msm_file_private *ctx = submit->queue->ctx;
	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);
	if (!task)
		return;

	if (!*comm)
		*comm = kstrdup(task->comm, GFP_KERNEL);

	if (!*cmd)
		*cmd = kstrdup_quotable_cmdline(task, GFP_KERNEL);

	put_task_struct(task);
+6 −0
Original line number Diff line number Diff line
@@ -355,6 +355,12 @@ struct msm_file_private {
	 */
	int sysprof;

	/** comm: Overridden task comm, see MSM_PARAM_COMM */
	char *comm;

	/** cmdline: Overridden task cmdline, see MSM_PARAM_CMDLINE */
	char *cmdline;

	/**
	 * entities:
	 *
+2 −0
Original line number Diff line number Diff line
@@ -61,6 +61,8 @@ void __msm_file_private_destroy(struct kref *kref)
	}

	msm_gem_address_space_put(ctx->aspace);
	kfree(ctx->comm);
	kfree(ctx->cmdline);
	kfree(ctx);
}

+2 −0
Original line number Diff line number Diff line
@@ -82,6 +82,8 @@ struct drm_msm_timespec {
#define MSM_PARAM_FAULTS     0x09  /* RO */
#define MSM_PARAM_SUSPENDS   0x0a  /* RO */
#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
 * a single ring per priority level so # of priority levels equals the #