author | Shuide 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) |
commit | cb1b4d5647c8a1f318f2a72a4f3e4d9330dda4c3 (patch) | |
tree | ec8decd719f6e5a85893eabb82ba62a535e2605c | |
parent | 7ac5a0503ee83b258f89a57c4baab34cdcd58a8f (diff) | |
parent | c9e43a4b669acb6d946f737d2f77e27d6482787e (diff) | |
download | common-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
-rw-r--r-- | drivers/dma-buf/sync_file.c | 5 | ||||
-rw-r--r-- | include/linux/sync_file.h | 3 |
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); |