Message ID | 1466695790-2833-4-git-send-email-gustavo@padovan.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Thu, Jun 23, 2016 at 12:29:48PM -0300, Gustavo Padovan wrote: > From: Gustavo Padovan <gustavo.padovan@collabora.co.uk> > > get_fences() should return a copy of all fences in the fence as some > fence subclass (such as fence_array) can store more than one fence at > time. > > Signed-off-by: Gustavo Padovan <gustavo.padovan@collabora.co.uk> > --- > drivers/dma-buf/fence.c | 14 ++++++++++++++ > include/linux/fence.h | 3 +++ > 2 files changed, 17 insertions(+) > > diff --git a/drivers/dma-buf/fence.c b/drivers/dma-buf/fence.c > index 4e61afb..f4094fd 100644 > --- a/drivers/dma-buf/fence.c > +++ b/drivers/dma-buf/fence.c > @@ -185,6 +185,20 @@ void fence_release(struct kref *kref) > } > EXPORT_SYMBOL(fence_release); > > +struct fence **fence_get_fences(struct fence *fence) Returning an array, but not telling the caller how many elements in the array? > +{ > + if (fence->ops->get_fences) { > + return fence->ops->get_fences(fence); > + } else { > + struct fence **fences = kmalloc(sizeof(**fences), GFP_KERNEL); One too many * (=> sizeof(struct fence), not sizeof(struct fence *)) return kmemdup(&fence, sizeof(fence), GFP_KERNEL); The documentation should emphasize that the fences in the returned array have a "borrowed" reference (i.e. it does not return a new reference to each fence). -Chris
On Thu, Jun 23, 2016 at 12:29:48PM -0300, Gustavo Padovan wrote: > From: Gustavo Padovan <gustavo.padovan@collabora.co.uk> > > get_fences() should return a copy of all fences in the fence as some > fence subclass (such as fence_array) can store more than one fence at > time. > > Signed-off-by: Gustavo Padovan <gustavo.padovan@collabora.co.uk> > --- > drivers/dma-buf/fence.c | 14 ++++++++++++++ > include/linux/fence.h | 3 +++ > 2 files changed, 17 insertions(+) > > diff --git a/drivers/dma-buf/fence.c b/drivers/dma-buf/fence.c > index 4e61afb..f4094fd 100644 > --- a/drivers/dma-buf/fence.c > +++ b/drivers/dma-buf/fence.c > @@ -185,6 +185,20 @@ void fence_release(struct kref *kref) > } > EXPORT_SYMBOL(fence_release); > kerneldoc missing. -Daniel > +struct fence **fence_get_fences(struct fence *fence) > +{ > + if (fence->ops->get_fences) { > + return fence->ops->get_fences(fence); > + } else { > + struct fence **fences = kmalloc(sizeof(**fences), GFP_KERNEL); > + if (!fences) > + return NULL; > + fences[0] = fence; > + return fences; > + } > +} > +EXPORT_SYMBOL(fence_get_fences); > + > void fence_teardown(struct fence *fence) > { > if (fence->ops->teardown) > diff --git a/include/linux/fence.h b/include/linux/fence.h > index 1d3b671..a7a2fbc 100644 > --- a/include/linux/fence.h > +++ b/include/linux/fence.h > @@ -111,6 +111,7 @@ struct fence_cb { > * struct fence_ops - operations implemented for fence > * @get_driver_name: returns the driver name. > * @get_timeline_name: return the name of the context this fence belongs to. > + * @get_fences: return an array with a copy of all fences in the fence. > * @enable_signaling: enable software signaling of fence. > * @signaled: [optional] peek whether the fence is signaled, can be null. > * @wait: custom wait implementation, or fence_default_wait. > @@ -175,6 +176,7 @@ struct fence_cb { > struct fence_ops { > const char * (*get_driver_name)(struct fence *fence); > const char * (*get_timeline_name)(struct fence *fence); > + struct fence ** (*get_fences)(struct fence *fence); > bool (*enable_signaling)(struct fence *fence); > bool (*signaled)(struct fence *fence); > signed long (*wait)(struct fence *fence, bool intr, signed long timeout); > @@ -189,6 +191,7 @@ struct fence_ops { > void fence_init(struct fence *fence, const struct fence_ops *ops, > spinlock_t *lock, u64 context, unsigned seqno); > > +struct fence **fence_get_fences(struct fence *fence); > void fence_release(struct kref *kref); > void fence_teardown(struct fence *fence); > void fence_free(struct fence *fence); > -- > 2.5.5 >
diff --git a/drivers/dma-buf/fence.c b/drivers/dma-buf/fence.c index 4e61afb..f4094fd 100644 --- a/drivers/dma-buf/fence.c +++ b/drivers/dma-buf/fence.c @@ -185,6 +185,20 @@ void fence_release(struct kref *kref) } EXPORT_SYMBOL(fence_release); +struct fence **fence_get_fences(struct fence *fence) +{ + if (fence->ops->get_fences) { + return fence->ops->get_fences(fence); + } else { + struct fence **fences = kmalloc(sizeof(**fences), GFP_KERNEL); + if (!fences) + return NULL; + fences[0] = fence; + return fences; + } +} +EXPORT_SYMBOL(fence_get_fences); + void fence_teardown(struct fence *fence) { if (fence->ops->teardown) diff --git a/include/linux/fence.h b/include/linux/fence.h index 1d3b671..a7a2fbc 100644 --- a/include/linux/fence.h +++ b/include/linux/fence.h @@ -111,6 +111,7 @@ struct fence_cb { * struct fence_ops - operations implemented for fence * @get_driver_name: returns the driver name. * @get_timeline_name: return the name of the context this fence belongs to. + * @get_fences: return an array with a copy of all fences in the fence. * @enable_signaling: enable software signaling of fence. * @signaled: [optional] peek whether the fence is signaled, can be null. * @wait: custom wait implementation, or fence_default_wait. @@ -175,6 +176,7 @@ struct fence_cb { struct fence_ops { const char * (*get_driver_name)(struct fence *fence); const char * (*get_timeline_name)(struct fence *fence); + struct fence ** (*get_fences)(struct fence *fence); bool (*enable_signaling)(struct fence *fence); bool (*signaled)(struct fence *fence); signed long (*wait)(struct fence *fence, bool intr, signed long timeout); @@ -189,6 +191,7 @@ struct fence_ops { void fence_init(struct fence *fence, const struct fence_ops *ops, spinlock_t *lock, u64 context, unsigned seqno); +struct fence **fence_get_fences(struct fence *fence); void fence_release(struct kref *kref); void fence_teardown(struct fence *fence); void fence_free(struct fence *fence);