* [PATCH v2 01/13] staging/android: remove redundant comments on sync_merge_data
2016-04-28 13:46 [PATCH v2 00/13] De-stage Sync File Framework Gustavo Padovan
@ 2016-04-28 13:46 ` Gustavo Padovan
2016-04-28 13:46 ` [PATCH v2 02/13] staging/android: drop sync_file_install() and sync_file_put() Gustavo Padovan
` (12 subsequent siblings)
13 siblings, 0 replies; 16+ messages in thread
From: Gustavo Padovan @ 2016-04-28 13:46 UTC (permalink / raw)
To: Greg Kroah-Hartman
Cc: linux-kernel, devel, dri-devel, Daniel Stone,
Arve Hjønnevåg, Riley Andrews, Daniel Vetter,
Rob Clark, Greg Hackmann, John Harrison, Maarten Lankhorst,
Sumit Semwal, Gustavo Padovan
From: Gustavo Padovan <gustavo.padovan@collabora.co.uk>
struct sync_merge_data already have documentation on top of the
struct definition. No need to duplicate it.
Signed-off-by: Gustavo Padovan <gustavo.padovan@collabora.co.uk>
Reviewed-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
---
drivers/staging/android/uapi/sync.h | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/drivers/staging/android/uapi/sync.h b/drivers/staging/android/uapi/sync.h
index 7de5d6a..413303d 100644
--- a/drivers/staging/android/uapi/sync.h
+++ b/drivers/staging/android/uapi/sync.h
@@ -23,9 +23,9 @@
* @pad: padding for 64-bit alignment, should always be zero
*/
struct sync_merge_data {
- char name[32]; /* name of new fence */
- __s32 fd2; /* fd of second fence */
- __s32 fence; /* fd on newly created fence */
+ char name[32];
+ __s32 fd2;
+ __s32 fence;
__u32 flags;
__u32 pad;
};
@@ -33,8 +33,8 @@ struct sync_merge_data {
/**
* struct sync_fence_info - detailed fence information
* @obj_name: name of parent sync_timeline
- * @driver_name: name of driver implementing the parent
- * @status: status of the fence 0:active 1:signaled <0:error
+* @driver_name: name of driver implementing the parent
+* @status: status of the fence 0:active 1:signaled <0:error
* @flags: fence_info flags
* @timestamp_ns: timestamp of status change in nanoseconds
*/
--
2.5.5
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH v2 02/13] staging/android: drop sync_file_install() and sync_file_put()
2016-04-28 13:46 [PATCH v2 00/13] De-stage Sync File Framework Gustavo Padovan
2016-04-28 13:46 ` [PATCH v2 01/13] staging/android: remove redundant comments on sync_merge_data Gustavo Padovan
@ 2016-04-28 13:46 ` Gustavo Padovan
2016-04-28 13:46 ` [PATCH v2 03/13] staging/android: move sync_file functions comments to sync.c Gustavo Padovan
` (11 subsequent siblings)
13 siblings, 0 replies; 16+ messages in thread
From: Gustavo Padovan @ 2016-04-28 13:46 UTC (permalink / raw)
To: Greg Kroah-Hartman
Cc: linux-kernel, devel, dri-devel, Daniel Stone,
Arve Hjønnevåg, Riley Andrews, Daniel Vetter,
Rob Clark, Greg Hackmann, John Harrison, Maarten Lankhorst,
Sumit Semwal, Gustavo Padovan
From: Gustavo Padovan <gustavo.padovan@collabora.co.uk>
These two functions are just wrappers for one line functions, they
call fd_install() and fput() respectively, so just get rid of them
and use fd_install() and fput() directly for more simplicity.
Signed-off-by: Gustavo Padovan <gustavo.padovan@collabora.co.uk>
Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
---
drivers/staging/android/sync.c | 20 ++++----------------
drivers/staging/android/sync.h | 19 -------------------
drivers/staging/android/sync_debug.c | 4 ++--
3 files changed, 6 insertions(+), 37 deletions(-)
diff --git a/drivers/staging/android/sync.c b/drivers/staging/android/sync.c
index f9c6094..b965e2a 100644
--- a/drivers/staging/android/sync.c
+++ b/drivers/staging/android/sync.c
@@ -216,18 +216,6 @@ err:
}
EXPORT_SYMBOL(sync_file_fdget);
-void sync_file_put(struct sync_file *sync_file)
-{
- fput(sync_file->file);
-}
-EXPORT_SYMBOL(sync_file_put);
-
-void sync_file_install(struct sync_file *sync_file, int fd)
-{
- fd_install(fd, sync_file->file);
-}
-EXPORT_SYMBOL(sync_file_install);
-
static void sync_file_add_pt(struct sync_file *sync_file, int *i,
struct fence *fence)
{
@@ -469,15 +457,15 @@ static long sync_file_ioctl_merge(struct sync_file *sync_file,
goto err_put_fence3;
}
- sync_file_install(fence3, fd);
- sync_file_put(fence2);
+ fd_install(fd, fence3->file);
+ fput(fence2->file);
return 0;
err_put_fence3:
- sync_file_put(fence3);
+ fput(fence3->file);
err_put_fence2:
- sync_file_put(fence2);
+ fput(fence2->file);
err_put_fd:
put_unused_fd(fd);
diff --git a/drivers/staging/android/sync.h b/drivers/staging/android/sync.h
index d2a1734..c45cc7b 100644
--- a/drivers/staging/android/sync.h
+++ b/drivers/staging/android/sync.h
@@ -203,25 +203,6 @@ struct sync_file *sync_file_merge(const char *name,
*/
struct sync_file *sync_file_fdget(int fd);
-/**
- * sync_file_put() - puts a reference of a sync_file
- * @sync_file: sync_file to put
- *
- * Puts a reference on @sync_fence. If this is the last reference, the
- * sync_fil and all it's sync_pts will be freed
- */
-void sync_file_put(struct sync_file *sync_file);
-
-/**
- * sync_file_install() - installs a sync_file into a file descriptor
- * @sync_file: sync_file to install
- * @fd: file descriptor in which to install the fence
- *
- * Installs @sync_file into @fd. @fd's should be acquired through
- * get_unused_fd_flags(O_CLOEXEC).
- */
-void sync_file_install(struct sync_file *sync_file, int fd);
-
#ifdef CONFIG_DEBUG_FS
void sync_timeline_debug_add(struct sync_timeline *obj);
diff --git a/drivers/staging/android/sync_debug.c b/drivers/staging/android/sync_debug.c
index 5a7ec58..e4b0e41 100644
--- a/drivers/staging/android/sync_debug.c
+++ b/drivers/staging/android/sync_debug.c
@@ -272,12 +272,12 @@ static long sw_sync_ioctl_create_fence(struct sw_sync_timeline *obj,
data.fence = fd;
if (copy_to_user((void __user *)arg, &data, sizeof(data))) {
- sync_file_put(sync_file);
+ fput(sync_file->file);
err = -EFAULT;
goto err;
}
- sync_file_install(sync_file, fd);
+ fd_install(fd, sync_file->file);
return 0;
--
2.5.5
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH v2 03/13] staging/android: move sync_file functions comments to sync.c
2016-04-28 13:46 [PATCH v2 00/13] De-stage Sync File Framework Gustavo Padovan
2016-04-28 13:46 ` [PATCH v2 01/13] staging/android: remove redundant comments on sync_merge_data Gustavo Padovan
2016-04-28 13:46 ` [PATCH v2 02/13] staging/android: drop sync_file_install() and sync_file_put() Gustavo Padovan
@ 2016-04-28 13:46 ` Gustavo Padovan
2016-04-28 13:46 ` [PATCH v2 04/13] staging/android: make sync_file_merge() static Gustavo Padovan
` (10 subsequent siblings)
13 siblings, 0 replies; 16+ messages in thread
From: Gustavo Padovan @ 2016-04-28 13:46 UTC (permalink / raw)
To: Greg Kroah-Hartman
Cc: linux-kernel, devel, dri-devel, Daniel Stone,
Arve Hjønnevåg, Riley Andrews, Daniel Vetter,
Rob Clark, Greg Hackmann, John Harrison, Maarten Lankhorst,
Sumit Semwal, Gustavo Padovan
From: Gustavo Padovan <gustavo.padovan@collabora.co.uk>
To keep comments in line with drivers/dma-buf/ move all sync_file comments
to sync.c.
Signed-off-by: Gustavo Padovan <gustavo.padovan@collabora.co.uk>
Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
---
drivers/staging/android/sync.c | 26 +++++++++++++++++++++++++-
drivers/staging/android/sync.h | 31 -------------------------------
2 files changed, 25 insertions(+), 32 deletions(-)
diff --git a/drivers/staging/android/sync.c b/drivers/staging/android/sync.c
index b965e2a..a89ded0 100644
--- a/drivers/staging/android/sync.c
+++ b/drivers/staging/android/sync.c
@@ -173,7 +173,14 @@ static void fence_check_cb_func(struct fence *f, struct fence_cb *cb)
wake_up_all(&sync_file->wq);
}
-/* TODO: implement a create which takes more that one fence */
+/**
+ * sync_fence_create() - creates a sync fence
+ * @name: name of fence to create
+ * @fence: fence to add to the sync_fence
+ *
+ * Creates a sync_file containg @fence. Once this is called, the sync_file
+ * takes ownership of @fence.
+ */
struct sync_file *sync_file_create(const char *name, struct fence *fence)
{
struct sync_file *sync_file;
@@ -198,6 +205,13 @@ struct sync_file *sync_file_create(const char *name, struct fence *fence)
}
EXPORT_SYMBOL(sync_file_create);
+/**
+ * sync_file_fdget() - get a sync_file from an fd
+ * @fd: fd referencing a fence
+ *
+ * Ensures @fd references a valid sync_file, increments the refcount of the
+ * backing file. Returns the sync_file or NULL in case of error.
+ */
struct sync_file *sync_file_fdget(int fd)
{
struct file *file = fget(fd);
@@ -229,6 +243,16 @@ static void sync_file_add_pt(struct sync_file *sync_file, int *i,
}
}
+/**
+ * sync_file_merge() - merge two sync_files
+ * @name: name of new fence
+ * @a: sync_file a
+ * @b: sync_file b
+ *
+ * Creates a new sync_file which contains copies of all the fences in both
+ * @a and @b. @a and @b remain valid, independent sync_file. Returns the
+ * new merged sync_file or NULL in case of error.
+ */
struct sync_file *sync_file_merge(const char *name,
struct sync_file *a, struct sync_file *b)
{
diff --git a/drivers/staging/android/sync.h b/drivers/staging/android/sync.h
index c45cc7b..925fba5 100644
--- a/drivers/staging/android/sync.h
+++ b/drivers/staging/android/sync.h
@@ -167,40 +167,9 @@ void sync_timeline_signal(struct sync_timeline *obj);
*/
struct fence *sync_pt_create(struct sync_timeline *parent, int size);
-/**
- * sync_fence_create() - creates a sync fence
- * @name: name of fence to create
- * @fence: fence to add to the sync_fence
- *
- * Creates a sync_file containg @fence. Once this is called, the sync_file
- * takes ownership of @fence.
- */
struct sync_file *sync_file_create(const char *name, struct fence *fence);
-
-/*
- * API for sync_file consumers
- */
-
-/**
- * sync_file_merge() - merge two sync_files
- * @name: name of new fence
- * @a: sync_file a
- * @b: sync_file b
- *
- * Creates a new sync_file which contains copies of all the fences in both
- * @a and @b. @a and @b remain valid, independent sync_file. Returns the
- * new merged sync_file or NULL in case of error.
- */
struct sync_file *sync_file_merge(const char *name,
struct sync_file *a, struct sync_file *b);
-
-/**
- * sync_file_fdget() - get a sync_file from an fd
- * @fd: fd referencing a fence
- *
- * Ensures @fd references a valid sync_file, increments the refcount of the
- * backing file. Returns the sync_file or NULL in case of error.
- */
struct sync_file *sync_file_fdget(int fd);
#ifdef CONFIG_DEBUG_FS
--
2.5.5
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH v2 04/13] staging/android: make sync_file_merge() static
2016-04-28 13:46 [PATCH v2 00/13] De-stage Sync File Framework Gustavo Padovan
` (2 preceding siblings ...)
2016-04-28 13:46 ` [PATCH v2 03/13] staging/android: move sync_file functions comments to sync.c Gustavo Padovan
@ 2016-04-28 13:46 ` Gustavo Padovan
2016-04-28 13:46 ` [PATCH v2 05/13] staging/android: make sync_file_fdget() static Gustavo Padovan
` (9 subsequent siblings)
13 siblings, 0 replies; 16+ messages in thread
From: Gustavo Padovan @ 2016-04-28 13:46 UTC (permalink / raw)
To: Greg Kroah-Hartman
Cc: linux-kernel, devel, dri-devel, Daniel Stone,
Arve Hjønnevåg, Riley Andrews, Daniel Vetter,
Rob Clark, Greg Hackmann, John Harrison, Maarten Lankhorst,
Sumit Semwal, Gustavo Padovan
From: Gustavo Padovan <gustavo.padovan@collabora.co.uk>
There is no plan in the near future to use this function outside of this
file so keep it as static.
Signed-off-by: Gustavo Padovan <gustavo.padovan@collabora.co.uk>
Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
---
drivers/staging/android/sync.c | 5 ++---
drivers/staging/android/sync.h | 2 --
2 files changed, 2 insertions(+), 5 deletions(-)
diff --git a/drivers/staging/android/sync.c b/drivers/staging/android/sync.c
index a89ded0..e9bf251 100644
--- a/drivers/staging/android/sync.c
+++ b/drivers/staging/android/sync.c
@@ -253,8 +253,8 @@ static void sync_file_add_pt(struct sync_file *sync_file, int *i,
* @a and @b. @a and @b remain valid, independent sync_file. Returns the
* new merged sync_file or NULL in case of error.
*/
-struct sync_file *sync_file_merge(const char *name,
- struct sync_file *a, struct sync_file *b)
+static struct sync_file *sync_file_merge(const char *name, struct sync_file *a,
+ struct sync_file *b)
{
int num_fences = a->num_fences + b->num_fences;
struct sync_file *sync_file;
@@ -310,7 +310,6 @@ struct sync_file *sync_file_merge(const char *name,
sync_file_debug_add(sync_file);
return sync_file;
}
-EXPORT_SYMBOL(sync_file_merge);
static const char *android_fence_get_driver_name(struct fence *fence)
{
diff --git a/drivers/staging/android/sync.h b/drivers/staging/android/sync.h
index 925fba5..ffc6df6 100644
--- a/drivers/staging/android/sync.h
+++ b/drivers/staging/android/sync.h
@@ -168,8 +168,6 @@ void sync_timeline_signal(struct sync_timeline *obj);
struct fence *sync_pt_create(struct sync_timeline *parent, int size);
struct sync_file *sync_file_create(const char *name, struct fence *fence);
-struct sync_file *sync_file_merge(const char *name,
- struct sync_file *a, struct sync_file *b);
struct sync_file *sync_file_fdget(int fd);
#ifdef CONFIG_DEBUG_FS
--
2.5.5
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH v2 05/13] staging/android: make sync_file_fdget() static
2016-04-28 13:46 [PATCH v2 00/13] De-stage Sync File Framework Gustavo Padovan
` (3 preceding siblings ...)
2016-04-28 13:46 ` [PATCH v2 04/13] staging/android: make sync_file_merge() static Gustavo Padovan
@ 2016-04-28 13:46 ` Gustavo Padovan
2016-04-28 13:46 ` [PATCH v2 06/13] staging/android: remove name arg from sync_file_create() Gustavo Padovan
` (8 subsequent siblings)
13 siblings, 0 replies; 16+ messages in thread
From: Gustavo Padovan @ 2016-04-28 13:46 UTC (permalink / raw)
To: Greg Kroah-Hartman
Cc: linux-kernel, devel, dri-devel, Daniel Stone,
Arve Hjønnevåg, Riley Andrews, Daniel Vetter,
Rob Clark, Greg Hackmann, John Harrison, Maarten Lankhorst,
Sumit Semwal, Gustavo Padovan
From: Gustavo Padovan <gustavo.padovan@collabora.co.uk>
There is no plan in the near future to use this function outside of this
file so keep it as static.
Signed-off-by: Gustavo Padovan <gustavo.padovan@collabora.co.uk>
Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
---
drivers/staging/android/sync.c | 3 +--
drivers/staging/android/sync.h | 1 -
2 files changed, 1 insertion(+), 3 deletions(-)
diff --git a/drivers/staging/android/sync.c b/drivers/staging/android/sync.c
index e9bf251..7e0fa20 100644
--- a/drivers/staging/android/sync.c
+++ b/drivers/staging/android/sync.c
@@ -212,7 +212,7 @@ EXPORT_SYMBOL(sync_file_create);
* Ensures @fd references a valid sync_file, increments the refcount of the
* backing file. Returns the sync_file or NULL in case of error.
*/
-struct sync_file *sync_file_fdget(int fd)
+static struct sync_file *sync_file_fdget(int fd)
{
struct file *file = fget(fd);
@@ -228,7 +228,6 @@ err:
fput(file);
return NULL;
}
-EXPORT_SYMBOL(sync_file_fdget);
static void sync_file_add_pt(struct sync_file *sync_file, int *i,
struct fence *fence)
diff --git a/drivers/staging/android/sync.h b/drivers/staging/android/sync.h
index ffc6df6..1f164df 100644
--- a/drivers/staging/android/sync.h
+++ b/drivers/staging/android/sync.h
@@ -168,7 +168,6 @@ void sync_timeline_signal(struct sync_timeline *obj);
struct fence *sync_pt_create(struct sync_timeline *parent, int size);
struct sync_file *sync_file_create(const char *name, struct fence *fence);
-struct sync_file *sync_file_fdget(int fd);
#ifdef CONFIG_DEBUG_FS
--
2.5.5
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH v2 06/13] staging/android: remove name arg from sync_file_create()
2016-04-28 13:46 [PATCH v2 00/13] De-stage Sync File Framework Gustavo Padovan
` (4 preceding siblings ...)
2016-04-28 13:46 ` [PATCH v2 05/13] staging/android: make sync_file_fdget() static Gustavo Padovan
@ 2016-04-28 13:46 ` Gustavo Padovan
2016-04-28 13:46 ` [PATCH v2 07/13] staging/android: prepare sync_file for de-staging Gustavo Padovan
` (7 subsequent siblings)
13 siblings, 0 replies; 16+ messages in thread
From: Gustavo Padovan @ 2016-04-28 13:46 UTC (permalink / raw)
To: Greg Kroah-Hartman
Cc: linux-kernel, devel, dri-devel, Daniel Stone,
Arve Hjønnevåg, Riley Andrews, Daniel Vetter,
Rob Clark, Greg Hackmann, John Harrison, Maarten Lankhorst,
Sumit Semwal, Gustavo Padovan
From: Gustavo Padovan <gustavo.padovan@collabora.co.uk>
Simplifies the API to only receive the fence it needs to add to the
sync and create a name for the sync_file based on the fence context and
seqno.
Signed-off-by: Gustavo Padovan <gustavo.padovan@collabora.co.uk>
Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
---
drivers/staging/android/sync.c | 16 +++++++++-------
drivers/staging/android/sync.h | 2 +-
drivers/staging/android/sync_debug.c | 3 +--
3 files changed, 11 insertions(+), 10 deletions(-)
diff --git a/drivers/staging/android/sync.c b/drivers/staging/android/sync.c
index 7e0fa20..5470ae9 100644
--- a/drivers/staging/android/sync.c
+++ b/drivers/staging/android/sync.c
@@ -136,7 +136,7 @@ struct fence *sync_pt_create(struct sync_timeline *obj, int size)
}
EXPORT_SYMBOL(sync_pt_create);
-static struct sync_file *sync_file_alloc(int size, const char *name)
+static struct sync_file *sync_file_alloc(int size)
{
struct sync_file *sync_file;
@@ -150,7 +150,6 @@ static struct sync_file *sync_file_alloc(int size, const char *name)
goto err;
kref_init(&sync_file->kref);
- strlcpy(sync_file->name, name, sizeof(sync_file->name));
init_waitqueue_head(&sync_file->wq);
@@ -175,23 +174,25 @@ static void fence_check_cb_func(struct fence *f, struct fence_cb *cb)
/**
* sync_fence_create() - creates a sync fence
- * @name: name of fence to create
* @fence: fence to add to the sync_fence
*
* Creates a sync_file containg @fence. Once this is called, the sync_file
* takes ownership of @fence.
*/
-struct sync_file *sync_file_create(const char *name, struct fence *fence)
+struct sync_file *sync_file_create(struct fence *fence)
{
struct sync_file *sync_file;
- sync_file = sync_file_alloc(offsetof(struct sync_file, cbs[1]),
- name);
+ sync_file = sync_file_alloc(offsetof(struct sync_file, cbs[1]));
if (!sync_file)
return NULL;
sync_file->num_fences = 1;
atomic_set(&sync_file->status, 1);
+ snprintf(sync_file->name, sizeof(sync_file->name), "%s-%s%d-%d",
+ fence->ops->get_driver_name(fence),
+ fence->ops->get_timeline_name(fence), fence->context,
+ fence->seqno);
sync_file->cbs[0].fence = fence;
sync_file->cbs[0].sync_file = sync_file;
@@ -260,7 +261,7 @@ static struct sync_file *sync_file_merge(const char *name, struct sync_file *a,
int i, i_a, i_b;
unsigned long size = offsetof(struct sync_file, cbs[num_fences]);
- sync_file = sync_file_alloc(size, name);
+ sync_file = sync_file_alloc(size);
if (!sync_file)
return NULL;
@@ -306,6 +307,7 @@ static struct sync_file *sync_file_merge(const char *name, struct sync_file *a,
atomic_sub(num_fences - i, &sync_file->status);
sync_file->num_fences = i;
+ strlcpy(sync_file->name, name, sizeof(sync_file->name));
sync_file_debug_add(sync_file);
return sync_file;
}
diff --git a/drivers/staging/android/sync.h b/drivers/staging/android/sync.h
index 1f164df..7dee444 100644
--- a/drivers/staging/android/sync.h
+++ b/drivers/staging/android/sync.h
@@ -167,7 +167,7 @@ void sync_timeline_signal(struct sync_timeline *obj);
*/
struct fence *sync_pt_create(struct sync_timeline *parent, int size);
-struct sync_file *sync_file_create(const char *name, struct fence *fence);
+struct sync_file *sync_file_create(struct fence *fence);
#ifdef CONFIG_DEBUG_FS
diff --git a/drivers/staging/android/sync_debug.c b/drivers/staging/android/sync_debug.c
index e4b0e41..2cab40d 100644
--- a/drivers/staging/android/sync_debug.c
+++ b/drivers/staging/android/sync_debug.c
@@ -262,8 +262,7 @@ static long sw_sync_ioctl_create_fence(struct sw_sync_timeline *obj,
goto err;
}
- data.name[sizeof(data.name) - 1] = '\0';
- sync_file = sync_file_create(data.name, fence);
+ sync_file = sync_file_create(fence);
if (!sync_file) {
fence_put(fence);
err = -ENOMEM;
--
2.5.5
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH v2 07/13] staging/android: prepare sync_file for de-staging
2016-04-28 13:46 [PATCH v2 00/13] De-stage Sync File Framework Gustavo Padovan
` (5 preceding siblings ...)
2016-04-28 13:46 ` [PATCH v2 06/13] staging/android: remove name arg from sync_file_create() Gustavo Padovan
@ 2016-04-28 13:46 ` Gustavo Padovan
2016-04-28 13:46 ` [PATCH v2 08/13] staging/android: improve documentation for sync_file Gustavo Padovan
` (6 subsequent siblings)
13 siblings, 0 replies; 16+ messages in thread
From: Gustavo Padovan @ 2016-04-28 13:46 UTC (permalink / raw)
To: Greg Kroah-Hartman
Cc: linux-kernel, devel, dri-devel, Daniel Stone,
Arve Hjønnevåg, Riley Andrews, Daniel Vetter,
Rob Clark, Greg Hackmann, John Harrison, Maarten Lankhorst,
Sumit Semwal, Gustavo Padovan
From: Gustavo Padovan <gustavo.padovan@collabora.co.uk>
Move its functions and structs to their own file. Also moves function's
docs to the .c file.
Signed-off-by: Gustavo Padovan <gustavo.padovan@collabora.co.uk>
Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
---
drivers/staging/android/Makefile | 2 +-
drivers/staging/android/sync.c | 374 -------------------
drivers/staging/android/sync.h | 38 +-
drivers/staging/android/sync_debug.c | 1 +
drivers/staging/android/sync_file.c | 394 +++++++++++++++++++++
drivers/staging/android/sync_file.h | 57 +++
.../staging/android/uapi/{sync.h => sync_file.h} | 0
7 files changed, 455 insertions(+), 411 deletions(-)
create mode 100644 drivers/staging/android/sync_file.c
create mode 100644 drivers/staging/android/sync_file.h
rename drivers/staging/android/uapi/{sync.h => sync_file.h} (100%)
diff --git a/drivers/staging/android/Makefile b/drivers/staging/android/Makefile
index 980d6dc..ebc2df1 100644
--- a/drivers/staging/android/Makefile
+++ b/drivers/staging/android/Makefile
@@ -4,5 +4,5 @@ obj-y += ion/
obj-$(CONFIG_ASHMEM) += ashmem.o
obj-$(CONFIG_ANDROID_LOW_MEMORY_KILLER) += lowmemorykiller.o
-obj-$(CONFIG_SYNC) += sync.o sync_debug.o
+obj-$(CONFIG_SYNC) += sync_file.o sync.o sync_debug.o
obj-$(CONFIG_SW_SYNC) += sw_sync.o
diff --git a/drivers/staging/android/sync.c b/drivers/staging/android/sync.c
index 5470ae9..1d14c83 100644
--- a/drivers/staging/android/sync.c
+++ b/drivers/staging/android/sync.c
@@ -16,10 +16,7 @@
#include <linux/debugfs.h>
#include <linux/export.h>
-#include <linux/file.h>
-#include <linux/fs.h>
#include <linux/kernel.h>
-#include <linux/poll.h>
#include <linux/sched.h>
#include <linux/seq_file.h>
#include <linux/slab.h>
@@ -32,7 +29,6 @@
#include "trace/sync.h"
static const struct fence_ops android_fence_ops;
-static const struct file_operations sync_file_fops;
struct sync_timeline *sync_timeline_create(const struct sync_timeline_ops *ops,
int size, const char *name)
@@ -136,182 +132,6 @@ struct fence *sync_pt_create(struct sync_timeline *obj, int size)
}
EXPORT_SYMBOL(sync_pt_create);
-static struct sync_file *sync_file_alloc(int size)
-{
- struct sync_file *sync_file;
-
- sync_file = kzalloc(size, GFP_KERNEL);
- if (!sync_file)
- return NULL;
-
- sync_file->file = anon_inode_getfile("sync_file", &sync_file_fops,
- sync_file, 0);
- if (IS_ERR(sync_file->file))
- goto err;
-
- kref_init(&sync_file->kref);
-
- init_waitqueue_head(&sync_file->wq);
-
- return sync_file;
-
-err:
- kfree(sync_file);
- return NULL;
-}
-
-static void fence_check_cb_func(struct fence *f, struct fence_cb *cb)
-{
- struct sync_file_cb *check;
- struct sync_file *sync_file;
-
- check = container_of(cb, struct sync_file_cb, cb);
- sync_file = check->sync_file;
-
- if (atomic_dec_and_test(&sync_file->status))
- wake_up_all(&sync_file->wq);
-}
-
-/**
- * sync_fence_create() - creates a sync fence
- * @fence: fence to add to the sync_fence
- *
- * Creates a sync_file containg @fence. Once this is called, the sync_file
- * takes ownership of @fence.
- */
-struct sync_file *sync_file_create(struct fence *fence)
-{
- struct sync_file *sync_file;
-
- sync_file = sync_file_alloc(offsetof(struct sync_file, cbs[1]));
- if (!sync_file)
- return NULL;
-
- sync_file->num_fences = 1;
- atomic_set(&sync_file->status, 1);
- snprintf(sync_file->name, sizeof(sync_file->name), "%s-%s%d-%d",
- fence->ops->get_driver_name(fence),
- fence->ops->get_timeline_name(fence), fence->context,
- fence->seqno);
-
- sync_file->cbs[0].fence = fence;
- sync_file->cbs[0].sync_file = sync_file;
- if (fence_add_callback(fence, &sync_file->cbs[0].cb,
- fence_check_cb_func))
- atomic_dec(&sync_file->status);
-
- sync_file_debug_add(sync_file);
-
- return sync_file;
-}
-EXPORT_SYMBOL(sync_file_create);
-
-/**
- * sync_file_fdget() - get a sync_file from an fd
- * @fd: fd referencing a fence
- *
- * Ensures @fd references a valid sync_file, increments the refcount of the
- * backing file. Returns the sync_file or NULL in case of error.
- */
-static struct sync_file *sync_file_fdget(int fd)
-{
- struct file *file = fget(fd);
-
- if (!file)
- return NULL;
-
- if (file->f_op != &sync_file_fops)
- goto err;
-
- return file->private_data;
-
-err:
- fput(file);
- return NULL;
-}
-
-static void sync_file_add_pt(struct sync_file *sync_file, int *i,
- struct fence *fence)
-{
- sync_file->cbs[*i].fence = fence;
- sync_file->cbs[*i].sync_file = sync_file;
-
- if (!fence_add_callback(fence, &sync_file->cbs[*i].cb,
- fence_check_cb_func)) {
- fence_get(fence);
- (*i)++;
- }
-}
-
-/**
- * sync_file_merge() - merge two sync_files
- * @name: name of new fence
- * @a: sync_file a
- * @b: sync_file b
- *
- * Creates a new sync_file which contains copies of all the fences in both
- * @a and @b. @a and @b remain valid, independent sync_file. Returns the
- * new merged sync_file or NULL in case of error.
- */
-static struct sync_file *sync_file_merge(const char *name, struct sync_file *a,
- struct sync_file *b)
-{
- int num_fences = a->num_fences + b->num_fences;
- struct sync_file *sync_file;
- int i, i_a, i_b;
- unsigned long size = offsetof(struct sync_file, cbs[num_fences]);
-
- sync_file = sync_file_alloc(size);
- if (!sync_file)
- return NULL;
-
- atomic_set(&sync_file->status, num_fences);
-
- /*
- * Assume sync_file a and b are both ordered and have no
- * duplicates with the same context.
- *
- * If a sync_file can only be created with sync_file_merge
- * and sync_file_create, this is a reasonable assumption.
- */
- for (i = i_a = i_b = 0; i_a < a->num_fences && i_b < b->num_fences; ) {
- struct fence *pt_a = a->cbs[i_a].fence;
- struct fence *pt_b = b->cbs[i_b].fence;
-
- if (pt_a->context < pt_b->context) {
- sync_file_add_pt(sync_file, &i, pt_a);
-
- i_a++;
- } else if (pt_a->context > pt_b->context) {
- sync_file_add_pt(sync_file, &i, pt_b);
-
- i_b++;
- } else {
- if (pt_a->seqno - pt_b->seqno <= INT_MAX)
- sync_file_add_pt(sync_file, &i, pt_a);
- else
- sync_file_add_pt(sync_file, &i, pt_b);
-
- i_a++;
- i_b++;
- }
- }
-
- for (; i_a < a->num_fences; i_a++)
- sync_file_add_pt(sync_file, &i, a->cbs[i_a].fence);
-
- for (; i_b < b->num_fences; i_b++)
- sync_file_add_pt(sync_file, &i, b->cbs[i_b].fence);
-
- if (num_fences > i)
- atomic_sub(num_fences - i, &sync_file->status);
- sync_file->num_fences = i;
-
- strlcpy(sync_file->name, name, sizeof(sync_file->name));
- sync_file_debug_add(sync_file);
- return sync_file;
-}
-
static const char *android_fence_get_driver_name(struct fence *fence)
{
struct sync_timeline *parent = fence_parent(fence);
@@ -399,197 +219,3 @@ static const struct fence_ops android_fence_ops = {
.fence_value_str = android_fence_value_str,
.timeline_value_str = android_fence_timeline_value_str,
};
-
-static void sync_file_free(struct kref *kref)
-{
- struct sync_file *sync_file = container_of(kref, struct sync_file,
- kref);
- int i;
-
- for (i = 0; i < sync_file->num_fences; ++i) {
- fence_remove_callback(sync_file->cbs[i].fence,
- &sync_file->cbs[i].cb);
- fence_put(sync_file->cbs[i].fence);
- }
-
- kfree(sync_file);
-}
-
-static int sync_file_release(struct inode *inode, struct file *file)
-{
- struct sync_file *sync_file = file->private_data;
-
- sync_file_debug_remove(sync_file);
-
- kref_put(&sync_file->kref, sync_file_free);
- return 0;
-}
-
-static unsigned int sync_file_poll(struct file *file, poll_table *wait)
-{
- struct sync_file *sync_file = file->private_data;
- int status;
-
- poll_wait(file, &sync_file->wq, wait);
-
- status = atomic_read(&sync_file->status);
-
- if (!status)
- return POLLIN;
- if (status < 0)
- return POLLERR;
- return 0;
-}
-
-static long sync_file_ioctl_merge(struct sync_file *sync_file,
- unsigned long arg)
-{
- int fd = get_unused_fd_flags(O_CLOEXEC);
- int err;
- struct sync_file *fence2, *fence3;
- struct sync_merge_data data;
-
- if (fd < 0)
- return fd;
-
- if (copy_from_user(&data, (void __user *)arg, sizeof(data))) {
- err = -EFAULT;
- goto err_put_fd;
- }
-
- if (data.flags || data.pad) {
- err = -EINVAL;
- goto err_put_fd;
- }
-
- fence2 = sync_file_fdget(data.fd2);
- if (!fence2) {
- err = -ENOENT;
- goto err_put_fd;
- }
-
- data.name[sizeof(data.name) - 1] = '\0';
- fence3 = sync_file_merge(data.name, sync_file, fence2);
- if (!fence3) {
- err = -ENOMEM;
- goto err_put_fence2;
- }
-
- data.fence = fd;
- if (copy_to_user((void __user *)arg, &data, sizeof(data))) {
- err = -EFAULT;
- goto err_put_fence3;
- }
-
- fd_install(fd, fence3->file);
- fput(fence2->file);
- return 0;
-
-err_put_fence3:
- fput(fence3->file);
-
-err_put_fence2:
- fput(fence2->file);
-
-err_put_fd:
- put_unused_fd(fd);
- return err;
-}
-
-static void sync_fill_fence_info(struct fence *fence,
- struct sync_fence_info *info)
-{
- strlcpy(info->obj_name, fence->ops->get_timeline_name(fence),
- sizeof(info->obj_name));
- strlcpy(info->driver_name, fence->ops->get_driver_name(fence),
- sizeof(info->driver_name));
- if (fence_is_signaled(fence))
- info->status = fence->status >= 0 ? 1 : fence->status;
- else
- info->status = 0;
- info->timestamp_ns = ktime_to_ns(fence->timestamp);
-}
-
-static long sync_file_ioctl_fence_info(struct sync_file *sync_file,
- unsigned long arg)
-{
- struct sync_file_info info;
- struct sync_fence_info *fence_info = NULL;
- __u32 size;
- int ret, i;
-
- if (copy_from_user(&info, (void __user *)arg, sizeof(info)))
- return -EFAULT;
-
- if (info.flags || info.pad)
- return -EINVAL;
-
- /*
- * Passing num_fences = 0 means that userspace doesn't want to
- * retrieve any sync_fence_info. If num_fences = 0 we skip filling
- * sync_fence_info and return the actual number of fences on
- * info->num_fences.
- */
- if (!info.num_fences)
- goto no_fences;
-
- if (info.num_fences < sync_file->num_fences)
- return -EINVAL;
-
- size = sync_file->num_fences * sizeof(*fence_info);
- fence_info = kzalloc(size, GFP_KERNEL);
- if (!fence_info)
- return -ENOMEM;
-
- for (i = 0; i < sync_file->num_fences; ++i)
- sync_fill_fence_info(sync_file->cbs[i].fence, &fence_info[i]);
-
- if (copy_to_user(u64_to_user_ptr(info.sync_fence_info), fence_info,
- size)) {
- ret = -EFAULT;
- goto out;
- }
-
-no_fences:
- strlcpy(info.name, sync_file->name, sizeof(info.name));
- info.status = atomic_read(&sync_file->status);
- if (info.status >= 0)
- info.status = !info.status;
-
- info.num_fences = sync_file->num_fences;
-
- if (copy_to_user((void __user *)arg, &info, sizeof(info)))
- ret = -EFAULT;
- else
- ret = 0;
-
-out:
- kfree(fence_info);
-
- return ret;
-}
-
-static long sync_file_ioctl(struct file *file, unsigned int cmd,
- unsigned long arg)
-{
- struct sync_file *sync_file = file->private_data;
-
- switch (cmd) {
- case SYNC_IOC_MERGE:
- return sync_file_ioctl_merge(sync_file, arg);
-
- case SYNC_IOC_FILE_INFO:
- return sync_file_ioctl_fence_info(sync_file, arg);
-
- default:
- return -ENOTTY;
- }
-}
-
-static const struct file_operations sync_file_fops = {
- .release = sync_file_release,
- .poll = sync_file_poll,
- .unlocked_ioctl = sync_file_ioctl,
- .compat_ioctl = sync_file_ioctl,
-};
-
diff --git a/drivers/staging/android/sync.h b/drivers/staging/android/sync.h
index 7dee444..df44abb 100644
--- a/drivers/staging/android/sync.h
+++ b/drivers/staging/android/sync.h
@@ -20,10 +20,10 @@
#include <linux/spinlock.h>
#include <linux/fence.h>
-#include "uapi/sync.h"
+#include "sync_file.h"
+#include "uapi/sync_file.h"
struct sync_timeline;
-struct sync_file;
/**
* struct sync_timeline_ops - sync object implementation ops
@@ -86,38 +86,6 @@ static inline struct sync_timeline *fence_parent(struct fence *fence)
child_list_lock);
}
-struct sync_file_cb {
- struct fence_cb cb;
- struct fence *fence;
- struct sync_file *sync_file;
-};
-
-/**
- * struct sync_file - sync file to export to the userspace
- * @file: file representing this fence
- * @kref: reference count on fence.
- * @name: name of sync_file. Useful for debugging
- * @sync_file_list: membership in global file list
- * @num_fences number of sync_pts in the fence
- * @wq: wait queue for fence signaling
- * @status: 0: signaled, >0:active, <0: error
- * @cbs: sync_pts callback information
- */
-struct sync_file {
- struct file *file;
- struct kref kref;
- char name[32];
-#ifdef CONFIG_DEBUG_FS
- struct list_head sync_file_list;
-#endif
- int num_fences;
-
- wait_queue_head_t wq;
- atomic_t status;
-
- struct sync_file_cb cbs[];
-};
-
/*
* API for sync_timeline implementers
*/
@@ -167,8 +135,6 @@ void sync_timeline_signal(struct sync_timeline *obj);
*/
struct fence *sync_pt_create(struct sync_timeline *parent, int size);
-struct sync_file *sync_file_create(struct fence *fence);
-
#ifdef CONFIG_DEBUG_FS
void sync_timeline_debug_add(struct sync_timeline *obj);
diff --git a/drivers/staging/android/sync_debug.c b/drivers/staging/android/sync_debug.c
index 2cab40d..8b55218 100644
--- a/drivers/staging/android/sync_debug.c
+++ b/drivers/staging/android/sync_debug.c
@@ -26,6 +26,7 @@
#include <linux/uaccess.h>
#include <linux/anon_inodes.h>
#include <linux/time64.h>
+#include "sync_file.h"
#include "sw_sync.h"
#ifdef CONFIG_DEBUG_FS
diff --git a/drivers/staging/android/sync_file.c b/drivers/staging/android/sync_file.c
new file mode 100644
index 0000000..2c724ec
--- /dev/null
+++ b/drivers/staging/android/sync_file.c
@@ -0,0 +1,394 @@
+/*
+ * drivers/dma-buf/sync_file.c
+ *
+ * Copyright (C) 2012 Google, Inc.
+ *
+ * This software is licensed under the terms of the GNU General Public
+ * License version 2, as published by the Free Software Foundation, and
+ * may be copied, distributed, and modified under those terms.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ */
+
+#include <linux/export.h>
+#include <linux/file.h>
+#include <linux/fs.h>
+#include <linux/kernel.h>
+#include <linux/poll.h>
+#include <linux/sched.h>
+#include <linux/slab.h>
+#include <linux/uaccess.h>
+#include <linux/anon_inodes.h>
+#include "sync_file.h"
+#include "uapi/sync_file.h"
+
+static const struct file_operations sync_file_fops;
+
+static struct sync_file *sync_file_alloc(int size)
+{
+ struct sync_file *sync_file;
+
+ sync_file = kzalloc(size, GFP_KERNEL);
+ if (!sync_file)
+ return NULL;
+
+ sync_file->file = anon_inode_getfile("sync_file", &sync_file_fops,
+ sync_file, 0);
+ if (IS_ERR(sync_file->file))
+ goto err;
+
+ kref_init(&sync_file->kref);
+
+ init_waitqueue_head(&sync_file->wq);
+
+ return sync_file;
+
+err:
+ kfree(sync_file);
+ return NULL;
+}
+
+static void fence_check_cb_func(struct fence *f, struct fence_cb *cb)
+{
+ struct sync_file_cb *check;
+ struct sync_file *sync_file;
+
+ check = container_of(cb, struct sync_file_cb, cb);
+ sync_file = check->sync_file;
+
+ if (atomic_dec_and_test(&sync_file->status))
+ wake_up_all(&sync_file->wq);
+}
+
+/**
+ * sync_fence_create() - creates a sync fence
+ * @fence: fence to add to the sync_fence
+ *
+ * Creates a sync_file containg @fence. Once this is called, the sync_file
+ * takes ownership of @fence.
+ */
+struct sync_file *sync_file_create(struct fence *fence)
+{
+ struct sync_file *sync_file;
+
+ sync_file = sync_file_alloc(offsetof(struct sync_file, cbs[1]));
+ if (!sync_file)
+ return NULL;
+
+ sync_file->num_fences = 1;
+ atomic_set(&sync_file->status, 1);
+ snprintf(sync_file->name, sizeof(sync_file->name), "%s-%s%d-%d",
+ fence->ops->get_driver_name(fence),
+ fence->ops->get_timeline_name(fence), fence->context,
+ fence->seqno);
+
+ sync_file->cbs[0].fence = fence;
+ sync_file->cbs[0].sync_file = sync_file;
+ if (fence_add_callback(fence, &sync_file->cbs[0].cb,
+ fence_check_cb_func))
+ atomic_dec(&sync_file->status);
+
+ return sync_file;
+}
+EXPORT_SYMBOL(sync_file_create);
+
+/**
+ * sync_file_fdget() - get a sync_file from an fd
+ * @fd: fd referencing a fence
+ *
+ * Ensures @fd references a valid sync_file, increments the refcount of the
+ * backing file. Returns the sync_file or NULL in case of error.
+ */
+static struct sync_file *sync_file_fdget(int fd)
+{
+ struct file *file = fget(fd);
+
+ if (!file)
+ return NULL;
+
+ if (file->f_op != &sync_file_fops)
+ goto err;
+
+ return file->private_data;
+
+err:
+ fput(file);
+ return NULL;
+}
+
+static void sync_file_add_pt(struct sync_file *sync_file, int *i,
+ struct fence *fence)
+{
+ sync_file->cbs[*i].fence = fence;
+ sync_file->cbs[*i].sync_file = sync_file;
+
+ if (!fence_add_callback(fence, &sync_file->cbs[*i].cb,
+ fence_check_cb_func)) {
+ fence_get(fence);
+ (*i)++;
+ }
+}
+
+/**
+ * sync_file_merge() - merge two sync_files
+ * @name: name of new fence
+ * @a: sync_file a
+ * @b: sync_file b
+ *
+ * Creates a new sync_file which contains copies of all the fences in both
+ * @a and @b. @a and @b remain valid, independent sync_file. Returns the
+ * new merged sync_file or NULL in case of error.
+ */
+static struct sync_file *sync_file_merge(const char *name, struct sync_file *a,
+ struct sync_file *b)
+{
+ int num_fences = a->num_fences + b->num_fences;
+ struct sync_file *sync_file;
+ int i, i_a, i_b;
+ unsigned long size = offsetof(struct sync_file, cbs[num_fences]);
+
+ sync_file = sync_file_alloc(size);
+ if (!sync_file)
+ return NULL;
+
+ atomic_set(&sync_file->status, num_fences);
+
+ /*
+ * Assume sync_file a and b are both ordered and have no
+ * duplicates with the same context.
+ *
+ * If a sync_file can only be created with sync_file_merge
+ * and sync_file_create, this is a reasonable assumption.
+ */
+ for (i = i_a = i_b = 0; i_a < a->num_fences && i_b < b->num_fences; ) {
+ struct fence *pt_a = a->cbs[i_a].fence;
+ struct fence *pt_b = b->cbs[i_b].fence;
+
+ if (pt_a->context < pt_b->context) {
+ sync_file_add_pt(sync_file, &i, pt_a);
+
+ i_a++;
+ } else if (pt_a->context > pt_b->context) {
+ sync_file_add_pt(sync_file, &i, pt_b);
+
+ i_b++;
+ } else {
+ if (pt_a->seqno - pt_b->seqno <= INT_MAX)
+ sync_file_add_pt(sync_file, &i, pt_a);
+ else
+ sync_file_add_pt(sync_file, &i, pt_b);
+
+ i_a++;
+ i_b++;
+ }
+ }
+
+ for (; i_a < a->num_fences; i_a++)
+ sync_file_add_pt(sync_file, &i, a->cbs[i_a].fence);
+
+ for (; i_b < b->num_fences; i_b++)
+ sync_file_add_pt(sync_file, &i, b->cbs[i_b].fence);
+
+ if (num_fences > i)
+ atomic_sub(num_fences - i, &sync_file->status);
+ sync_file->num_fences = i;
+
+ strlcpy(sync_file->name, name, sizeof(sync_file->name));
+ return sync_file;
+}
+
+static void sync_file_free(struct kref *kref)
+{
+ struct sync_file *sync_file = container_of(kref, struct sync_file,
+ kref);
+ int i;
+
+ for (i = 0; i < sync_file->num_fences; ++i) {
+ fence_remove_callback(sync_file->cbs[i].fence,
+ &sync_file->cbs[i].cb);
+ fence_put(sync_file->cbs[i].fence);
+ }
+
+ kfree(sync_file);
+}
+
+static int sync_file_release(struct inode *inode, struct file *file)
+{
+ struct sync_file *sync_file = file->private_data;
+
+ kref_put(&sync_file->kref, sync_file_free);
+ return 0;
+}
+
+static unsigned int sync_file_poll(struct file *file, poll_table *wait)
+{
+ struct sync_file *sync_file = file->private_data;
+ int status;
+
+ poll_wait(file, &sync_file->wq, wait);
+
+ status = atomic_read(&sync_file->status);
+
+ if (!status)
+ return POLLIN;
+ if (status < 0)
+ return POLLERR;
+ return 0;
+}
+
+static long sync_file_ioctl_merge(struct sync_file *sync_file,
+ unsigned long arg)
+{
+ int fd = get_unused_fd_flags(O_CLOEXEC);
+ int err;
+ struct sync_file *fence2, *fence3;
+ struct sync_merge_data data;
+
+ if (fd < 0)
+ return fd;
+
+ if (copy_from_user(&data, (void __user *)arg, sizeof(data))) {
+ err = -EFAULT;
+ goto err_put_fd;
+ }
+
+ if (data.flags || data.pad) {
+ err = -EINVAL;
+ goto err_put_fd;
+ }
+
+ fence2 = sync_file_fdget(data.fd2);
+ if (!fence2) {
+ err = -ENOENT;
+ goto err_put_fd;
+ }
+
+ data.name[sizeof(data.name) - 1] = '\0';
+ fence3 = sync_file_merge(data.name, sync_file, fence2);
+ if (!fence3) {
+ err = -ENOMEM;
+ goto err_put_fence2;
+ }
+
+ data.fence = fd;
+ if (copy_to_user((void __user *)arg, &data, sizeof(data))) {
+ err = -EFAULT;
+ goto err_put_fence3;
+ }
+
+ fd_install(fd, fence3->file);
+ fput(fence2->file);
+ return 0;
+
+err_put_fence3:
+ fput(fence3->file);
+
+err_put_fence2:
+ fput(fence2->file);
+
+err_put_fd:
+ put_unused_fd(fd);
+ return err;
+}
+
+static void sync_fill_fence_info(struct fence *fence,
+ struct sync_fence_info *info)
+{
+ strlcpy(info->obj_name, fence->ops->get_timeline_name(fence),
+ sizeof(info->obj_name));
+ strlcpy(info->driver_name, fence->ops->get_driver_name(fence),
+ sizeof(info->driver_name));
+ if (fence_is_signaled(fence))
+ info->status = fence->status >= 0 ? 1 : fence->status;
+ else
+ info->status = 0;
+ info->timestamp_ns = ktime_to_ns(fence->timestamp);
+}
+
+static long sync_file_ioctl_fence_info(struct sync_file *sync_file,
+ unsigned long arg)
+{
+ struct sync_file_info info;
+ struct sync_fence_info *fence_info = NULL;
+ __u32 size;
+ int ret, i;
+
+ if (copy_from_user(&info, (void __user *)arg, sizeof(info)))
+ return -EFAULT;
+
+ if (info.flags || info.pad)
+ return -EINVAL;
+
+ /*
+ * Passing num_fences = 0 means that userspace doesn't want to
+ * retrieve any sync_fence_info. If num_fences = 0 we skip filling
+ * sync_fence_info and return the actual number of fences on
+ * info->num_fences.
+ */
+ if (!info.num_fences)
+ goto no_fences;
+
+ if (info.num_fences < sync_file->num_fences)
+ return -EINVAL;
+
+ size = sync_file->num_fences * sizeof(*fence_info);
+ fence_info = kzalloc(size, GFP_KERNEL);
+ if (!fence_info)
+ return -ENOMEM;
+
+ for (i = 0; i < sync_file->num_fences; ++i)
+ sync_fill_fence_info(sync_file->cbs[i].fence, &fence_info[i]);
+
+ if (copy_to_user(u64_to_user_ptr(info.sync_fence_info), fence_info,
+ size)) {
+ ret = -EFAULT;
+ goto out;
+ }
+
+no_fences:
+ strlcpy(info.name, sync_file->name, sizeof(info.name));
+ info.status = atomic_read(&sync_file->status);
+ if (info.status >= 0)
+ info.status = !info.status;
+
+ info.num_fences = sync_file->num_fences;
+
+ if (copy_to_user((void __user *)arg, &info, sizeof(info)))
+ ret = -EFAULT;
+ else
+ ret = 0;
+
+out:
+ kfree(fence_info);
+
+ return ret;
+}
+
+static long sync_file_ioctl(struct file *file, unsigned int cmd,
+ unsigned long arg)
+{
+ struct sync_file *sync_file = file->private_data;
+
+ switch (cmd) {
+ case SYNC_IOC_MERGE:
+ return sync_file_ioctl_merge(sync_file, arg);
+
+ case SYNC_IOC_FILE_INFO:
+ return sync_file_ioctl_fence_info(sync_file, arg);
+
+ default:
+ return -ENOTTY;
+ }
+}
+
+static const struct file_operations sync_file_fops = {
+ .release = sync_file_release,
+ .poll = sync_file_poll,
+ .unlocked_ioctl = sync_file_ioctl,
+ .compat_ioctl = sync_file_ioctl,
+};
+
diff --git a/drivers/staging/android/sync_file.h b/drivers/staging/android/sync_file.h
new file mode 100644
index 0000000..8a1b546
--- /dev/null
+++ b/drivers/staging/android/sync_file.h
@@ -0,0 +1,57 @@
+/*
+ * include/linux/sync_file.h
+ *
+ * Copyright (C) 2012 Google, Inc.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ */
+
+#ifndef _LINUX_SYNC_FILE_H
+#define _LINUX_SYNC_FILE_H
+
+#include <linux/types.h>
+#include <linux/kref.h>
+#include <linux/ktime.h>
+#include <linux/list.h>
+#include <linux/spinlock.h>
+#include <linux/fence.h>
+
+struct sync_file_cb {
+ struct fence_cb cb;
+ struct fence *fence;
+ struct sync_file *sync_file;
+};
+
+/**
+ * struct sync_file - sync file to export to the userspace
+ * @file: file representing this fence
+ * @kref: reference count on fence.
+ * @name: name of sync_file. Useful for debugging
+ * @sync_file_list: membership in global file list
+ * @num_fences number of sync_pts in the fence
+ * @wq: wait queue for fence signaling
+ * @status: 0: signaled, >0:active, <0: error
+ * @cbs: sync_pts callback information
+ */
+struct sync_file {
+ struct file *file;
+ struct kref kref;
+ char name[32];
+#ifdef CONFIG_DEBUG_FS
+ struct list_head sync_file_list;
+#endif
+ int num_fences;
+
+ wait_queue_head_t wq;
+ atomic_t status;
+
+ struct sync_file_cb cbs[];
+};
+
+struct sync_file *sync_file_create(struct fence *fence);
+
+#endif /* _LINUX_SYNC_H */
diff --git a/drivers/staging/android/uapi/sync.h b/drivers/staging/android/uapi/sync_file.h
similarity index 100%
rename from drivers/staging/android/uapi/sync.h
rename to drivers/staging/android/uapi/sync_file.h
--
2.5.5
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH v2 08/13] staging/android: improve documentation for sync_file
2016-04-28 13:46 [PATCH v2 00/13] De-stage Sync File Framework Gustavo Padovan
` (6 preceding siblings ...)
2016-04-28 13:46 ` [PATCH v2 07/13] staging/android: prepare sync_file for de-staging Gustavo Padovan
@ 2016-04-28 13:46 ` Gustavo Padovan
2016-04-28 13:46 ` [PATCH v2 09/13] staging/android: style fix: alignment to match the open parenthesis Gustavo Padovan
` (5 subsequent siblings)
13 siblings, 0 replies; 16+ messages in thread
From: Gustavo Padovan @ 2016-04-28 13:46 UTC (permalink / raw)
To: Greg Kroah-Hartman
Cc: linux-kernel, devel, dri-devel, Daniel Stone,
Arve Hjønnevåg, Riley Andrews, Daniel Vetter,
Rob Clark, Greg Hackmann, John Harrison, Maarten Lankhorst,
Sumit Semwal, Gustavo Padovan
From: Gustavo Padovan <gustavo.padovan@collabora.co.uk>
num_fences was missing a colon mark and sync_file_create() now have
better description.
Signed-off-by: Gustavo Padovan <gustavo.padovan@collabora.co.uk>
Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
---
drivers/staging/android/sync_file.c | 5 +++--
drivers/staging/android/sync_file.h | 2 +-
2 files changed, 4 insertions(+), 3 deletions(-)
diff --git a/drivers/staging/android/sync_file.c b/drivers/staging/android/sync_file.c
index 2c724ec..d9da3a4 100644
--- a/drivers/staging/android/sync_file.c
+++ b/drivers/staging/android/sync_file.c
@@ -65,11 +65,12 @@ static void fence_check_cb_func(struct fence *f, struct fence_cb *cb)
}
/**
- * sync_fence_create() - creates a sync fence
+ * sync_file_create() - creates a sync file
* @fence: fence to add to the sync_fence
*
* Creates a sync_file containg @fence. Once this is called, the sync_file
- * takes ownership of @fence.
+ * takes ownership of @fence. The sync_file can be released with
+ * fput(sync_file->file). Returns the sync_file or NULL in case of error.
*/
struct sync_file *sync_file_create(struct fence *fence)
{
diff --git a/drivers/staging/android/sync_file.h b/drivers/staging/android/sync_file.h
index 8a1b546..c6ffe8b 100644
--- a/drivers/staging/android/sync_file.h
+++ b/drivers/staging/android/sync_file.h
@@ -32,7 +32,7 @@ struct sync_file_cb {
* @kref: reference count on fence.
* @name: name of sync_file. Useful for debugging
* @sync_file_list: membership in global file list
- * @num_fences number of sync_pts in the fence
+ * @num_fences: number of sync_pts in the fence
* @wq: wait queue for fence signaling
* @status: 0: signaled, >0:active, <0: error
* @cbs: sync_pts callback information
--
2.5.5
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH v2 09/13] staging/android: style fix: alignment to match the open parenthesis
2016-04-28 13:46 [PATCH v2 00/13] De-stage Sync File Framework Gustavo Padovan
` (7 preceding siblings ...)
2016-04-28 13:46 ` [PATCH v2 08/13] staging/android: improve documentation for sync_file Gustavo Padovan
@ 2016-04-28 13:46 ` Gustavo Padovan
2016-04-28 13:46 ` [PATCH v2 10/13] dma-buf/sync_file: de-stage sync_file headers Gustavo Padovan
` (4 subsequent siblings)
13 siblings, 0 replies; 16+ messages in thread
From: Gustavo Padovan @ 2016-04-28 13:46 UTC (permalink / raw)
To: Greg Kroah-Hartman
Cc: linux-kernel, devel, dri-devel, Daniel Stone,
Arve Hjønnevåg, Riley Andrews, Daniel Vetter,
Rob Clark, Greg Hackmann, John Harrison, Maarten Lankhorst,
Sumit Semwal, Gustavo Padovan
From: Gustavo Padovan <gustavo.padovan@collabora.co.uk>
Fix checks reported by checkpatch.pl.
Signed-off-by: Gustavo Padovan <gustavo.padovan@collabora.co.uk>
Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
---
drivers/staging/android/sync_file.c | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/drivers/staging/android/sync_file.c b/drivers/staging/android/sync_file.c
index d9da3a4..eabf90d 100644
--- a/drivers/staging/android/sync_file.c
+++ b/drivers/staging/android/sync_file.c
@@ -242,7 +242,7 @@ static unsigned int sync_file_poll(struct file *file, poll_table *wait)
}
static long sync_file_ioctl_merge(struct sync_file *sync_file,
- unsigned long arg)
+ unsigned long arg)
{
int fd = get_unused_fd_flags(O_CLOEXEC);
int err;
@@ -297,7 +297,7 @@ err_put_fd:
}
static void sync_fill_fence_info(struct fence *fence,
- struct sync_fence_info *info)
+ struct sync_fence_info *info)
{
strlcpy(info->obj_name, fence->ops->get_timeline_name(fence),
sizeof(info->obj_name));
@@ -311,7 +311,7 @@ static void sync_fill_fence_info(struct fence *fence,
}
static long sync_file_ioctl_fence_info(struct sync_file *sync_file,
- unsigned long arg)
+ unsigned long arg)
{
struct sync_file_info info;
struct sync_fence_info *fence_info = NULL;
@@ -370,7 +370,7 @@ out:
}
static long sync_file_ioctl(struct file *file, unsigned int cmd,
- unsigned long arg)
+ unsigned long arg)
{
struct sync_file *sync_file = file->private_data;
--
2.5.5
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH v2 10/13] dma-buf/sync_file: de-stage sync_file headers
2016-04-28 13:46 [PATCH v2 00/13] De-stage Sync File Framework Gustavo Padovan
` (8 preceding siblings ...)
2016-04-28 13:46 ` [PATCH v2 09/13] staging/android: style fix: alignment to match the open parenthesis Gustavo Padovan
@ 2016-04-28 13:46 ` Gustavo Padovan
2016-04-28 13:46 ` [PATCH v2 11/13] dma-buf/sync_file: de-stage sync_file Gustavo Padovan
` (3 subsequent siblings)
13 siblings, 0 replies; 16+ messages in thread
From: Gustavo Padovan @ 2016-04-28 13:46 UTC (permalink / raw)
To: Greg Kroah-Hartman
Cc: linux-kernel, devel, dri-devel, Daniel Stone,
Arve Hjønnevåg, Riley Andrews, Daniel Vetter,
Rob Clark, Greg Hackmann, John Harrison, Maarten Lankhorst,
Sumit Semwal, Gustavo Padovan
From: Gustavo Padovan <gustavo.padovan@collabora.co.uk>
Move sync_file headers file to include/ dir.
Signed-off-by: Gustavo Padovan <gustavo.padovan@collabora.co.uk>
Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
---
drivers/staging/android/sync.h | 4 ++--
drivers/staging/android/sync_debug.c | 2 +-
drivers/staging/android/sync_file.c | 4 ++--
{drivers/staging/android => include/linux}/sync_file.h | 0
{drivers/staging/android/uapi => include/uapi/linux}/sync_file.h | 0
5 files changed, 5 insertions(+), 5 deletions(-)
rename {drivers/staging/android => include/linux}/sync_file.h (100%)
rename {drivers/staging/android/uapi => include/uapi/linux}/sync_file.h (100%)
diff --git a/drivers/staging/android/sync.h b/drivers/staging/android/sync.h
index df44abb..b56885c 100644
--- a/drivers/staging/android/sync.h
+++ b/drivers/staging/android/sync.h
@@ -20,8 +20,8 @@
#include <linux/spinlock.h>
#include <linux/fence.h>
-#include "sync_file.h"
-#include "uapi/sync_file.h"
+#include <linux/sync_file.h>
+#include <uapi/linux/sync_file.h>
struct sync_timeline;
diff --git a/drivers/staging/android/sync_debug.c b/drivers/staging/android/sync_debug.c
index 8b55218..5f57499 100644
--- a/drivers/staging/android/sync_debug.c
+++ b/drivers/staging/android/sync_debug.c
@@ -26,7 +26,7 @@
#include <linux/uaccess.h>
#include <linux/anon_inodes.h>
#include <linux/time64.h>
-#include "sync_file.h"
+#include <linux/sync_file.h>
#include "sw_sync.h"
#ifdef CONFIG_DEBUG_FS
diff --git a/drivers/staging/android/sync_file.c b/drivers/staging/android/sync_file.c
index eabf90d..f08cf2d 100644
--- a/drivers/staging/android/sync_file.c
+++ b/drivers/staging/android/sync_file.c
@@ -23,8 +23,8 @@
#include <linux/slab.h>
#include <linux/uaccess.h>
#include <linux/anon_inodes.h>
-#include "sync_file.h"
-#include "uapi/sync_file.h"
+#include <linux/sync_file.h>
+#include <uapi/linux/sync_file.h>
static const struct file_operations sync_file_fops;
diff --git a/drivers/staging/android/sync_file.h b/include/linux/sync_file.h
similarity index 100%
rename from drivers/staging/android/sync_file.h
rename to include/linux/sync_file.h
diff --git a/drivers/staging/android/uapi/sync_file.h b/include/uapi/linux/sync_file.h
similarity index 100%
rename from drivers/staging/android/uapi/sync_file.h
rename to include/uapi/linux/sync_file.h
--
2.5.5
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH v2 11/13] dma-buf/sync_file: de-stage sync_file
2016-04-28 13:46 [PATCH v2 00/13] De-stage Sync File Framework Gustavo Padovan
` (9 preceding siblings ...)
2016-04-28 13:46 ` [PATCH v2 10/13] dma-buf/sync_file: de-stage sync_file headers Gustavo Padovan
@ 2016-04-28 13:46 ` Gustavo Padovan
2016-04-28 13:46 ` [PATCH v2 12/13] Documentation: include sync_file into DocBook Gustavo Padovan
` (2 subsequent siblings)
13 siblings, 0 replies; 16+ messages in thread
From: Gustavo Padovan @ 2016-04-28 13:46 UTC (permalink / raw)
To: Greg Kroah-Hartman
Cc: linux-kernel, devel, dri-devel, Daniel Stone,
Arve Hjønnevåg, Riley Andrews, Daniel Vetter,
Rob Clark, Greg Hackmann, John Harrison, Maarten Lankhorst,
Sumit Semwal, Gustavo Padovan
From: Gustavo Padovan <gustavo.padovan@collabora.co.uk>
sync_file is useful to connect one or more fences to the file. The file is
used by userspace to track fences between drivers that share DMA bufs.
Signed-off-by: Gustavo Padovan <gustavo.padovan@collabora.co.uk>
Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
---
drivers/Kconfig | 2 ++
drivers/dma-buf/Kconfig | 11 +++++++++++
drivers/dma-buf/Makefile | 1 +
drivers/{staging/android => dma-buf}/sync_file.c | 0
drivers/staging/android/Kconfig | 1 +
drivers/staging/android/Makefile | 2 +-
6 files changed, 16 insertions(+), 1 deletion(-)
create mode 100644 drivers/dma-buf/Kconfig
rename drivers/{staging/android => dma-buf}/sync_file.c (100%)
diff --git a/drivers/Kconfig b/drivers/Kconfig
index d2ac339..430f761 100644
--- a/drivers/Kconfig
+++ b/drivers/Kconfig
@@ -114,6 +114,8 @@ source "drivers/rtc/Kconfig"
source "drivers/dma/Kconfig"
+source "drivers/dma-buf/Kconfig"
+
source "drivers/dca/Kconfig"
source "drivers/auxdisplay/Kconfig"
diff --git a/drivers/dma-buf/Kconfig b/drivers/dma-buf/Kconfig
new file mode 100644
index 0000000..9824bc4
--- /dev/null
+++ b/drivers/dma-buf/Kconfig
@@ -0,0 +1,11 @@
+menu "DMABUF options"
+
+config SYNC_FILE
+ bool "sync_file support for fences"
+ default n
+ select ANON_INODES
+ select DMA_SHARED_BUFFER
+ ---help---
+ This option enables the fence framework synchronization to export
+ sync_files to userspace that can represent one or more fences.
+endmenu
diff --git a/drivers/dma-buf/Makefile b/drivers/dma-buf/Makefile
index 57a675f..4a424ec 100644
--- a/drivers/dma-buf/Makefile
+++ b/drivers/dma-buf/Makefile
@@ -1 +1,2 @@
obj-y := dma-buf.o fence.o reservation.o seqno-fence.o
+obj-$(CONFIG_SYNC_FILE) += sync_file.o
diff --git a/drivers/staging/android/sync_file.c b/drivers/dma-buf/sync_file.c
similarity index 100%
rename from drivers/staging/android/sync_file.c
rename to drivers/dma-buf/sync_file.c
diff --git a/drivers/staging/android/Kconfig b/drivers/staging/android/Kconfig
index 4244821..7a3a77e 100644
--- a/drivers/staging/android/Kconfig
+++ b/drivers/staging/android/Kconfig
@@ -38,6 +38,7 @@ config SW_SYNC
bool "Software synchronization objects"
default n
depends on SYNC
+ depends on SYNC_FILE
---help---
A sync object driver that uses a 32bit counter to coordinate
synchronization. Useful when there is no hardware primitive backing
diff --git a/drivers/staging/android/Makefile b/drivers/staging/android/Makefile
index ebc2df1..980d6dc 100644
--- a/drivers/staging/android/Makefile
+++ b/drivers/staging/android/Makefile
@@ -4,5 +4,5 @@ obj-y += ion/
obj-$(CONFIG_ASHMEM) += ashmem.o
obj-$(CONFIG_ANDROID_LOW_MEMORY_KILLER) += lowmemorykiller.o
-obj-$(CONFIG_SYNC) += sync_file.o sync.o sync_debug.o
+obj-$(CONFIG_SYNC) += sync.o sync_debug.o
obj-$(CONFIG_SW_SYNC) += sw_sync.o
--
2.5.5
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH v2 12/13] Documentation: include sync_file into DocBook
2016-04-28 13:46 [PATCH v2 00/13] De-stage Sync File Framework Gustavo Padovan
` (10 preceding siblings ...)
2016-04-28 13:46 ` [PATCH v2 11/13] dma-buf/sync_file: de-stage sync_file Gustavo Padovan
@ 2016-04-28 13:46 ` Gustavo Padovan
2016-04-28 13:47 ` [PATCH v2 13/13] Documentation: add Sync File doc Gustavo Padovan
2016-04-30 0:39 ` [PATCH v2 00/13] De-stage Sync File Framework Greg Kroah-Hartman
13 siblings, 0 replies; 16+ messages in thread
From: Gustavo Padovan @ 2016-04-28 13:46 UTC (permalink / raw)
To: Greg Kroah-Hartman
Cc: linux-kernel, devel, dri-devel, Daniel Stone,
Arve Hjønnevåg, Riley Andrews, Daniel Vetter,
Rob Clark, Greg Hackmann, John Harrison, Maarten Lankhorst,
Sumit Semwal, Gustavo Padovan
From: Gustavo Padovan <gustavo.padovan@collabora.co.uk>
Add entry in device-drivers.tmpl for sync_file documentation.
Signed-off-by: Gustavo Padovan <gustavo.padovan@collabora.co.uk>
Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
---
Documentation/DocBook/device-drivers.tmpl | 2 ++
1 file changed, 2 insertions(+)
diff --git a/Documentation/DocBook/device-drivers.tmpl b/Documentation/DocBook/device-drivers.tmpl
index 184f3c7..509a187 100644
--- a/Documentation/DocBook/device-drivers.tmpl
+++ b/Documentation/DocBook/device-drivers.tmpl
@@ -136,6 +136,8 @@ X!Edrivers/base/interface.c
!Iinclude/linux/seqno-fence.h
!Edrivers/dma-buf/reservation.c
!Iinclude/linux/reservation.h
+!Edrivers/dma-buf/sync_file.c
+!Iinclude/linux/sync_file.h
!Edrivers/base/dma-coherent.c
!Edrivers/base/dma-mapping.c
</sect1>
--
2.5.5
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH v2 13/13] Documentation: add Sync File doc
2016-04-28 13:46 [PATCH v2 00/13] De-stage Sync File Framework Gustavo Padovan
` (11 preceding siblings ...)
2016-04-28 13:46 ` [PATCH v2 12/13] Documentation: include sync_file into DocBook Gustavo Padovan
@ 2016-04-28 13:47 ` Gustavo Padovan
2016-04-30 0:39 ` [PATCH v2 00/13] De-stage Sync File Framework Greg Kroah-Hartman
13 siblings, 0 replies; 16+ messages in thread
From: Gustavo Padovan @ 2016-04-28 13:47 UTC (permalink / raw)
To: Greg Kroah-Hartman
Cc: linux-kernel, devel, dri-devel, Daniel Stone,
Arve Hjønnevåg, Riley Andrews, Daniel Vetter,
Rob Clark, Greg Hackmann, John Harrison, Maarten Lankhorst,
Sumit Semwal, Gustavo Padovan
From: Gustavo Padovan <gustavo.padovan@collabora.co.uk>
Add sync_file documentation on dma-buf-sync_file.txt
Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
---
Documentation/sync_file.txt | 69 +++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 69 insertions(+)
create mode 100644 Documentation/sync_file.txt
diff --git a/Documentation/sync_file.txt b/Documentation/sync_file.txt
new file mode 100644
index 0000000..eaf8297
--- /dev/null
+++ b/Documentation/sync_file.txt
@@ -0,0 +1,69 @@
+ Sync File API Guide
+ ~~~~~~~~~~~~~~~~~~~
+
+ Gustavo Padovan
+ <gustavo at padovan dot org>
+
+This document serves as a guide for device drivers writers on what the
+sync_file API is, and how drivers can support it. Sync file is the carrier of
+the fences(struct fence) that needs to synchronized between drivers or across
+process boundaries.
+
+The sync_file API is meant to be used to send and receive fence information
+to/from userspace. It enables userspace to do explicit fencing, where instead
+of attaching a fence to the buffer a producer driver (such as a GPU or V4L
+driver) sends the fence related to the buffer to userspace via a sync_file.
+
+The sync_file then can be sent to the consumer (DRM driver for example), that
+will not use the buffer for anything before the fence(s) signals, i.e., the
+driver that issued the fence is not using/processing the buffer anymore, so it
+signals that the buffer is ready to use. And vice-versa for the consumer ->
+producer part of the cycle.
+
+Sync files allows userspace awareness on buffer sharing synchronization between
+drivers.
+
+Sync file was originally added in the Android kernel but current Linux Desktop
+can benefit a lot from it.
+
+in-fences and out-fences
+------------------------
+
+Sync files can go either to or from userspace. When a sync_file is sent from
+the driver to userspace we call the fences it contains 'out-fences'. They are
+related to a buffer that the driver is processing or is going to process, so
+the driver an create out-fence to be able to notify, through fence_signal(),
+when it has finished using (or processing) that buffer. Out-fences are fences
+that the driver creates.
+
+On the other hand if the driver receives fence(s) through a sync_file from
+userspace we call these fence(s) 'in-fences'. Receiveing in-fences means that
+we need to wait for the fence(s) to signal before using any buffer related to
+the in-fences.
+
+Creating Sync Files
+-------------------
+
+When a driver needs to send an out-fence userspace it creates a sync_file.
+
+Interface:
+ struct sync_file *sync_file_create(struct fence *fence);
+
+The caller pass the out-fence and gets back the sync_file. That is just the
+first step, next it needs to install an fd on sync_file->file. So it gets an
+fd:
+
+ fd = get_unused_fd_flags(O_CLOEXEC);
+
+and installs it on sync_file->file:
+
+ fd_install(fd, sync_file->file);
+
+The sync_file fd now can be sent to userspace.
+
+If the creation process fail, or the sync_file needs to be released by any
+other reason fput(sync_file->file) should be used.
+
+References:
+[1] struct sync_file in include/linux/sync_file.h
+[2] All interfaces mentioned above defined in include/linux/sync_file.h
--
2.5.5
^ permalink raw reply related [flat|nested] 16+ messages in thread
* Re: [PATCH v2 00/13] De-stage Sync File Framework
2016-04-28 13:46 [PATCH v2 00/13] De-stage Sync File Framework Gustavo Padovan
` (12 preceding siblings ...)
2016-04-28 13:47 ` [PATCH v2 13/13] Documentation: add Sync File doc Gustavo Padovan
@ 2016-04-30 0:39 ` Greg Kroah-Hartman
13 siblings, 0 replies; 16+ messages in thread
From: Greg Kroah-Hartman @ 2016-04-30 0:39 UTC (permalink / raw)
To: Gustavo Padovan
Cc: devel, Rob Clark, Daniel Stone, Daniel Vetter, Maarten Lankhorst,
Riley Andrews, dri-devel, linux-kernel, Arve Hjønnevåg,
Greg Hackmann, Gustavo Padovan, Sumit Semwal, John Harrison
On Thu, Apr 28, 2016 at 10:46:47AM -0300, Gustavo Padovan wrote:
> From: Gustavo Padovan <gustavo.padovan@collabora.co.uk>
>
> Hi,
>
> This patchset sits on top of Sync ABI Rework v13:
>
> https://www.spinics.net/lists/dri-devel/msg105667.html
>
> The first eight clean up and prepare sync_file for de-staging. The last four
> patches do the de-staging, moving files to drivers/dma-buf/ and include/linux/
> plus adding Documentation.
>
> As the de-stage depends upon many changes on the staging tree it would
> be good to get all the patches merged through the staging tree if Sumit
> agrees with that.
>
> The next step on the Sync de-stage is clean up the remaining bits
> of the Sync Framework, mainly SW_SYNC, which is only used for testing.
>
> v2: - Add Reviewed-by: tag from Daniel Vetter to all patches.
> - Take in sugestions for the Sync File Documentation (Daniel)
> - Remove name arg from sync_file_crate() (Daniel)
> - Revome leftover EXPORT_SYMBOL(sync_file_merge) (Daniel)
Thanks for sticking with this, both series of patches are now applied,
thanks.
greg k-h
^ permalink raw reply [flat|nested] 16+ messages in thread