History

dma-buf: Add dma_fence_array_for_each (v2)

Add a helper to iterate over all fences in a dma_fence_array object. v2 (Jason Ekstrand) - Return NULL from dma_fence_array_first if head == NULL. This matches the iterator behavior of dma_fence_chain_for_each in that it iterates zero times if head == NULL. - Return NULL from dma_fence_array_next if index > array->num_fences.

Christian König committed 4 years ago

Commit caaf2ae1 parent 7344bad2 files · +44 −0Browse files

Unified · Split

2 files
  1. drivers/dma-buf/dma-fence-array.c +27 −0
  2. include/linux/dma-fence-array.h +17 −0
drivers/dma-buf/dma-fence-array.c+27−0
@@ -219,3 +219,30 @@ bool dma_fence_match_context(struct dma_fence *fence, u64 context) · 218 unmodified lines
219 return true;219 return true;
220}220}
221EXPORT_SYMBOL(dma_fence_match_context);221EXPORT_SYMBOL(dma_fence_match_context);
222
223struct dma_fence *dma_fence_array_first(struct dma_fence *head)
224{
225 struct dma_fence_array *array;
226
227 if (!head)
228 return NULL;
229
230 array = to_dma_fence_array(head);
231 if (!array)
232 return head;
233
234 return array->fences[0];
235}
236EXPORT_SYMBOL(dma_fence_array_first);
237
238struct dma_fence *dma_fence_array_next(struct dma_fence *head,
239 unsigned int index)
240{
241 struct dma_fence_array *array = to_dma_fence_array(head);
242
243 if (!array || index >= array->num_fences)
244 return NULL;
245
246 return array->fences[index];
247}
248EXPORT_SYMBOL(dma_fence_array_next);
include/linux/dma-fence-array.h+17−0
@@ -61,6 +61,19 @@ to_dma_fence_array(struct dma_fence *fence) · 60 unmodified lines
61 return container_of(fence, struct dma_fence_array, base);61 return container_of(fence, struct dma_fence_array, base);
62}62}
63 63
64/**
65 * dma_fence_array_for_each - iterate over all fences in array
66 * @fence: current fence
67 * @index: index into the array
68 * @head: potential dma_fence_array object
69 *
70 * Test if @array is a dma_fence_array object and if yes iterate over all fences
71 * in the array. If not just iterate over the fence in @array itself.
72 */
73#define dma_fence_array_for_each(fence, index, head) \
74 for (index = 0, fence = dma_fence_array_first(head); fence; \
75 ++(index), fence = dma_fence_array_next(head, index))
76
64struct dma_fence_array *dma_fence_array_create(int num_fences,77struct dma_fence_array *dma_fence_array_create(int num_fences,
65 struct dma_fence **fences,78 struct dma_fence **fences,
66 u64 context, unsigned seqno,79 u64 context, unsigned seqno,
@@ -68,4 +81,8 @@ struct dma_fence_array *dma_fence_array_create(int num_fences, · 1 unmodified line
68 81
69bool dma_fence_match_context(struct dma_fence *fence, u64 context);82bool dma_fence_match_context(struct dma_fence *fence, u64 context);
70 83
84struct dma_fence *dma_fence_array_first(struct dma_fence *head);
85struct dma_fence *dma_fence_array_next(struct dma_fence *head,
86 unsigned int index);
87
71#endif /* __LINUX_DMA_FENCE_ARRAY_H */88#endif /* __LINUX_DMA_FENCE_ARRAY_H */