All of lore.kernel.org
 help / color / mirror / Atom feed
From: Gustavo Padovan <gustavo@padovan.org>
To: dri-devel@lists.freedesktop.org
Cc: linux-kernel@vger.kernel.org,
	Daniel Stone <daniels@collabora.com>,
	Daniel Vetter <daniel.vetter@ffwll.ch>,
	Rob Clark <robdclark@gmail.com>,
	Greg Hackmann <ghackmann@google.com>,
	John Harrison <John.C.Harrison@Intel.com>,
	laurent.pinchart@ideasonboard.com, seanpaul@google.com,
	marcheu@google.com, m.chehab@samsung.com,
	Sumit Semwal <sumit.semwal@linaro.org>,
	Maarten Lankhorst <maarten.lankhorst@linux.intel.com>,
	Gustavo Padovan <gustavo.padovan@collabora.co.uk>
Subject: [PATCH 2/3] dma-buf/sync_file: add sync_file_get_fence()
Date: Thu,  9 Jun 2016 12:05:29 -0300	[thread overview]
Message-ID: <1465484730-8128-2-git-send-email-gustavo@padovan.org> (raw)
In-Reply-To: <1465484730-8128-1-git-send-email-gustavo@padovan.org>

From: Gustavo Padovan <gustavo.padovan@collabora.co.uk>

Creates a function that given an sync file descriptor returns a
fence_collection containing all fences in the sync_file.

If there is only one fence in the sync_file this fence itself is returned,
however if there is more than one, a fence_collection fence is returned.

v2: Comments by Daniel Vetter
	- Adapt to new version of fence_collection_init()
	- Hold a reference for the fence we return

v3:     - Adapt to use fput() directly
	- rename to sync_file_get_fence() as we always return one fence

v4: Adapt to use fence_array

Signed-off-by: Gustavo Padovan <gustavo.padovan@collabora.co.uk>
---
 drivers/dma-buf/sync_file.c | 61 +++++++++++++++++++++++++++++++++++++++++++++
 include/linux/sync_file.h   |  4 ++-
 2 files changed, 64 insertions(+), 1 deletion(-)

diff --git a/drivers/dma-buf/sync_file.c b/drivers/dma-buf/sync_file.c
index 59f3445..daaf411 100644
--- a/drivers/dma-buf/sync_file.c
+++ b/drivers/dma-buf/sync_file.c
@@ -23,6 +23,7 @@
 #include <linux/slab.h>
 #include <linux/uaccess.h>
 #include <linux/anon_inodes.h>
+#include <linux/fence-array.h>
 #include <linux/sync_file.h>
 #include <uapi/linux/sync_file.h>
 
@@ -122,6 +123,63 @@ err:
 	return NULL;
 }
 
+/**
+ * sync_file_get_fence - get the fence related to the sync_file fd
+ * @fd:		sync_file fd to get the fence from
+ *
+ * Ensures @fd references a valid sync_file and returns a fence that
+ * represents all fence in the sync_file.
+ *
+ * If there is only one fence in the sync_file, this fence is returned.
+ * If there is more than one, a fence_array containing all fences
+ * is created and its base fence object is returned.
+ * On both cases a reference to the returned fence is held. On error
+ * NULL is returned.
+ */
+struct fence *sync_file_get_fence(int fd)
+{
+	struct sync_file *sync_file;
+	struct fence_array *fence_array;
+	struct fence **fences;
+	int i;
+
+	sync_file = sync_file_fdget(fd);
+	if (!sync_file)
+		return NULL;
+
+	if (sync_file->num_fences == 1) {
+		struct fence *fence = sync_file->cbs[0].fence;
+
+		fence_get(fence);
+		fput(sync_file->file);
+		return fence;
+	}
+
+	fences = kcalloc(sync_file->num_fences, sizeof(**fences), GFP_KERNEL);
+	if (!fences) {
+		fput(sync_file->file);
+		return NULL;
+	}
+
+	for (i = 0 ; i < sync_file->num_fences ; i++)
+		fences[i] = sync_file->cbs[i].fence;
+
+	fence_array = fence_array_create(sync_file->num_fences, fences,
+					fence_context_alloc(1), 1, false);
+	if (!fence_array) {
+		kfree(fences);
+		fput(sync_file->file);
+		return NULL;
+	}
+
+	sync_file->fence_array = fence_array;
+	fence_get(&fence_array->base);
+	fput(sync_file->file);
+
+	return &fence_array->base;
+}
+EXPORT_SYMBOL(sync_file_get_fence);
+
 static void sync_file_add_pt(struct sync_file *sync_file, int *i,
 			     struct fence *fence)
 {
@@ -209,6 +267,9 @@ static void sync_file_free(struct kref *kref)
 						     kref);
 	int i;
 
+	if (sync_file->fence_array)
+		fence_put(&sync_file->fence_array->base);
+
 	for (i = 0; i < sync_file->num_fences; ++i)
 		fence_put(sync_file->cbs[i].fence);
 
diff --git a/include/linux/sync_file.h b/include/linux/sync_file.h
index c6ffe8b..33cb3d6 100644
--- a/include/linux/sync_file.h
+++ b/include/linux/sync_file.h
@@ -35,6 +35,7 @@ struct sync_file_cb {
  * @num_fences:		number of sync_pts in the fence
  * @wq:			wait queue for fence signaling
  * @status:		0: signaled, >0:active, <0: error
+ * @fence_array:	array with the fences in the sync_file
  * @cbs:		sync_pts callback information
  */
 struct sync_file {
@@ -49,9 +50,10 @@ struct sync_file {
 	wait_queue_head_t	wq;
 	atomic_t		status;
 
+	struct fence_array	*fence_array;
 	struct sync_file_cb	cbs[];
 };
 
 struct sync_file *sync_file_create(struct fence *fence);
-
+struct fence *sync_file_get_fence(int fd);
 #endif /* _LINUX_SYNC_H */
-- 
2.5.5

  reply	other threads:[~2016-06-09 15:07 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-06-09 15:05 [PATCH 1/3] dma-buf/sync_file: only enable fence signalling during wait Gustavo Padovan
2016-06-09 15:05 ` Gustavo Padovan [this message]
2016-06-10 12:23   ` [PATCH 2/3] dma-buf/sync_file: add sync_file_get_fence() Chris Wilson
2016-06-10 12:23     ` Chris Wilson
2016-06-13 21:21     ` Gustavo Padovan
2016-06-09 15:05 ` [PATCH 3/3] Documentation: add doc for sync_file_get_fence() Gustavo Padovan
2016-06-09 15:05   ` Gustavo Padovan
2016-06-09 22:12 ` [PATCH 1/3] dma-buf/sync_file: only enable fence signalling during wait Daniel Vetter

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1465484730-8128-2-git-send-email-gustavo@padovan.org \
    --to=gustavo@padovan.org \
    --cc=John.C.Harrison@Intel.com \
    --cc=daniel.vetter@ffwll.ch \
    --cc=daniels@collabora.com \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=ghackmann@google.com \
    --cc=gustavo.padovan@collabora.co.uk \
    --cc=laurent.pinchart@ideasonboard.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=m.chehab@samsung.com \
    --cc=maarten.lankhorst@linux.intel.com \
    --cc=marcheu@google.com \
    --cc=robdclark@gmail.com \
    --cc=seanpaul@google.com \
    --cc=sumit.semwal@linaro.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.