On Mon, May 23, 2016 at 01:25:22PM +0200, Christian König wrote: > From: Christian König <christian.koenig at amd.com> > > If @signal_on_any is true the fence array signals if any fence in the array > signals, otherwise it signals when all fences in the array signal.
What do you need this for? Sounds neat, but I can't come up with a use case. And that use case imo should be both in the commit message and kerneldoc. -Daniel > > Signed-off-by: Christian König <christian.koenig at amd.com> > --- > drivers/dma-buf/fence-array.c | 23 ++++++++++++++++------- > include/linux/fence-array.h | 3 ++- > 2 files changed, 18 insertions(+), 8 deletions(-) > > diff --git a/drivers/dma-buf/fence-array.c b/drivers/dma-buf/fence-array.c > index bbcf79f..726e840 100644 > --- a/drivers/dma-buf/fence-array.c > +++ b/drivers/dma-buf/fence-array.c > @@ -41,6 +41,7 @@ static void fence_array_cb_func(struct fence *f, struct > fence_cb *cb) > > if (atomic_dec_and_test(&array->num_pending)) > fence_signal(&array->base); > + fence_put(&array->base); > } > > static bool fence_array_enable_signaling(struct fence *fence) > @@ -51,10 +52,13 @@ static bool fence_array_enable_signaling(struct fence > *fence) > > for (i = 0; i < array->num_fences; ++i) { > cb[i].array = array; > + fence_get(&array->base); > if (!fence_add_callback(array->fences[i], &cb[i].cb, > - fence_array_cb_func)) > + fence_array_cb_func)) { > + fence_put(&array->base); > if (atomic_dec_and_test(&array->num_pending)) > return false; > + } > } > > return true; > @@ -90,10 +94,11 @@ const struct fence_ops fence_array_ops = { > > /** > * fence_array_create - Create a custom fence array > - * @num_fences: [in] number of fences to add in the array > - * @fences: [in] array containing the fences > - * @context: [in] fence context to use > - * @seqno: [in] sequence number to use > + * @num_fences: [in] number of fences to add in the array > + * @fences: [in] array containing the fences > + * @context: [in] fence context to use > + * @seqno: [in] sequence number to use > + * @signal_on_any [in] signal on any fence in the array > * > * Allocate a fence_array object and initialize the base fence with > fence_init(). > * In case of error it returns NULL. > @@ -101,9 +106,13 @@ const struct fence_ops fence_array_ops = { > * The caller should allocte the fences array with num_fences size > * and fill it with the fences it wants to add to the object. Ownership of > this > * array is take and fence_put() is used on each fence on release. > + * > + * If @signal_on_any is true the fence array signals if any fence in the > array > + * signals, otherwise it signals when all fences in the array signal. > */ > struct fence_array *fence_array_create(int num_fences, struct fence **fences, > - u64 context, unsigned seqno) > + u64 context, unsigned seqno, > + bool signal_on_any) > { > struct fence_array *array; > size_t size = sizeof(*array); > @@ -119,7 +128,7 @@ struct fence_array *fence_array_create(int num_fences, > struct fence **fences, > context, seqno); > > array->num_fences = num_fences; > - atomic_set(&array->num_pending, num_fences); > + atomic_set(&array->num_pending, signal_on_any ? 1 : num_fences); > array->fences = fences; > > return array; > diff --git a/include/linux/fence-array.h b/include/linux/fence-array.h > index 593ab98..86baaa4 100644 > --- a/include/linux/fence-array.h > +++ b/include/linux/fence-array.h > @@ -67,6 +67,7 @@ static inline struct fence_array *to_fence_array(struct > fence *fence) > } > > struct fence_array *fence_array_create(int num_fences, struct fence **fences, > - u64 context, unsigned seqno); > + u64 context, unsigned seqno, > + bool signal_on_any); > > #endif /* __LINUX_FENCE_ARRAY_H */ > -- > 2.5.0 > -- Daniel Vetter Software Engineer, Intel Corporation http://blog.ffwll.ch