Skip to content

Commit

Permalink
UPSTREAM: dma-buf: Add dma_fence_array_for_each (v2)
Browse files Browse the repository at this point in the history
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.

Bug: 310208240
Change-Id: Ic142d9066c8ed14fd1ca7163f8ac5eaf15c6d972
Signed-off-by: Jason Ekstrand <jason@jlekstrand.net>
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
Reviewed-by: Christian König <christian.koenig@amd.com>
Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
Cc: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20210610210925.642582-2-jason@jlekstrand.net
Signed-off-by: Christian König <christian.koenig@amd.com>
(cherry picked from commit caaf2ae712b7cc3c7717898fe267dbf882a502ef)
Signed-off-by: Richard Fung <richardfung@google.com>
  • Loading branch information
Christian König authored and toddkjos committed Nov 15, 2023
1 parent 20b2d56 commit 67e5ffd
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 0 deletions.
27 changes: 27 additions & 0 deletions drivers/dma-buf/dma-fence-array.c
Original file line number Diff line number Diff line change
Expand Up @@ -205,3 +205,30 @@ bool dma_fence_match_context(struct dma_fence *fence, u64 context)
return true;
}
EXPORT_SYMBOL(dma_fence_match_context);

struct dma_fence *dma_fence_array_first(struct dma_fence *head)
{
struct dma_fence_array *array;

if (!head)
return NULL;

array = to_dma_fence_array(head);
if (!array)
return head;

return array->fences[0];
}
EXPORT_SYMBOL(dma_fence_array_first);

struct dma_fence *dma_fence_array_next(struct dma_fence *head,
unsigned int index)
{
struct dma_fence_array *array = to_dma_fence_array(head);

if (!array || index >= array->num_fences)
return NULL;

return array->fences[index];
}
EXPORT_SYMBOL(dma_fence_array_next);
17 changes: 17 additions & 0 deletions include/linux/dma-fence-array.h
Original file line number Diff line number Diff line change
Expand Up @@ -74,11 +74,28 @@ to_dma_fence_array(struct dma_fence *fence)
return container_of(fence, struct dma_fence_array, base);
}

/**
* dma_fence_array_for_each - iterate over all fences in array
* @fence: current fence
* @index: index into the array
* @head: potential dma_fence_array object
*
* Test if @array is a dma_fence_array object and if yes iterate over all fences
* in the array. If not just iterate over the fence in @array itself.
*/
#define dma_fence_array_for_each(fence, index, head) \
for (index = 0, fence = dma_fence_array_first(head); fence; \
++(index), fence = dma_fence_array_next(head, index))

struct dma_fence_array *dma_fence_array_create(int num_fences,
struct dma_fence **fences,
u64 context, unsigned seqno,
bool signal_on_any);

bool dma_fence_match_context(struct dma_fence *fence, u64 context);

struct dma_fence *dma_fence_array_first(struct dma_fence *head);
struct dma_fence *dma_fence_array_next(struct dma_fence *head,
unsigned int index);

#endif /* __LINUX_DMA_FENCE_ARRAY_H */

0 comments on commit 67e5ffd

Please sign in to comment.