reservation: add support for fences to enable cross-device synchronisation
Signed-off-by: Maarten Lankhorst <maarten.lankhorst@canonical.com> Acked-by: Sumit Semwal <sumit.semwal@linaro.org> Acked-by: Daniel Vetter <daniel@ffwll.ch> Reviewed-by: Rob Clark <robdclark@gmail.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
0f0d8406fb
commit
0ba6b8fb91
1 changed files with 19 additions and 1 deletions
|
@ -6,7 +6,7 @@
|
||||||
* Copyright (C) 2012 Texas Instruments
|
* Copyright (C) 2012 Texas Instruments
|
||||||
*
|
*
|
||||||
* Authors:
|
* Authors:
|
||||||
* Rob Clark <rob.clark@linaro.org>
|
* Rob Clark <robdclark@gmail.com>
|
||||||
* Maarten Lankhorst <maarten.lankhorst@canonical.com>
|
* Maarten Lankhorst <maarten.lankhorst@canonical.com>
|
||||||
* Thomas Hellstrom <thellstrom-at-vmware-dot-com>
|
* Thomas Hellstrom <thellstrom-at-vmware-dot-com>
|
||||||
*
|
*
|
||||||
|
@ -40,22 +40,40 @@
|
||||||
#define _LINUX_RESERVATION_H
|
#define _LINUX_RESERVATION_H
|
||||||
|
|
||||||
#include <linux/ww_mutex.h>
|
#include <linux/ww_mutex.h>
|
||||||
|
#include <linux/fence.h>
|
||||||
|
#include <linux/slab.h>
|
||||||
|
|
||||||
extern struct ww_class reservation_ww_class;
|
extern struct ww_class reservation_ww_class;
|
||||||
|
|
||||||
struct reservation_object {
|
struct reservation_object {
|
||||||
struct ww_mutex lock;
|
struct ww_mutex lock;
|
||||||
|
|
||||||
|
struct fence *fence_excl;
|
||||||
|
struct fence **fence_shared;
|
||||||
|
u32 fence_shared_count, fence_shared_max;
|
||||||
};
|
};
|
||||||
|
|
||||||
static inline void
|
static inline void
|
||||||
reservation_object_init(struct reservation_object *obj)
|
reservation_object_init(struct reservation_object *obj)
|
||||||
{
|
{
|
||||||
ww_mutex_init(&obj->lock, &reservation_ww_class);
|
ww_mutex_init(&obj->lock, &reservation_ww_class);
|
||||||
|
|
||||||
|
obj->fence_shared_count = obj->fence_shared_max = 0;
|
||||||
|
obj->fence_shared = NULL;
|
||||||
|
obj->fence_excl = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void
|
static inline void
|
||||||
reservation_object_fini(struct reservation_object *obj)
|
reservation_object_fini(struct reservation_object *obj)
|
||||||
{
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if (obj->fence_excl)
|
||||||
|
fence_put(obj->fence_excl);
|
||||||
|
for (i = 0; i < obj->fence_shared_count; ++i)
|
||||||
|
fence_put(obj->fence_shared[i]);
|
||||||
|
kfree(obj->fence_shared);
|
||||||
|
|
||||||
ww_mutex_destroy(&obj->lock);
|
ww_mutex_destroy(&obj->lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue