diff options
author | Lucas Stach <l.stach@pengutronix.de> | 2017-11-24 05:36:03 -0500 |
---|---|---|
committer | Lucas Stach <l.stach@pengutronix.de> | 2018-01-02 11:31:31 -0500 |
commit | e0329e6cfa6274ceb54d175b5e6ac19c00024c33 (patch) | |
tree | 61f286acee5eb8fb92c6b48f31159c3d1e994d03 | |
parent | 08301d73f27d59e2ac45411ed7bb2235d68190db (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.h | 3 | ||||
-rw-r--r-- | drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c | 12 |
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 | */ |
103 | struct etnaviv_gem_submit { | 103 | struct 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 | ||
113 | void etnaviv_submit_put(struct etnaviv_gem_submit * submit); | ||
114 | |||
112 | int etnaviv_gem_wait_bo(struct etnaviv_gpu *gpu, struct drm_gem_object *obj, | 115 | int etnaviv_gem_wait_bo(struct etnaviv_gpu *gpu, struct drm_gem_object *obj, |
113 | struct timespec *timeout); | 116 | struct timespec *timeout); |
114 | int etnaviv_gem_new_private(struct drm_device *dev, size_t size, u32 flags, | 117 | int 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 | ||
344 | static void submit_cleanup(struct etnaviv_gem_submit *submit) | 345 | static 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 | ||
373 | void etnaviv_submit_put(struct etnaviv_gem_submit *submit) | ||
374 | { | ||
375 | kref_put(&submit->refcount, submit_cleanup); | ||
376 | } | ||
377 | |||
370 | int etnaviv_ioctl_gem_submit(struct drm_device *dev, void *data, | 378 | int 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 | ||
546 | err_submit_objects: | 554 | err_submit_objects: |
547 | submit_cleanup(submit); | 555 | etnaviv_submit_put(submit); |
548 | 556 | ||
549 | err_submit_ww_acquire: | 557 | err_submit_ww_acquire: |
550 | ww_acquire_fini(&ticket); | 558 | ww_acquire_fini(&ticket); |