diff options
author | Linux Build Service Account <lnxbuild@quicinc.com> | 2017-06-20 03:20:27 -0700 |
---|---|---|
committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2017-06-20 03:20:27 -0700 |
commit | c9e6118965af545161299a3fac371109651d7b88 (patch) | |
tree | 6102fdfb84ad82f8771b37fe104e83666065484a /drivers | |
parent | 73a0e7ea498e45c9bf25612658311c63c89fc4d8 (diff) | |
parent | b25ea02d2273fb6ee2a797f7d67da341d7b60b6b (diff) |
Merge "drm/msm: Add a submit queue flag to disable the QoS timer"
Diffstat (limited to 'drivers')
-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); |