[Intel-gfx] [PATCH v2] get-fences-locked
Chris Wilson
chris at chris-wilson.co.uk
Fri Nov 4 10:29:54 UTC 2016
---
drivers/dma-buf/reservation.c | 58 +++++++++++++++++++++++++++++++++++++++++++
include/linux/reservation.h | 4 +++
2 files changed, 62 insertions(+)
diff --git a/drivers/dma-buf/reservation.c b/drivers/dma-buf/reservation.c
index 3c9ab53be2b9..0f254d0d9bec 100644
--- a/drivers/dma-buf/reservation.c
+++ b/drivers/dma-buf/reservation.c
@@ -133,6 +133,64 @@ void reservation_object_add_excl_fence(struct reservation_object *obj,
EXPORT_SYMBOL(reservation_object_add_excl_fence);
/**
+ * reservation_object_get_fences_locked - Get an object's shared and exclusive
+ * fences
+ * @obj: the reservation object
+ * @pfence_excl: the returned exclusive fence (or NULL)
+ * @pshared_count: the number of shared fences returned
+ * @pshared: the array of shared fence ptrs returned (array is krealloc'd to
+ * the required size, and must be freed by caller)
+ *
+ * RETURNS
+ * Zero or -errno
+ */
+int reservation_object_get_fences_locked(struct reservation_object *obj,
+ struct dma_fence **pfence_excl,
+ unsigned *pshared_count,
+ struct dma_fence ***pshared)
+{
+ struct dma_fence **shared = NULL;
+ unsigned int count = 0;
+ struct radix_tree_iter iter;
+ void **slot;
+
+ radix_tree_for_each_slot(slot, &obj->shared, &iter, 0) {
+ struct dma_fence *fence = radix_tree_deref_slot(slot);
+
+ if (dma_fence_is_signaled(fence)) {
+ radix_tree_delete(&obj->shared, iter.index);
+ continue;
+ }
+
+ if ((count & -count) == count) {
+ struct dma_fence **nshared;
+ unsigned int sz;
+
+ sz = count ? 2*count : 1;
+ nshared = krealloc(shared,
+ sz * sizeof(*shared),
+ GFP_TEMPORARY);
+ if (!nshared) {
+ while (count--)
+ dma_fence_put(shared[count]);
+ kfree(shared);
+ return -ENOMEM;
+ }
+
+ shared = nshared;
+ }
+
+ shared[count++] = dma_fence_get(fence);
+ }
+
+ *pshared_count = count;
+ *pshared = shared;
+ *pfence_excl = dma_fence_get(rcu_dereference(obj->excl));
+ return 0;
+}
+EXPORT_SYMBOL_GPL(reservation_object_get_fences_locked);
+
+/**
* reservation_object_get_fences_rcu - Get an object's shared and exclusive
* fences without update side lock held
* @obj: the reservation object
diff --git a/include/linux/reservation.h b/include/linux/reservation.h
index 697ec52427ca..4f39942906e2 100644
--- a/include/linux/reservation.h
+++ b/include/linux/reservation.h
@@ -161,6 +161,10 @@ void reservation_object_add_shared_fence(struct reservation_object *obj,
void reservation_object_add_excl_fence(struct reservation_object *obj,
struct dma_fence *fence);
+int reservation_object_get_fences_locked(struct reservation_object *obj,
+ struct dma_fence **pfence_excl,
+ unsigned *pshared_count,
+ struct dma_fence ***pshared);
int reservation_object_get_fences_rcu(struct reservation_object *obj,
struct dma_fence **pfence_excl,
unsigned *pshared_count,
--
2.10.2
More information about the Intel-gfx
mailing list