[Freedreno] [PATCH] drm/msm/gpu: Add submit queue queries
Jordan Crouse
jcrouse at codeaurora.org
Mon May 7 16:06:23 UTC 2018
On Mon, Apr 30, 2018 at 03:20:53PM -0600, Jordan Crouse wrote:
> Add the capability to query information from a submit queue.
> The first available parameter is for querying the number of
> GPU faults (hangs) that can be attributed to the queue.
>
> This is useful for implementing context robustness. A UMD
> context can regularly query the number of faults to see
> if it is responsible for any. If so it can invalidate itself.
>
> This is also helpful for testing by confirming to the user mode
> driver if a particular command stream caused a fault (or not as
> the case may be).
>
> Signed-off-by: Jordan Crouse <jcrouse at codeaurora.org>
> ---
> drivers/gpu/drm/msm/msm_drv.c | 12 +++++++++++-
> drivers/gpu/drm/msm/msm_drv.h | 2 ++
> drivers/gpu/drm/msm/msm_gpu.c | 3 +++
> drivers/gpu/drm/msm/msm_submitqueue.c | 21 +++++++++++++++++++++
> include/uapi/drm/msm_drm.h | 12 ++++++++++++
> 5 files changed, 49 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/gpu/drm/msm/msm_drv.c b/drivers/gpu/drm/msm/msm_drv.c
> index 30cd514d8f7c..d01fb101d5ff 100644
> --- a/drivers/gpu/drm/msm/msm_drv.c
> +++ b/drivers/gpu/drm/msm/msm_drv.c
> @@ -32,9 +32,10 @@
> * - 1.3.0 - adds GMEM_BASE + NR_RINGS params, SUBMITQUEUE_NEW +
> * SUBMITQUEUE_CLOSE ioctls, and MSM_INFO_IOVA flag for
> * MSM_GEM_INFO ioctl.
> + * - 1.4.0 - Add SUBMITQUERY_QUERY ioctl.
> */
> #define MSM_VERSION_MAJOR 1
> -#define MSM_VERSION_MINOR 3
> +#define MSM_VERSION_MINOR 4
> #define MSM_VERSION_PATCHLEVEL 0
>
> static const struct drm_mode_config_funcs mode_config_funcs = {
> @@ -803,6 +804,14 @@ static int msm_ioctl_submitqueue_new(struct drm_device *dev, void *data,
> args->flags, &args->id);
> }
>
> +static int msm_ioctl_submitqueue_query(struct drm_device *dev, void *data,
> + struct drm_file *file)
> +{
> + struct drm_msm_submitqueue_query *args = data;
> +
> + return msm_submitqueue_query(dev, file->driver_priv, args->id,
> + args->param, args->data, args->len);
> +}
>
> static int msm_ioctl_submitqueue_close(struct drm_device *dev, void *data,
> struct drm_file *file)
> @@ -823,6 +832,7 @@ static const struct drm_ioctl_desc msm_ioctls[] = {
> DRM_IOCTL_DEF_DRV(MSM_GEM_MADVISE, msm_ioctl_gem_madvise, DRM_AUTH|DRM_RENDER_ALLOW),
> DRM_IOCTL_DEF_DRV(MSM_SUBMITQUEUE_NEW, msm_ioctl_submitqueue_new, DRM_AUTH|DRM_RENDER_ALLOW),
> DRM_IOCTL_DEF_DRV(MSM_SUBMITQUEUE_CLOSE, msm_ioctl_submitqueue_close, DRM_AUTH|DRM_RENDER_ALLOW),
> + DRM_IOCTL_DEF_DRV(MSM_SUBMITQUEUE_QUERY, msm_ioctl_submitqueue_query, DRM_AUTH|DRM_RENDER_ALLOW),
> };
>
> static const struct vm_operations_struct vm_ops = {
> diff --git a/drivers/gpu/drm/msm/msm_drv.h b/drivers/gpu/drm/msm/msm_drv.h
> index 48ed5b9a8580..56c666f25aa1 100644
> --- a/drivers/gpu/drm/msm/msm_drv.h
> +++ b/drivers/gpu/drm/msm/msm_drv.h
> @@ -320,6 +320,8 @@ struct msm_gpu_submitqueue *msm_submitqueue_get(struct msm_file_private *ctx,
> u32 id);
> int msm_submitqueue_create(struct drm_device *drm, struct msm_file_private *ctx,
> u32 prio, u32 flags, u32 *id);
> +int msm_submitqueue_query(struct drm_device *drm, struct msm_file_private *ctx,
> + u32 id, u32 param, u64 data, u32 len);
> int msm_submitqueue_remove(struct msm_file_private *ctx, u32 id);
> void msm_submitqueue_close(struct msm_file_private *ctx);
>
> diff --git a/drivers/gpu/drm/msm/msm_gpu.c b/drivers/gpu/drm/msm/msm_gpu.c
> index 1c09acfb4028..925532197584 100644
> --- a/drivers/gpu/drm/msm/msm_gpu.c
> +++ b/drivers/gpu/drm/msm/msm_gpu.c
> @@ -324,6 +324,9 @@ static void recover_worker(struct work_struct *work)
> if (submit) {
> struct task_struct *task;
>
> + /* Increment the submitqueue fault count */
> + submit->queue->faults++;
> +
> rcu_read_lock();
> task = pid_task(submit->pid, PIDTYPE_PID);
> if (task) {
> diff --git a/drivers/gpu/drm/msm/msm_submitqueue.c b/drivers/gpu/drm/msm/msm_submitqueue.c
> index 5115f75b5b7f..e12f2bd0347d 100644
> --- a/drivers/gpu/drm/msm/msm_submitqueue.c
> +++ b/drivers/gpu/drm/msm/msm_submitqueue.c
> @@ -120,6 +120,27 @@ int msm_submitqueue_init(struct drm_device *drm, struct msm_file_private *ctx)
> return msm_submitqueue_create(drm, ctx, default_prio, 0, NULL);
> }
>
> +int msm_submitqueue_query(struct drm_device *drm, struct msm_file_private *ctx,
> + u32 id, u32 param, u64 data, u32 len)
> +{
> + struct msm_gpu_submitqueue *queue = msm_submitqueue_get(ctx, id);
> + int ret = -EINVAL;
> +
> + if (!queue)
> + return -ENOENT;
> +
> + if (param == MSM_SUBMITQUEUE_PARAM_FAULTS) {
> + size_t size = min_t(size_t, len, sizeof(queue->faults));
> +
> + if (copy_to_user(u64_to_user_ptr(data), &queue->faults, size))
> + ret = -EFAULT;
> + }
I'll push a new patch to fix it, but pointing out for posterity that we get here
with ret == -EINVAL on success. There should be ret = 0 before the bracket.
Jordan
--
The Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum,
a Linux Foundation Collaborative Project
More information about the Freedreno
mailing list