drm/ttm: add interruptible parameter to ttm_eu_reserve_buffers
authorMaarten Lankhorst <maarten.lankhorst@canonical.com>
Thu, 9 Jan 2014 10:03:08 +0000 (11:03 +0100)
committerMaarten Lankhorst <maarten.lankhorst@canonical.com>
Mon, 1 Sep 2014 08:16:43 +0000 (10:16 +0200)
It seems some drivers really want this as a parameter,
like vmwgfx.

Signed-off-by: Maarten Lankhorst <maarten.lankhorst@canonical.com>
drivers/gpu/drm/qxl/qxl_release.c
drivers/gpu/drm/radeon/radeon_object.c
drivers/gpu/drm/radeon/radeon_vm.c
drivers/gpu/drm/ttm/ttm_execbuf_util.c
drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c
drivers/gpu/drm/vmwgfx/vmwgfx_resource.c
include/drm/ttm/ttm_execbuf_util.h

index 2e5e38fee9b29a32b20fe867d868aab7f9e5b4c2..656f9d3a946d153a06f8ba55769a8ce3a820d540 100644 (file)
@@ -159,7 +159,7 @@ int qxl_release_reserve_list(struct qxl_release *release, bool no_intr)
        if (list_is_singular(&release->bos))
                return 0;
 
-       ret = ttm_eu_reserve_buffers(&release->ticket, &release->bos);
+       ret = ttm_eu_reserve_buffers(&release->ticket, &release->bos, !no_intr);
        if (ret)
                return ret;
 
index cbac963571c0a5d479decdc50bef6a2e9a3bca56..378fe9ea4d4458df4e88b4b7128be83a5d895871 100644 (file)
@@ -482,7 +482,7 @@ int radeon_bo_list_validate(struct radeon_device *rdev,
        u64 bytes_moved = 0, initial_bytes_moved;
        u64 bytes_moved_threshold = radeon_bo_get_threshold_for_moves(rdev);
 
-       r = ttm_eu_reserve_buffers(ticket, head);
+       r = ttm_eu_reserve_buffers(ticket, head, true);
        if (unlikely(r != 0)) {
                return r;
        }
index 4751c6728fe9fffd2261596877754a85ffc96b1d..3d9a6a036f8ad47ec680bbbd21283cb347424477 100644 (file)
@@ -399,7 +399,7 @@ static int radeon_vm_clear_bo(struct radeon_device *rdev,
         INIT_LIST_HEAD(&head);
         list_add(&tv.head, &head);
 
-        r = ttm_eu_reserve_buffers(&ticket, &head);
+        r = ttm_eu_reserve_buffers(&ticket, &head, true);
         if (r)
                return r;
 
index 0fbbbbd67afc70fca4f4a14d15f9e8ba33d40dc2..87d7deefc8061c88ba712d25ba7de175d297f929 100644 (file)
@@ -112,7 +112,7 @@ EXPORT_SYMBOL(ttm_eu_backoff_reservation);
  */
 
 int ttm_eu_reserve_buffers(struct ww_acquire_ctx *ticket,
-                          struct list_head *list)
+                          struct list_head *list, bool intr)
 {
        struct ttm_bo_global *glob;
        struct ttm_validate_buffer *entry;
@@ -140,7 +140,7 @@ retry:
                if (entry->reserved)
                        continue;
 
-               ret = __ttm_bo_reserve(bo, true, (ticket == NULL), true,
+               ret = __ttm_bo_reserve(bo, intr, (ticket == NULL), true,
                                       ticket);
 
                if (ret == -EDEADLK) {
@@ -153,13 +153,17 @@ retry:
                        ttm_eu_backoff_reservation_locked(list);
                        spin_unlock(&glob->lru_lock);
                        ttm_eu_list_ref_sub(list);
-                       ret = ww_mutex_lock_slow_interruptible(&bo->resv->lock,
-                                                              ticket);
-                       if (unlikely(ret != 0)) {
-                               if (ret == -EINTR)
-                                       ret = -ERESTARTSYS;
-                               goto err_fini;
-                       }
+
+                       if (intr) {
+                               ret = ww_mutex_lock_slow_interruptible(&bo->resv->lock,
+                                                                      ticket);
+                               if (unlikely(ret != 0)) {
+                                       if (ret == -EINTR)
+                                               ret = -ERESTARTSYS;
+                                       goto err_fini;
+                               }
+                       } else
+                               ww_mutex_lock_slow(&bo->resv->lock, ticket);
 
                        entry->reserved = true;
                        if (unlikely(atomic_read(&bo->cpu_writers) > 0)) {
index 7bfdaa163a33a19fb7ca8d775e654277aea497ea..24f067bf438dbdf1deb9f442ed6c4fdde8cc0da5 100644 (file)
@@ -2496,7 +2496,7 @@ int vmw_execbuf_process(struct drm_file *file_priv,
        if (unlikely(ret != 0))
                goto out_err_nores;
 
-       ret = ttm_eu_reserve_buffers(&ticket, &sw_context->validate_nodes);
+       ret = ttm_eu_reserve_buffers(&ticket, &sw_context->validate_nodes, true);
        if (unlikely(ret != 0))
                goto out_err;
 
@@ -2684,10 +2684,7 @@ void __vmw_execbuf_release_pinned_bo(struct vmw_private *dev_priv,
        query_val.bo = ttm_bo_reference(dev_priv->dummy_query_bo);
        list_add_tail(&query_val.head, &validate_list);
 
-       do {
-               ret = ttm_eu_reserve_buffers(&ticket, &validate_list);
-       } while (ret == -ERESTARTSYS);
-
+       ret = ttm_eu_reserve_buffers(&ticket, &validate_list, false);
        if (unlikely(ret != 0)) {
                vmw_execbuf_unpin_panic(dev_priv);
                goto out_no_reserve;
index 1ee86bf82750e082ad69bc97d443e8e2f9cb9b10..23169362bca82c4fd6424da585d76a95e44f9711 100644 (file)
@@ -1216,7 +1216,7 @@ vmw_resource_check_buffer(struct vmw_resource *res,
        INIT_LIST_HEAD(&val_list);
        val_buf->bo = ttm_bo_reference(&res->backup->base);
        list_add_tail(&val_buf->head, &val_list);
-       ret = ttm_eu_reserve_buffers(NULL, &val_list);
+       ret = ttm_eu_reserve_buffers(NULL, &val_list, interruptible);
        if (unlikely(ret != 0))
                goto out_no_reserve;
 
index 16db7d01a33668b576d9888fa8335bc7cc3346c9..fd95fd569ca3a0a74c72be374c57d2403861aecd 100644 (file)
@@ -73,6 +73,7 @@ extern void ttm_eu_backoff_reservation(struct ww_acquire_ctx *ticket,
  * @ticket:  [out] ww_acquire_ctx filled in by call, or NULL if only
  *           non-blocking reserves should be tried.
  * @list:    thread private list of ttm_validate_buffer structs.
+ * @intr:    should the wait be interruptible
  *
  * Tries to reserve bos pointed to by the list entries for validation.
  * If the function returns 0, all buffers are marked as "unfenced",
@@ -84,9 +85,9 @@ extern void ttm_eu_backoff_reservation(struct ww_acquire_ctx *ticket,
  * CPU write reservations to be cleared, and for other threads to
  * unreserve their buffers.
  *
- * This function may return -ERESTART or -EAGAIN if the calling process
- * receives a signal while waiting. In that case, no buffers on the list
- * will be reserved upon return.
+ * If intr is set to true, this function may return -ERESTARTSYS if the
+ * calling process receives a signal while waiting. In that case, no
+ * buffers on the list will be reserved upon return.
  *
  * Buffers reserved by this function should be unreserved by
  * a call to either ttm_eu_backoff_reservation() or
@@ -95,7 +96,7 @@ extern void ttm_eu_backoff_reservation(struct ww_acquire_ctx *ticket,
  */
 
 extern int ttm_eu_reserve_buffers(struct ww_acquire_ctx *ticket,
-                                 struct list_head *list);
+                                 struct list_head *list, bool intr);
 
 /**
  * function ttm_eu_fence_buffer_objects.