#include <linux/slab.h>
#include <linux/sync_file.h>
-#include "uapi/sw_sync.h"
-#include "sync.h"
+#include "sync_debug.h"
#define CREATE_TRACE_POINTS
#include "trace/sync.h"
+struct sw_sync_create_fence_data {
+ __u32 value;
+ char name[32];
+ __s32 fence; /* fd of new fence */
+};
+
+#define SW_SYNC_IOC_MAGIC 'W'
+
+#define SW_SYNC_IOC_CREATE_FENCE _IOWR(SW_SYNC_IOC_MAGIC, 0,\
+ struct sw_sync_create_fence_data)
+#define SW_SYNC_IOC_INC _IOW(SW_SYNC_IOC_MAGIC, 1, __u32)
+
static const struct fence_ops timeline_fence_ops;
static inline struct sync_pt *fence_to_sync_pt(struct fence *fence)
/**
* sync_timeline_create() - creates a sync object
- * @drv_name: sync_timeline driver name
* @name: sync_timeline name
*
* Creates a new sync_timeline. Returns the sync_timeline object or NULL in
* case of error.
*/
-struct sync_timeline *sync_timeline_create(const char *drv_name,
- const char *name)
+struct sync_timeline *sync_timeline_create(const char *name)
{
struct sync_timeline *obj;
kref_init(&obj->kref);
obj->context = fence_context_alloc(1);
strlcpy(obj->name, name, sizeof(obj->name));
- strlcpy(obj->drv_name, drv_name, sizeof(obj->drv_name));
INIT_LIST_HEAD(&obj->child_list_head);
INIT_LIST_HEAD(&obj->active_list_head);
kref_put(&obj->kref, sync_timeline_free);
}
-/**
- * sync_timeline_destroy() - destroys a sync object
- * @obj: sync_timeline to destroy
- *
- * A sync implementation should call this when the @obj is going away
- * (i.e. module unload.) @obj won't actually be freed until all its children
- * fences are freed.
- */
-static void sync_timeline_destroy(struct sync_timeline *obj)
-{
- obj->destroyed = true;
- /*
- * Ensure timeline is marked as destroyed before
- * changing timeline's fences status.
- */
- smp_wmb();
-
- sync_timeline_put(obj);
-}
-
/**
* sync_timeline_signal() - signal a status change on a sync_timeline
* @obj: sync_timeline to signal
static const char *timeline_fence_get_driver_name(struct fence *fence)
{
- struct sync_timeline *parent = fence_parent(fence);
-
- return parent->drv_name;
+ return "sw_sync";
}
static const char *timeline_fence_get_timeline_name(struct fence *fence)
get_task_comm(task_comm, current);
- obj = sync_timeline_create("sw_sync", task_comm);
+ obj = sync_timeline_create(task_comm);
if (!obj)
return -ENOMEM;
{
struct sync_timeline *obj = file->private_data;
- sync_timeline_destroy(obj);
+ smp_wmb();
+
+ sync_timeline_put(obj);
return 0;
}