aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLucas Stach <l.stach@pengutronix.de>2017-11-24 08:34:46 -0500
committerLucas Stach <l.stach@pengutronix.de>2018-01-02 11:30:44 -0500
commit08301d73f27d59e2ac45411ed7bb2235d68190db (patch)
tree1bb76047bb0c5baf8b78c4e12a77b811b5ca9ab9
parent33a63e68f62bef6981fae781090d480080a73570 (diff)
drm/etnaviv: move ww_acquire_ctx out of submit object
The acquire_ctx is special in that it needs to be released from the same thread as has been used to initialize it. This collides with the intention to extend the submit lifetime beyond the gem_submit function with potentially other threads doing the final cleanup. Move the ww_acquire_ctx to the function local stack as suggested in the documentation. Signed-off-by: Lucas Stach <l.stach@pengutronix.de> Reviewed-by: Philipp Zabel <p.zabel@pengutronix.de>
-rw-r--r--drivers/gpu/drm/etnaviv/etnaviv_gem.h1
-rw-r--r--drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c22
2 files changed, 13 insertions, 10 deletions
diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gem.h b/drivers/gpu/drm/etnaviv/etnaviv_gem.h
index 21cb3460046f..6b78d059ed2d 100644
--- a/drivers/gpu/drm/etnaviv/etnaviv_gem.h
+++ b/drivers/gpu/drm/etnaviv/etnaviv_gem.h
@@ -102,7 +102,6 @@ struct etnaviv_gem_submit_bo {
102 */ 102 */
103struct etnaviv_gem_submit { 103struct etnaviv_gem_submit {
104 struct etnaviv_gpu *gpu; 104 struct etnaviv_gpu *gpu;
105 struct ww_acquire_ctx ticket;
106 struct dma_fence *out_fence, *in_fence; 105 struct dma_fence *out_fence, *in_fence;
107 u32 flags; 106 u32 flags;
108 unsigned int nr_bos; 107 unsigned int nr_bos;
diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c b/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c
index 9b5541207d33..3090a46979af 100644
--- a/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c
+++ b/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c
@@ -44,8 +44,6 @@ static struct etnaviv_gem_submit *submit_create(struct drm_device *dev,
44 44
45 submit->gpu = gpu; 45 submit->gpu = gpu;
46 46
47 ww_acquire_init(&submit->ticket, &reservation_ww_class);
48
49 return submit; 47 return submit;
50} 48}
51 49
@@ -107,7 +105,8 @@ static void submit_unlock_object(struct etnaviv_gem_submit *submit, int i)
107 } 105 }
108} 106}
109 107
110static int submit_lock_objects(struct etnaviv_gem_submit *submit) 108static int submit_lock_objects(struct etnaviv_gem_submit *submit,
109 struct ww_acquire_ctx *ticket)
111{ 110{
112 int contended, slow_locked = -1, i, ret = 0; 111 int contended, slow_locked = -1, i, ret = 0;
113 112
@@ -122,7 +121,7 @@ retry:
122 121
123 if (!(submit->bos[i].flags & BO_LOCKED)) { 122 if (!(submit->bos[i].flags & BO_LOCKED)) {
124 ret = ww_mutex_lock_interruptible(&etnaviv_obj->resv->lock, 123 ret = ww_mutex_lock_interruptible(&etnaviv_obj->resv->lock,
125 &submit->ticket); 124 ticket);
126 if (ret == -EALREADY) 125 if (ret == -EALREADY)
127 DRM_ERROR("BO at index %u already on submit list\n", 126 DRM_ERROR("BO at index %u already on submit list\n",
128 i); 127 i);
@@ -132,7 +131,7 @@ retry:
132 } 131 }
133 } 132 }
134 133
135 ww_acquire_done(&submit->ticket); 134 ww_acquire_done(ticket);
136 135
137 return 0; 136 return 0;
138 137
@@ -150,7 +149,7 @@ fail:
150 149
151 /* we lost out in a seqno race, lock and retry.. */ 150 /* we lost out in a seqno race, lock and retry.. */
152 ret = ww_mutex_lock_slow_interruptible(&etnaviv_obj->resv->lock, 151 ret = ww_mutex_lock_slow_interruptible(&etnaviv_obj->resv->lock,
153 &submit->ticket); 152 ticket);
154 if (!ret) { 153 if (!ret) {
155 submit->bos[contended].flags |= BO_LOCKED; 154 submit->bos[contended].flags |= BO_LOCKED;
156 slow_locked = contended; 155 slow_locked = contended;
@@ -361,7 +360,6 @@ static void submit_cleanup(struct etnaviv_gem_submit *submit)
361 drm_gem_object_put_unlocked(&etnaviv_obj->base); 360 drm_gem_object_put_unlocked(&etnaviv_obj->base);
362 } 361 }
363 362
364 ww_acquire_fini(&submit->ticket);
365 if (submit->in_fence) 363 if (submit->in_fence)
366 dma_fence_put(submit->in_fence); 364 dma_fence_put(submit->in_fence);
367 if (submit->out_fence) 365 if (submit->out_fence)
@@ -381,6 +379,7 @@ int etnaviv_ioctl_gem_submit(struct drm_device *dev, void *data,
381 struct etnaviv_cmdbuf *cmdbuf; 379 struct etnaviv_cmdbuf *cmdbuf;
382 struct etnaviv_gpu *gpu; 380 struct etnaviv_gpu *gpu;
383 struct sync_file *sync_file = NULL; 381 struct sync_file *sync_file = NULL;
382 struct ww_acquire_ctx ticket;
384 int out_fence_fd = -1; 383 int out_fence_fd = -1;
385 void *stream; 384 void *stream;
386 int ret; 385 int ret;
@@ -466,10 +465,12 @@ int etnaviv_ioctl_gem_submit(struct drm_device *dev, void *data,
466 } 465 }
467 } 466 }
468 467
468 ww_acquire_init(&ticket, &reservation_ww_class);
469
469 submit = submit_create(dev, gpu, args->nr_bos); 470 submit = submit_create(dev, gpu, args->nr_bos);
470 if (!submit) { 471 if (!submit) {
471 ret = -ENOMEM; 472 ret = -ENOMEM;
472 goto err_submit_cmds; 473 goto err_submit_ww_acquire;
473 } 474 }
474 475
475 submit->flags = args->flags; 476 submit->flags = args->flags;
@@ -478,7 +479,7 @@ int etnaviv_ioctl_gem_submit(struct drm_device *dev, void *data,
478 if (ret) 479 if (ret)
479 goto err_submit_objects; 480 goto err_submit_objects;
480 481
481 ret = submit_lock_objects(submit); 482 ret = submit_lock_objects(submit, &ticket);
482 if (ret) 483 if (ret)
483 goto err_submit_objects; 484 goto err_submit_objects;
484 485
@@ -545,6 +546,9 @@ int etnaviv_ioctl_gem_submit(struct drm_device *dev, void *data,
545err_submit_objects: 546err_submit_objects:
546 submit_cleanup(submit); 547 submit_cleanup(submit);
547 548
549err_submit_ww_acquire:
550 ww_acquire_fini(&ticket);
551
548err_submit_cmds: 552err_submit_cmds:
549 if (ret && (out_fence_fd >= 0)) 553 if (ret && (out_fence_fd >= 0))
550 put_unused_fd(out_fence_fd); 554 put_unused_fd(out_fence_fd);