gxp: iif: simplify sync file install logic am: 441f6817bb

Original change: https://partner-android-review.googlesource.com/c/kernel/private/google-modules/gxp/zuma/+/2771890

Change-Id: I9e5355b96b0ff38f93a15cb2651bc1f4d06e9cb9
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`. */