aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLucas Stach <l.stach@pengutronix.de>2017-11-24 05:36:03 -0500
committerLucas Stach <l.stach@pengutronix.de>2018-01-02 11:31:31 -0500
commite0329e6cfa6274ceb54d175b5e6ac19c00024c33 (patch)
tree61f286acee5eb8fb92c6b48f31159c3d1e994d03
parent08301d73f27d59e2ac45411ed7bb2235d68190db (diff)
drm/etnaviv: refcount the submit object
The submit object lifetime will get extended to the actual GPU execution. As multiple users will depend on this, add a kref to properly control destruction of the object. 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.h3
-rw-r--r--drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c12
2 files changed, 13 insertions, 2 deletions
diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gem.h b/drivers/gpu/drm/etnaviv/etnaviv_gem.h
index 6b78d059ed2d..4238f8d8541d 100644
--- a/drivers/gpu/drm/etnaviv/etnaviv_gem.h
+++ b/drivers/gpu/drm/etnaviv/etnaviv_gem.h
@@ -101,6 +101,7 @@ struct etnaviv_gem_submit_bo {
101 * lasts for the duration of the submit-ioctl. 101 * lasts for the duration of the submit-ioctl.
102 */ 102 */
103struct etnaviv_gem_submit { 103struct etnaviv_gem_submit {
104 struct kref refcount;
104 struct etnaviv_gpu *gpu; 105 struct etnaviv_gpu *gpu;
105 struct dma_fence *out_fence, *in_fence; 106 struct dma_fence *out_fence, *in_fence;
106 u32 flags; 107 u32 flags;
@@ -109,6 +110,8 @@ struct etnaviv_gem_submit {
109 /* No new members here, the previous one is variable-length! */ 110 /* No new members here, the previous one is variable-length! */
110}; 111};
111 112
113void etnaviv_submit_put(struct etnaviv_gem_submit * submit);
114
112int etnaviv_gem_wait_bo(struct etnaviv_gpu *gpu, struct drm_gem_object *obj, 115int etnaviv_gem_wait_bo(struct etnaviv_gpu *gpu, struct drm_gem_object *obj,
113 struct timespec *timeout); 116 struct timespec *timeout);
114int etnaviv_gem_new_private(struct drm_device *dev, size_t size, u32 flags, 117int etnaviv_gem_new_private(struct drm_device *dev, size_t size, u32 flags,
diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c b/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c
index 3090a46979af..9b4436c380ea 100644
--- a/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c
+++ b/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c
@@ -43,6 +43,7 @@ static struct etnaviv_gem_submit *submit_create(struct drm_device *dev,
43 return NULL; 43 return NULL;
44 44
45 submit->gpu = gpu; 45 submit->gpu = gpu;
46 kref_init(&submit->refcount);
46 47
47 return submit; 48 return submit;
48} 49}
@@ -341,8 +342,10 @@ static int submit_perfmon_validate(struct etnaviv_gem_submit *submit,
341 return 0; 342 return 0;
342} 343}
343 344
344static void submit_cleanup(struct etnaviv_gem_submit *submit) 345static void submit_cleanup(struct kref *kref)
345{ 346{
347 struct etnaviv_gem_submit *submit =
348 container_of(kref, struct etnaviv_gem_submit, refcount);
346 unsigned i; 349 unsigned i;
347 350
348 for (i = 0; i < submit->nr_bos; i++) { 351 for (i = 0; i < submit->nr_bos; i++) {
@@ -367,6 +370,11 @@ static void submit_cleanup(struct etnaviv_gem_submit *submit)
367 kfree(submit); 370 kfree(submit);
368} 371}
369 372
373void etnaviv_submit_put(struct etnaviv_gem_submit *submit)
374{
375 kref_put(&submit->refcount, submit_cleanup);
376}
377
370int etnaviv_ioctl_gem_submit(struct drm_device *dev, void *data, 378int etnaviv_ioctl_gem_submit(struct drm_device *dev, void *data,
371 struct drm_file *file) 379 struct drm_file *file)
372{ 380{
@@ -544,7 +552,7 @@ int etnaviv_ioctl_gem_submit(struct drm_device *dev, void *data,
544 args->fence = submit->out_fence->seqno; 552 args->fence = submit->out_fence->seqno;
545 553
546err_submit_objects: 554err_submit_objects:
547 submit_cleanup(submit); 555 etnaviv_submit_put(submit);
548 556
549err_submit_ww_acquire: 557err_submit_ww_acquire:
550 ww_acquire_fini(&ticket); 558 ww_acquire_fini(&ticket);