[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20160623212724.GD1086@nuc-i3427.alporthouse.com>
Date: Thu, 23 Jun 2016 22:27:24 +0100
From: Chris Wilson <chris@...is-wilson.co.uk>
To: Gustavo Padovan <gustavo@...ovan.org>
Cc: dri-devel@...ts.freedesktop.org, marcheu@...gle.com,
Daniel Stone <daniels@...labora.com>, seanpaul@...gle.com,
Daniel Vetter <daniel.vetter@...ll.ch>,
linux-kernel@...r.kernel.org, laurent.pinchart@...asonboard.com,
Gustavo Padovan <gustavo.padovan@...labora.co.uk>,
John Harrison <John.C.Harrison@...el.com>, m.chehab@...sung.com
Subject: Re: [RFC 5/5] dma-buf/sync_file: rework fence storage in struct file
On Thu, Jun 23, 2016 at 12:29:50PM -0300, Gustavo Padovan wrote:
> -static void sync_file_add_pt(struct sync_file *sync_file, int *i,
> +static int sync_file_set_fence(struct sync_file *sync_file,
> + struct fence **fences)
> +{
> + struct fence_array *array;
> +
> + if (sync_file->num_fences == 1) {
> + sync_file->fence = fences[0];
Straightforward pointer assignment.
> + } else {
> + array = fence_array_create(sync_file->num_fences, fences,
> + fence_context_alloc(1), 1, false);
> + if (!array)
> + return -ENOMEM;
> +
> + sync_file->fence = &array->base;
New reference.
Imbalance will promptly go bang after we release the single fence[0].
Would fence_array_create(1, fence) returning fence_get(fence) be too
much of a hack?
I would suggest dropping the exported fence_get_fences() and use a local
instead that could avoid the copy, e.g.
static struct fence *get_fences(struct fence **fence,
unsigned int *num_fences)
{
if (fence_is_array(*fence)) {
struct fence_array *array = to_fence_array(*fence);
*num_fences = array->num_fences;
return array->fences;
} else {
*num_fences = 1;
return fence;
}
}
sync_file_merge() {
int num_fences, num_a_fences, num_b_fences;
struct fence **fences, **a_fences, **b_fences;
a_fences = get_fences(&a, &num_a_fences);
b_fences = get_fences(&b, &num_b_fences);
num_fences = num_a_fences + num_b_fences;
> static void sync_file_free(struct kref *kref)
> {
> struct sync_file *sync_file = container_of(kref, struct sync_file,
> kref);
> - int i;
> -
> - for (i = 0; i < sync_file->num_fences; ++i) {
> - fence_remove_callback(sync_file->cbs[i].fence,
> - &sync_file->cbs[i].cb);
> - fence_put(sync_file->cbs[i].fence);
> - }
>
> + fence_remove_callback(sync_file->fence, &sync_file->cb);
> + fence_teardown(sync_file->fence);
Hmm. Could we detect the removal of the last callback and propagate that
to the fence_array? (Rather then introduce a manual call to
fence_teardown.)
--
Chris Wilson, Intel Open Source Technology Centre
Powered by blists - more mailing lists