From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755359AbcAOO6L (ORCPT ); Fri, 15 Jan 2016 09:58:11 -0500 Received: from mail-yk0-f180.google.com ([209.85.160.180]:33950 "EHLO mail-yk0-f180.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755260AbcAOO52 (ORCPT ); Fri, 15 Jan 2016 09:57:28 -0500 From: Gustavo Padovan To: Greg Kroah-Hartman Cc: linux-kernel@vger.kernel.org, devel@driverdev.osuosl.org, dri-devel@lists.freedesktop.org, daniels@collabora.com, =?UTF-8?q?Arve=20Hj=C3=B8nnev=C3=A5g?= , Riley Andrews , Daniel Vetter , Rob Clark , Greg Hackmann , John Harrison , Maarten Lankhorst , Gustavo Padovan Subject: [RFC 27/29] dma-buf/fence: add .cleanup() callback Date: Fri, 15 Jan 2016 12:55:37 -0200 Message-Id: <1452869739-3304-28-git-send-email-gustavo@padovan.org> X-Mailer: git-send-email 2.5.0 In-Reply-To: <1452869739-3304-1-git-send-email-gustavo@padovan.org> References: <1452869739-3304-1-git-send-email-gustavo@padovan.org> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Gustavo Padovan Called when the fence_timeline is destroyed so users can cleanup routines on fences. Signed-off-by: Gustavo Padovan --- drivers/dma-buf/fence.c | 24 ++++++++++++++++++++++++ include/linux/fence.h | 4 ++++ 2 files changed, 28 insertions(+) diff --git a/drivers/dma-buf/fence.c b/drivers/dma-buf/fence.c index 26f5f0f..3973b35 100644 --- a/drivers/dma-buf/fence.c +++ b/drivers/dma-buf/fence.c @@ -140,6 +140,9 @@ EXPORT_SYMBOL(fence_timeline_put); */ void fence_timeline_destroy(struct fence_timeline *timeline) { + unsigned long flags; + struct fence *fence, *next; + timeline->destroyed = true; /* * Ensure timeline is marked as destroyed before @@ -147,6 +150,15 @@ void fence_timeline_destroy(struct fence_timeline *timeline) */ smp_wmb(); + spin_lock_irqsave(&timeline->lock, flags); + list_for_each_entry_safe(fence, next, &timeline->active_list_head, + active_list) { + if (fence->ops->cleanup) + fence->ops->cleanup(fence, fence->priv); + list_del_init(&fence->active_list); + } + spin_unlock_irqrestore(&timeline->lock, flags); + fence_timeline_put(timeline); } EXPORT_SYMBOL(fence_timeline_destroy); @@ -839,3 +851,15 @@ fence_init(struct fence *fence, const struct fence_ops *ops, trace_fence_init(fence); } EXPORT_SYMBOL(fence_init); + +/** + * fence_add_user_data - add private user data + * @fence: [in] the fence to use + * @user_data: [in] the private data to store + * + * This function adds a private user data point to struct fence. + */ +void fence_add_user_data(struct fence *fence, void *user_data) +{ + fence->priv = user_data; +} diff --git a/include/linux/fence.h b/include/linux/fence.h index 32a26ab..59eabe3 100644 --- a/include/linux/fence.h +++ b/include/linux/fence.h @@ -116,6 +116,7 @@ struct fence { int status; struct list_head child_list; struct list_head active_list; + void *priv; }; enum fence_flag_bits { @@ -146,6 +147,7 @@ struct fence_cb { * @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. + * @cleanup: [optional] called when the timeline is destroyed * @release: [optional] called on destruction of fence, can be null * @fill_driver_data: [optional] callback to fill in free-form debug info * Returns amount of bytes filled, or -errno. @@ -205,6 +207,7 @@ struct fence_ops { bool (*enable_signaling)(struct fence *fence); bool (*signaled)(struct fence *fence); signed long (*wait)(struct fence *fence, bool intr, signed long timeout); + void (*cleanup)(struct fence *fence, void *user_data); void (*release)(struct fence *fence); int (*fill_driver_data)(struct fence *fence, void *data, int size); @@ -217,6 +220,7 @@ struct fence *fence_create_on_timeline(struct fence_timeline *obj, unsigned int value); void fence_init(struct fence *fence, const struct fence_ops *ops, spinlock_t *lock, unsigned context, unsigned seqno); +void fence_add_user_data(struct fence *fence, void *user_data); void fence_release(struct kref *kref); void fence_free(struct fence *fence); -- 2.5.0