[RFC 29/29] dma-buf/fence: de-stage sync framework

From: Gustavo Padovan
Date: Fri Jan 15 2016 - 09:57:45 EST


From: Gustavo Padovan <gustavo.padovan@xxxxxxxxxxxxxxx>

The sync framework is ready for mainline inclusion. Here we move it to
drivers/dma-buf and the header files to the appropiated places.

The sync framework contained some abstractions around struct fence and those
were removed in the de-staging process among other changes:

Userspace visible changes
-------------------------

* The sw_sync file was moved from /dev/sw_sync to <debugfs>/sync/sw_sync. No
other change.

Kernel API changes
------------------

* struct sync_timeline is now struct fence_timeline
* sync_timeline_ops is now fence_timeline_ops and they now carry struct
fence as parameter instead of struct sync_pt
* a .cleanup() fence op was added to allow sync_fence to run a cleanup when
the fence_timeline is destroyed
* added fence_add_used_data() to pass a private point to struct fence.
This pointer is sent back on the .cleanup op.
* The sync timeline function were moved to be fence_timeline functions:
- sync_timeline_create() -> fence_timeline_create()
- sync_timeline_get() -> fence_timeline_get()
- sync_timeline_put() -> fence_timeline_put()
- sync_timeline_destroy() -> fence_timeline_destroy()
- sync_timeline_signal() -> fence_timeline_signal()

* sync_pt_create() was replaced be fence_create_on_timeline()

Internal changes
----------------

* fence_timeline_ops was removed in favor of direct use fence_ops
* fence default functions were created for fence_ops
* removed structs sync_pt, sw_sync_timeline and sw_sync_pt

Signed-off-by: Gustavo Padovan <gustavo.padovan@xxxxxxxxxxxxxxx>
---
drivers/Kconfig | 2 ++
drivers/dma-buf/Kconfig | 22 ++++++++++++++++++++++
drivers/dma-buf/Makefile | 2 ++
drivers/{staging/android => dma-buf}/sw_sync.c | 3 +--
drivers/{staging/android => dma-buf}/sync.c | 7 ++++---
drivers/{staging/android => dma-buf}/sync_debug.c | 2 +-
drivers/staging/android/Kconfig | 19 -------------------
drivers/staging/android/Makefile | 2 --
.../staging/android => include/linux}/sw_sync.h | 4 ++--
{drivers/staging/android => include/linux}/sync.h | 4 ++--
.../android/trace => include/trace/events}/sync.h | 5 ++---
.../android/uapi => include/uapi/linux}/sw_sync.h | 0
.../android/uapi => include/uapi/linux}/sync.h | 0
13 files changed, 38 insertions(+), 34 deletions(-)
create mode 100644 drivers/dma-buf/Kconfig
rename drivers/{staging/android => dma-buf}/sw_sync.c (98%)
rename drivers/{staging/android => dma-buf}/sync.c (99%)
rename drivers/{staging/android => dma-buf}/sync_debug.c (99%)
rename {drivers/staging/android => include/linux}/sw_sync.h (95%)
rename {drivers/staging/android => include/linux}/sync.h (99%)
rename {drivers/staging/android/trace => include/trace/events}/sync.h (92%)
rename {drivers/staging/android/uapi => include/uapi/linux}/sw_sync.h (100%)
rename {drivers/staging/android/uapi => include/uapi/linux}/sync.h (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..4168f89
--- /dev/null
+++ b/drivers/dma-buf/Kconfig
@@ -0,0 +1,22 @@
+menu "DMABUF options"
+
+config SYNC
+ bool "Synchronization framework"
+ default n
+ select ANON_INODES
+ select DMA_SHARED_BUFFER
+ ---help---
+ This option enables the framework for synchronization between multiple
+ drivers. Sync implementations can take advantage of hardware
+ synchronization built into devices like GPUs.
+
+config SW_SYNC
+ bool "Software synchronization objects"
+ default n
+ depends on SYNC
+ ---help---
+ A sync object driver that uses a 32bit counter to coordinate
+ synchronization. Useful when there is no hardware primitive backing
+ the synchronization.
+
+endmenu
diff --git a/drivers/dma-buf/Makefile b/drivers/dma-buf/Makefile
index fb03696..b870923 100644
--- a/drivers/dma-buf/Makefile
+++ b/drivers/dma-buf/Makefile
@@ -1 +1,3 @@
obj-y := dma-buf.o fence.o fence_debug.o reservation.o seqno-fence.o
+obj-$(CONFIG_SYNC) += sync.o sync_debug.o
+obj-$(CONFIG_SW_SYNC) += sw_sync.o
diff --git a/drivers/staging/android/sw_sync.c b/drivers/dma-buf/sw_sync.c
similarity index 98%
rename from drivers/staging/android/sw_sync.c
rename to drivers/dma-buf/sw_sync.c
index 8c83bad..32d0800 100644
--- a/drivers/staging/android/sw_sync.c
+++ b/drivers/dma-buf/sw_sync.c
@@ -22,8 +22,7 @@
#include <linux/miscdevice.h>
#include <linux/syscalls.h>
#include <linux/uaccess.h>
-
-#include "sw_sync.h"
+#include <linux/sw_sync.h>

static void sw_sync_cleanup(struct fence *fence, void *user_data)
{
diff --git a/drivers/staging/android/sync.c b/drivers/dma-buf/sync.c
similarity index 99%
rename from drivers/staging/android/sync.c
rename to drivers/dma-buf/sync.c
index aafecf4..248aa44 100644
--- a/drivers/staging/android/sync.c
+++ b/drivers/dma-buf/sync.c
@@ -26,10 +26,10 @@
#include <linux/uaccess.h>
#include <linux/anon_inodes.h>

-#include "sync.h"
+#include <linux/sync.h>

#define CREATE_TRACE_POINTS
-#include "trace/sync.h"
+#include <trace/events/sync.h>

static const struct file_operations sync_fence_fops;

@@ -280,7 +280,7 @@ int sync_fence_wait(struct sync_fence *sync_fence, long timeout)

trace_sync_wait(sync_fence, 1);
for (i = 0; i < sync_fence->num_fences; ++i)
- trace_fence(sync_fence->cbs[i].fence);
+ trace_sync_fence(sync_fence->cbs[i].fence);
ret = wait_event_interruptible_timeout(sync_fence->wq,
atomic_read(&sync_fence->status) <= 0,
timeout);
@@ -395,6 +395,7 @@ static long sync_fence_ioctl_merge(struct sync_fence *sync_fence,

sync_fence_install(fence3, fd);
sync_fence_put(fence2);
+
return 0;

err_put_fence3:
diff --git a/drivers/staging/android/sync_debug.c b/drivers/dma-buf/sync_debug.c
similarity index 99%
rename from drivers/staging/android/sync_debug.c
rename to drivers/dma-buf/sync_debug.c
index 8e2ca57..294786b 100644
--- a/drivers/staging/android/sync_debug.c
+++ b/drivers/dma-buf/sync_debug.c
@@ -27,7 +27,7 @@
#include <linux/uaccess.h>
#include <linux/anon_inodes.h>
#include <linux/time64.h>
-#include "sw_sync.h"
+#include <linux/sw_sync.h>

#ifdef CONFIG_DEBUG_FS

diff --git a/drivers/staging/android/Kconfig b/drivers/staging/android/Kconfig
index bd90d20..4b18fee 100644
--- a/drivers/staging/android/Kconfig
+++ b/drivers/staging/android/Kconfig
@@ -38,25 +38,6 @@ config ANDROID_LOW_MEMORY_KILLER
scripts (/init.rc), and it defines priority values with minimum free memory size
for each priority.

-config SYNC
- bool "Synchronization framework"
- default n
- select ANON_INODES
- select DMA_SHARED_BUFFER
- ---help---
- This option enables the framework for synchronization between multiple
- drivers. Sync implementations can take advantage of hardware
- synchronization built into devices like GPUs.
-
-config SW_SYNC
- bool "Software synchronization objects"
- default n
- depends on SYNC
- ---help---
- A sync object driver that uses a 32bit counter to coordinate
- synchronization. Useful when there is no hardware primitive backing
- the synchronization.
-
source "drivers/staging/android/ion/Kconfig"

endif # if ANDROID
diff --git a/drivers/staging/android/Makefile b/drivers/staging/android/Makefile
index c7b6c99..355ad0e 100644
--- a/drivers/staging/android/Makefile
+++ b/drivers/staging/android/Makefile
@@ -6,5 +6,3 @@ obj-$(CONFIG_ASHMEM) += ashmem.o
obj-$(CONFIG_ANDROID_TIMED_OUTPUT) += timed_output.o
obj-$(CONFIG_ANDROID_TIMED_GPIO) += timed_gpio.o
obj-$(CONFIG_ANDROID_LOW_MEMORY_KILLER) += lowmemorykiller.o
-obj-$(CONFIG_SYNC) += sync.o sync_debug.o
-obj-$(CONFIG_SW_SYNC) += sw_sync.o
diff --git a/drivers/staging/android/sw_sync.h b/include/linux/sw_sync.h
similarity index 95%
rename from drivers/staging/android/sw_sync.h
rename to include/linux/sw_sync.h
index f912888..68cb3d9 100644
--- a/drivers/staging/android/sw_sync.h
+++ b/include/linux/sw_sync.h
@@ -19,8 +19,8 @@

#include <linux/types.h>
#include <linux/kconfig.h>
-#include "sync.h"
-#include "uapi/sw_sync.h"
+#include <linux/sync.h>
+#include <uapi/linux/sw_sync.h>

#if IS_ENABLED(CONFIG_SW_SYNC)
struct fence_timeline *sw_sync_timeline_create(const char *name);
diff --git a/drivers/staging/android/sync.h b/include/linux/sync.h
similarity index 99%
rename from drivers/staging/android/sync.h
rename to include/linux/sync.h
index d60d9c2..ecefed5 100644
--- a/drivers/staging/android/sync.h
+++ b/include/linux/sync.h
@@ -20,8 +20,8 @@
#include <linux/spinlock.h>
#include <linux/wait.h>
#include <linux/fence.h>
-
-#include "uapi/sync.h"
+#include <linux/sync.h>
+#include <uapi/linux/sync.h>

struct sync_fence;

diff --git a/drivers/staging/android/trace/sync.h b/include/trace/events/sync.h
similarity index 92%
rename from drivers/staging/android/trace/sync.h
rename to include/trace/events/sync.h
index 4f68515..fa19962 100644
--- a/drivers/staging/android/trace/sync.h
+++ b/include/trace/events/sync.h
@@ -1,11 +1,10 @@
#undef TRACE_SYSTEM
-#define TRACE_INCLUDE_PATH ../../drivers/staging/android/trace
#define TRACE_SYSTEM sync

#if !defined(_TRACE_SYNC_H) || defined(TRACE_HEADER_MULTI_READ)
#define _TRACE_SYNC_H

-#include "../sync.h"
+#include <linux/sync.h>
#include <linux/tracepoint.h>

TRACE_EVENT(sync_wait,
@@ -29,7 +28,7 @@ TRACE_EVENT(sync_wait,
__get_str(name), __entry->status)
);

-TRACE_EVENT(fence,
+TRACE_EVENT(sync_fence,
TP_PROTO(struct fence *fence),

TP_ARGS(fence),
diff --git a/drivers/staging/android/uapi/sw_sync.h b/include/uapi/linux/sw_sync.h
similarity index 100%
rename from drivers/staging/android/uapi/sw_sync.h
rename to include/uapi/linux/sw_sync.h
diff --git a/drivers/staging/android/uapi/sync.h b/include/uapi/linux/sync.h
similarity index 100%
rename from drivers/staging/android/uapi/sync.h
rename to include/uapi/linux/sync.h
--
2.5.0