From: Boris Brezillon <boris.brezillon@collabora.com>
To: "Christian König" <ckoenig.leichtzumerken@gmail.com>
Cc: olvaffe@gmail.com, maarten.lankhorst@linux.intel.com,
mripard@kernel.org, tzimmermann@suse.de,
lionel.g.landwerlin@intel.com, dri-devel@lists.freedesktop.org,
faith.ekstrand@collabora.com, simona@ffwll.ch
Subject: Re: [PATCH] dma-buf: fix dma_fence_array_signaled
Date: Fri, 8 Nov 2024 15:54:44 +0100 [thread overview]
Message-ID: <20241108155444.3b5c3e52@collabora.com> (raw)
In-Reply-To: <20241108094256.3717-2-christian.koenig@amd.com>
On Fri, 8 Nov 2024 10:42:56 +0100
"Christian König" <ckoenig.leichtzumerken@gmail.com> wrote:
> The function silently assumed that signaling was already enabled for the
> dma_fence_array. This meant that without enabling signaling first we would
> never see forward progress.
>
> Fix that by falling back to testing each individual fence when signaling
> isn't enabled yet.
>
> Signed-off-by: Christian König <christian.koenig@amd.com>
> ---
> drivers/dma-buf/dma-fence-array.c | 14 +++++++++++++-
> 1 file changed, 13 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/dma-buf/dma-fence-array.c b/drivers/dma-buf/dma-fence-array.c
> index 46ac42bcfac0..01203796827a 100644
> --- a/drivers/dma-buf/dma-fence-array.c
> +++ b/drivers/dma-buf/dma-fence-array.c
> @@ -103,10 +103,22 @@ static bool dma_fence_array_enable_signaling(struct dma_fence *fence)
> static bool dma_fence_array_signaled(struct dma_fence *fence)
> {
> struct dma_fence_array *array = to_dma_fence_array(fence);
> + unsigned int i, num_pending;
>
> - if (atomic_read(&array->num_pending) > 0)
> + num_pending = atomic_read(&array->num_pending);
> + if (test_bit(DMA_FENCE_FLAG_ENABLE_SIGNAL_BIT, &array->base.flags)) {
> + if (!num_pending)
> + goto signal;
> return false;
> + }
> +
> + for (i = 0; i < array->num_fences; ++i) {
> + if (dma_fence_is_signaled(array->fences[i]) && !--num_pending)
> + goto signal;
> + }
> + return false;
>
> +signal:
> dma_fence_array_clear_pending_error(array);
> return true;
> }
It would be good to have comments explaining what happens here. I think
I figured it out, but it's far from obvious:
- we need to read array->num_pending before checking the enable_signal
bit to avoid racing with the enable_signaling() implementation,
which might decrement the counter, and cause a partial check.
- the !--num_pending is here to account for the any_signaled case
- if we race with enable_signaling(), that means the !num_pending
check in the is_signalling_enabled branch might be outdated
(num_pending might have been decremented), but that's fine. The user
will get the right value when testing again later
With this explained in comments, the patch is
`Reviewed-by: Boris Brezillon <boris.brezillon@collabora.com>`
next prev parent reply other threads:[~2024-11-08 14:54 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-11-08 9:42 Ensure progress for dma_fence_array Christian König
2024-11-08 9:42 ` [PATCH] dma-buf: fix dma_fence_array_signaled Christian König
2024-11-08 13:01 ` Tvrtko Ursulin
2024-11-08 14:18 ` Christian König
2024-11-08 15:03 ` Boris Brezillon
2024-11-08 15:52 ` Tvrtko Ursulin
2024-11-12 12:16 ` Christian König
2024-11-08 14:54 ` Boris Brezillon [this message]
2024-11-09 0:32 ` Ensure progress for dma_fence_array Chia-I Wu
2024-11-12 12:00 ` Christian König
2024-11-12 21:10 ` Chia-I Wu
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20241108155444.3b5c3e52@collabora.com \
--to=boris.brezillon@collabora.com \
--cc=ckoenig.leichtzumerken@gmail.com \
--cc=dri-devel@lists.freedesktop.org \
--cc=faith.ekstrand@collabora.com \
--cc=lionel.g.landwerlin@intel.com \
--cc=maarten.lankhorst@linux.intel.com \
--cc=mripard@kernel.org \
--cc=olvaffe@gmail.com \
--cc=simona@ffwll.ch \
--cc=tzimmermann@suse.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.