summaryrefslogtreecommitdiff
authorShuide Chen <shuide.chen@amlogic.com>2018-08-14 07:27:34 (GMT)
committer Gerrit Code Review <gituser@droid04>2018-08-14 07:27:34 (GMT)
commitcb1b4d5647c8a1f318f2a72a4f3e4d9330dda4c3 (patch)
treeec8decd719f6e5a85893eabb82ba62a535e2605c
parent7ac5a0503ee83b258f89a57c4baab34cdcd58a8f (diff)
parentc9e43a4b669acb6d946f737d2f77e27d6482787e (diff)
downloadcommon-cb1b4d5647c8a1f318f2a72a4f3e4d9330dda4c3.zip
common-cb1b4d5647c8a1f318f2a72a4f3e4d9330dda4c3.tar.gz
common-cb1b4d5647c8a1f318f2a72a4f3e4d9330dda4c3.tar.bz2
Merge "BACKPORT: dma-buf/sync_file: Allow multiple sync_files to wrap a single dma-fence" into p-amlogic
Diffstat
-rw-r--r--drivers/dma-buf/sync_file.c5
-rw-r--r--include/linux/sync_file.h3
2 files changed, 5 insertions, 3 deletions
diff --git a/drivers/dma-buf/sync_file.c b/drivers/dma-buf/sync_file.c
index 56a45cd..267546a 100644
--- a/drivers/dma-buf/sync_file.c
+++ b/drivers/dma-buf/sync_file.c
@@ -278,7 +278,7 @@ static void sync_file_free(struct kref *kref)
struct sync_file *sync_file = container_of(kref, struct sync_file,
kref);
- if (test_bit(POLL_ENABLED, &sync_file->fence->flags))
+ if (test_bit(POLL_ENABLED, &sync_file->flags))
fence_remove_callback(sync_file->fence, &sync_file->cb);
fence_put(sync_file->fence);
kfree(sync_file);
@@ -298,7 +298,8 @@ static unsigned int sync_file_poll(struct file *file, poll_table *wait)
poll_wait(file, &sync_file->wq, wait);
- if (!test_and_set_bit(POLL_ENABLED, &sync_file->fence->flags)) {
+ if (list_empty(&sync_file->cb.node) &&
+ !test_and_set_bit(POLL_ENABLED, &sync_file->flags)) {
if (fence_add_callback(sync_file->fence, &sync_file->cb,
fence_check_cb_func) < 0)
wake_up_all(&sync_file->wq);
diff --git a/include/linux/sync_file.h b/include/linux/sync_file.h
index aa17ccf..35ec6c4 100644
--- a/include/linux/sync_file.h
+++ b/include/linux/sync_file.h
@@ -40,12 +40,13 @@ struct sync_file {
#endif
wait_queue_head_t wq;
+ unsigned long flags;
struct fence *fence;
struct fence_cb cb;
};
-#define POLL_ENABLED FENCE_FLAG_USER_BITS
+#define POLL_ENABLED 0
struct sync_file *sync_file_create(struct fence *fence);
struct fence *sync_file_get_fence(int fd);