On Thu 13 Aug 21:41 CDT 2020, Rob Clark wrote: > From: Rob Clark <robdclark@xxxxxxxxxxxx> > > In $debugfs/gem we already show any vma(s) associated with an object. > Also show process names if the vma's address space is a per-process > address space. > Reviewed-by: Bjorn Andersson <bjorn.andersson@xxxxxxxxxx> > Signed-off-by: Rob Clark <robdclark@xxxxxxxxxxxx> > --- > drivers/gpu/drm/msm/msm_drv.c | 2 +- > drivers/gpu/drm/msm/msm_gem.c | 25 +++++++++++++++++++++---- > drivers/gpu/drm/msm/msm_gem.h | 5 +++++ > drivers/gpu/drm/msm/msm_gem_vma.c | 1 + > drivers/gpu/drm/msm/msm_gpu.c | 8 +++++--- > drivers/gpu/drm/msm/msm_gpu.h | 2 +- > 6 files changed, 34 insertions(+), 9 deletions(-) > > diff --git a/drivers/gpu/drm/msm/msm_drv.c b/drivers/gpu/drm/msm/msm_drv.c > index 8e70d220bba8..8d5c4f98c332 100644 > --- a/drivers/gpu/drm/msm/msm_drv.c > +++ b/drivers/gpu/drm/msm/msm_drv.c > @@ -597,7 +597,7 @@ static int context_init(struct drm_device *dev, struct drm_file *file) > kref_init(&ctx->ref); > msm_submitqueue_init(dev, ctx); > > - ctx->aspace = msm_gpu_create_private_address_space(priv->gpu); > + ctx->aspace = msm_gpu_create_private_address_space(priv->gpu, current); > file->driver_priv = ctx; > > return 0; > diff --git a/drivers/gpu/drm/msm/msm_gem.c b/drivers/gpu/drm/msm/msm_gem.c > index 3cb7aeb93fd3..76a6c5271e57 100644 > --- a/drivers/gpu/drm/msm/msm_gem.c > +++ b/drivers/gpu/drm/msm/msm_gem.c > @@ -842,11 +842,28 @@ void msm_gem_describe(struct drm_gem_object *obj, struct seq_file *m) > > seq_puts(m, " vmas:"); > > - list_for_each_entry(vma, &msm_obj->vmas, list) > - seq_printf(m, " [%s: %08llx,%s,inuse=%d]", > - vma->aspace != NULL ? vma->aspace->name : NULL, > - vma->iova, vma->mapped ? "mapped" : "unmapped", > + list_for_each_entry(vma, &msm_obj->vmas, list) { > + const char *name, *comm; > + if (vma->aspace) { > + struct msm_gem_address_space *aspace = vma->aspace; > + struct task_struct *task = > + get_pid_task(aspace->pid, PIDTYPE_PID); > + if (task) { > + comm = kstrdup(task->comm, GFP_KERNEL); > + } else { > + comm = NULL; > + } > + name = aspace->name; > + } else { > + name = comm = NULL; > + } > + seq_printf(m, " [%s%s%s: aspace=%p, %08llx,%s,inuse=%d]", > + name, comm ? ":" : "", comm ? comm : "", > + vma->aspace, vma->iova, > + vma->mapped ? "mapped" : "unmapped", > vma->inuse); > + kfree(comm); > + } > > seq_puts(m, "\n"); > } > diff --git a/drivers/gpu/drm/msm/msm_gem.h b/drivers/gpu/drm/msm/msm_gem.h > index 9c573c4269cb..7b1c7a5f8eef 100644 > --- a/drivers/gpu/drm/msm/msm_gem.h > +++ b/drivers/gpu/drm/msm/msm_gem.h > @@ -24,6 +24,11 @@ struct msm_gem_address_space { > spinlock_t lock; /* Protects drm_mm node allocation/removal */ > struct msm_mmu *mmu; > struct kref kref; > + > + /* For address spaces associated with a specific process, this > + * will be non-NULL: > + */ > + struct pid *pid; > }; > > struct msm_gem_vma { > diff --git a/drivers/gpu/drm/msm/msm_gem_vma.c b/drivers/gpu/drm/msm/msm_gem_vma.c > index 29cc1305cf37..80a8a266d68f 100644 > --- a/drivers/gpu/drm/msm/msm_gem_vma.c > +++ b/drivers/gpu/drm/msm/msm_gem_vma.c > @@ -17,6 +17,7 @@ msm_gem_address_space_destroy(struct kref *kref) > drm_mm_takedown(&aspace->mm); > if (aspace->mmu) > aspace->mmu->funcs->destroy(aspace->mmu); > + put_pid(aspace->pid); > kfree(aspace); > } > > diff --git a/drivers/gpu/drm/msm/msm_gpu.c b/drivers/gpu/drm/msm/msm_gpu.c > index 951850804d77..ac8961187a73 100644 > --- a/drivers/gpu/drm/msm/msm_gpu.c > +++ b/drivers/gpu/drm/msm/msm_gpu.c > @@ -825,10 +825,9 @@ static int get_clocks(struct platform_device *pdev, struct msm_gpu *gpu) > > /* Return a new address space for a msm_drm_private instance */ > struct msm_gem_address_space * > -msm_gpu_create_private_address_space(struct msm_gpu *gpu) > +msm_gpu_create_private_address_space(struct msm_gpu *gpu, struct task_struct *task) > { > struct msm_gem_address_space *aspace = NULL; > - > if (!gpu) > return NULL; > > @@ -836,8 +835,11 @@ msm_gpu_create_private_address_space(struct msm_gpu *gpu) > * If the target doesn't support private address spaces then return > * the global one > */ > - if (gpu->funcs->create_private_address_space) > + if (gpu->funcs->create_private_address_space) { > aspace = gpu->funcs->create_private_address_space(gpu); > + if (!IS_ERR(aspace)) > + aspace->pid = get_pid(task_pid(task)); > + } > > if (IS_ERR_OR_NULL(aspace)) > aspace = msm_gem_address_space_get(gpu->aspace); > diff --git a/drivers/gpu/drm/msm/msm_gpu.h b/drivers/gpu/drm/msm/msm_gpu.h > index 4052a18e18c2..59f26bd0fe42 100644 > --- a/drivers/gpu/drm/msm/msm_gpu.h > +++ b/drivers/gpu/drm/msm/msm_gpu.h > @@ -298,7 +298,7 @@ int msm_gpu_init(struct drm_device *drm, struct platform_device *pdev, > const char *name, struct msm_gpu_config *config); > > struct msm_gem_address_space * > -msm_gpu_create_private_address_space(struct msm_gpu *gpu); > +msm_gpu_create_private_address_space(struct msm_gpu *gpu, struct task_struct *task); > > void msm_gpu_cleanup(struct msm_gpu *gpu); > > -- > 2.26.2 > _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/dri-devel