summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJiyu Yang <Jiyu.Yang@amlogic.com>2017-09-27 19:42:17 +0800
committerJiyu Yang <Jiyu.Yang@amlogic.com>2017-09-27 19:42:42 +0800
commit22f0e67f96dbce31ae872f08232fbca96f5a767f (patch)
treec2402d23b5245ebc87d418ebe6c2a776746f91ea
parentc0a8aa000aa489055693119592a35f94558d5ac9 (diff)
downloadmali-driver-22f0e67f96dbce31ae872f08232fbca96f5a767f.tar.gz
gpu: fixed sync leak in AOSP common kernel or LTS kernel 4.10
PD#151104 Change-Id: I1d1b1481b4579be486525c44378205326c372dd4
-rwxr-xr-xmali/linux/mali_internal_sync.c12
-rwxr-xr-xmali/linux/mali_sync.c6
2 files changed, 17 insertions, 1 deletions
diff --git a/mali/linux/mali_internal_sync.c b/mali/linux/mali_internal_sync.c
index 3a9f03a..ea9557a 100755
--- a/mali/linux/mali_internal_sync.c
+++ b/mali/linux/mali_internal_sync.c
@@ -289,6 +289,10 @@ struct mali_internal_sync_fence *mali_internal_sync_fence_merge(
return NULL;
}
+ fence_remove_callback(new_sync_fence->cb[0].fence, &new_sync_fence->cb[0].cb);
+ new_sync_fence->num_fences = 0;
+ atomic_dec(&new_sync_fence->status);
+
for (; i < num_fence1 && j < num_fence2;) {
struct fence *fence1 = sync_fence1->cbs[i].fence;
struct fence *fence2 = sync_fence2->cbs[j].fence;
@@ -468,7 +472,13 @@ struct mali_internal_sync_fence *mali_internal_sync_fence_merge(
MALI_PRINT_ERROR(("Mali internal sync:Failed to create the mali internal sync fence when merging sync fence.\n"));
goto sync_fence_alloc_failed;
}
-
+
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 10, 0)
+ fence_put(fences[0]);
+#else
+ dma_fence_put(fences[0]);
+#endif
+
if (mali_internal_sync_fence_set_fence_array(sync_fence, fences, real_num_fences) < 0) {
MALI_PRINT_ERROR(("Mali internal sync:Failed to set fence for sync fence.\n"));
goto sync_fence_set_failed;
diff --git a/mali/linux/mali_sync.c b/mali/linux/mali_sync.c
index 2bba431..1712cfd 100755
--- a/mali/linux/mali_sync.c
+++ b/mali/linux/mali_sync.c
@@ -613,6 +613,12 @@ struct mali_internal_sync_fence *mali_sync_flag_create_fence(struct mali_sync_fl
return NULL;
}
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 10, 0)
+ fence_put(&sync_pt->base);
+#else
+ dma_fence_put(&sync_pt->base);
+#endif
+
return sync_fence;
}
#endif