summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorLinux Build Service Account <lnxbuild@quicinc.com>2017-06-20 03:20:27 -0700
committerGerrit - the friendly Code Review server <code-review@localhost>2017-06-20 03:20:27 -0700
commitc9e6118965af545161299a3fac371109651d7b88 (patch)
tree6102fdfb84ad82f8771b37fe104e83666065484a /drivers
parent73a0e7ea498e45c9bf25612658311c63c89fc4d8 (diff)
parentb25ea02d2273fb6ee2a797f7d67da341d7b60b6b (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.c7
-rw-r--r--drivers/gpu/drm/msm/msm_gpu.c17
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);