gxp: iif: simplify sync file install logic am: 441f6817bb am: 403e1b39f4
Original change: https://partner-android-review.googlesource.com/c/kernel/private/google-modules/gxp/zuma/+/2771890
Change-Id: Ib84d3180ef7d8ba7a9d3b5f11b21f691ccce1006
Signed-off-by: Automerger Merge Worker <[email protected]>
diff --git a/gcip-kernel-driver/drivers/gcip/iif/iif-fence.c b/gcip-kernel-driver/drivers/gcip/iif/iif-fence.c
index 94333fa..5834af5 100644
--- a/gcip-kernel-driver/drivers/gcip/iif/iif-fence.c
+++ b/gcip-kernel-driver/drivers/gcip/iif/iif-fence.c
@@ -161,7 +161,7 @@
{
lockdep_assert_held(&fence->outstanding_waiters_lock);
- if (!fence->outstanding_waiters && fence->state != IIF_FENCE_STATE_FILE_CREATED)
+ if (!fence->outstanding_waiters && !atomic_read(&fence->num_sync_file))
iif_fence_retire(fence);
}
@@ -230,6 +230,7 @@
iif_fence_table_init_fence_entry(&mgr->fence_table, fence->id, total_signalers);
INIT_LIST_HEAD(&fence->poll_cb_list);
INIT_LIST_HEAD(&fence->all_signaler_submitted_cb_list);
+ atomic_set(&fence->num_sync_file, 0);
return 0;
}
@@ -237,45 +238,21 @@
int iif_fence_install_fd(struct iif_fence *fence)
{
struct iif_sync_file *sync_file;
- int fd, ret;
+ int fd;
- spin_lock(&fence->outstanding_waiters_lock);
-
- if (fence->state != IIF_FENCE_STATE_INITIALIZED) {
- if (iif_fence_has_retired(fence)) {
- pr_err("The fence is already retired, can't install an FD");
- ret = -EPERM;
- } else {
- pr_err("Only one file can be bound to an fence");
- ret = -EEXIST;
- }
- goto err_unlock;
- }
-
- ret = get_unused_fd_flags(O_CLOEXEC);
- if (ret < 0)
- goto err_unlock;
- fd = ret;
+ fd = get_unused_fd_flags(O_CLOEXEC);
+ if (fd < 0)
+ return fd;
sync_file = iif_sync_file_create(fence);
if (IS_ERR(sync_file)) {
- ret = PTR_ERR(sync_file);
- goto err_put_fd;
+ put_unused_fd(fd);
+ return PTR_ERR(sync_file);
}
fd_install(fd, sync_file->file);
- fence->state = IIF_FENCE_STATE_FILE_CREATED;
-
- spin_unlock(&fence->outstanding_waiters_lock);
return fd;
-
-err_put_fd:
- put_unused_fd(fd);
-err_unlock:
- spin_unlock(&fence->outstanding_waiters_lock);
-
- return ret;
}
void iif_fence_on_sync_file_release(struct iif_fence *fence)
@@ -283,10 +260,7 @@
unsigned long flags;
spin_lock_irqsave(&fence->outstanding_waiters_lock, flags);
-
- fence->state = IIF_FENCE_STATE_FILE_RELEASED;
iif_fence_retire_if_possible_locked(fence);
-
spin_unlock_irqrestore(&fence->outstanding_waiters_lock, flags);
}
diff --git a/gcip-kernel-driver/drivers/gcip/iif/iif-sync-file.c b/gcip-kernel-driver/drivers/gcip/iif/iif-sync-file.c
index 81f06e7..f4982d3 100644
--- a/gcip-kernel-driver/drivers/gcip/iif/iif-sync-file.c
+++ b/gcip-kernel-driver/drivers/gcip/iif/iif-sync-file.c
@@ -6,6 +6,7 @@
*/
#include <linux/anon_inodes.h>
+#include <linux/atomic.h>
#include <linux/bitops.h>
#include <linux/file.h>
#include <linux/fs.h>
@@ -28,7 +29,8 @@
{
struct iif_sync_file *sync_file = file->private_data;
- iif_fence_on_sync_file_release(sync_file->fence);
+ if (atomic_dec_and_test(&sync_file->fence->num_sync_file))
+ iif_fence_on_sync_file_release(sync_file->fence);
if (test_bit(IIF_SYNC_FILE_FLAGS_POLL_ENABLED, &sync_file->flags))
iif_fence_remove_poll_callback(sync_file->fence, &sync_file->poll_cb);
iif_fence_put(sync_file->fence);
@@ -109,6 +111,7 @@
}
sync_file->fence = iif_fence_get(fence);
+ atomic_inc(&fence->num_sync_file);
init_waitqueue_head(&sync_file->wq);
INIT_LIST_HEAD(&sync_file->poll_cb.node);
diff --git a/gcip-kernel-driver/include/gcip/iif/iif-fence.h b/gcip-kernel-driver/include/gcip/iif/iif-fence.h
index 933b3eb..befd745 100644
--- a/gcip-kernel-driver/include/gcip/iif/iif-fence.h
+++ b/gcip-kernel-driver/include/gcip/iif/iif-fence.h
@@ -46,10 +46,6 @@
enum iif_fence_state {
/* Initial state. */
IIF_FENCE_STATE_INITIALIZED,
- /* There is a sync file bound with this fence. */
- IIF_FENCE_STATE_FILE_CREATED,
- /* The file bound to this fence has been released. */
- IIF_FENCE_STATE_FILE_RELEASED,
/* The fence ID has been retired. */
IIF_FENCE_STATE_RETIRED,
};
@@ -95,6 +91,8 @@
int signal_error;
/* Will be set to a negative errno if waiting the signaler submission fails. */
int all_signaler_submitted_error;
+ /* The number of sync_file(s) bound to the fence. */
+ atomic_t num_sync_file;
};
/* Operators of `struct iif_fence`. */