diff options
author | Jordan Crouse <jcrouse@codeaurora.org> | 2017-06-12 09:16:47 -0600 |
---|---|---|
committer | Jordan Crouse <jcrouse@codeaurora.org> | 2017-06-19 15:50:30 -0600 |
commit | b25ea02d2273fb6ee2a797f7d67da341d7b60b6b (patch) | |
tree | cbd0f6ca928a45ce282873a9cfe2c564e9f6e5b9 /drivers/gpu | |
parent | b674857b834e03f0b789e7def6948a34c246ae60 (diff) |
drm/msm: Add a submit queue flag to disable the QoS timer
Allow priviliged (CAP_SYS_ADMIN) processes to disable the
hangcheck / quality of service timer to allow individual
submits to run for as long as they need.
Change-Id: Ic0dedbad1399ebe7c6db74ba374bfa3a6f72917a
Signed-off-by: Jordan Crouse <jcrouse@codeaurora.org>
Diffstat (limited to 'drivers/gpu')
-rw-r--r-- | drivers/gpu/drm/msm/msm_drv.c | 7 | ||||
-rw-r--r-- | drivers/gpu/drm/msm/msm_gpu.c | 17 |
2 files changed, 23 insertions, 1 deletions
diff --git a/drivers/gpu/drm/msm/msm_drv.c b/drivers/gpu/drm/msm/msm_drv.c index cc3e56733fb9..a441f3d15542 100644 --- a/drivers/gpu/drm/msm/msm_drv.c +++ b/drivers/gpu/drm/msm/msm_drv.c @@ -1707,6 +1707,13 @@ static int msm_ioctl_submitqueue_new(struct drm_device *dev, void *data, return -EPERM; } + if (args->flags & MSM_SUBMITQUEUE_BYPASS_QOS_TIMEOUT && + !capable(CAP_SYS_ADMIN)) { + DRM_ERROR( + "Only CAP_SYS_ADMIN processes can bypass the timer\n"); + return -EPERM; + } + return msm_submitqueue_create(file->driver_priv, args->prio, args->flags, &args->id); } diff --git a/drivers/gpu/drm/msm/msm_gpu.c b/drivers/gpu/drm/msm/msm_gpu.c index cb90d23e8b07..c6e8660e3cbe 100644 --- a/drivers/gpu/drm/msm/msm_gpu.c +++ b/drivers/gpu/drm/msm/msm_gpu.c @@ -353,8 +353,22 @@ static void hangcheck_handler(unsigned long data) /* some progress has been made.. ya! */ gpu->hangcheck_fence[ring->id] = fence; } else if (fence < submitted) { - /* no progress and not done.. hung! */ + struct msm_gem_submit *submit; + gpu->hangcheck_fence[ring->id] = fence; + + /* + * No progress done, but see if the current submit is + * intentionally skipping the hangcheck + */ + submit = list_first_entry_or_null(&ring->submits, + struct msm_gem_submit, node); + + if (!submit || (submit->queue->flags & + MSM_SUBMITQUEUE_BYPASS_QOS_TIMEOUT)) + goto out; + + /* no progress and not done and not special .. hung! */ dev_err(dev->dev, "%s: hangcheck detected gpu lockup rb %d!\n", gpu->name, ring->id); dev_err(dev->dev, "%s: completed fence: %u\n", @@ -365,6 +379,7 @@ static void hangcheck_handler(unsigned long data) queue_work(priv->wq, &gpu->recover_work); } +out: /* if still more pending work, reset the hangcheck timer: */ if (submitted > gpu->hangcheck_fence[ring->id]) hangcheck_timer_reset(gpu); |