From: "Christian König" <christian.koenig@amd.com>
To: Philipp Stanner <phasta@kernel.org>,
Sumit Semwal <sumit.semwal@linaro.org>,
Yury Norov <yury.norov@gmail.com>,
Rasmus Villemoes <linux@rasmusvillemoes.dk>,
Arnd Bergmann <arnd@arndb.de>,
Tvrtko Ursulin <tvrtko.ursulin@igalia.com>,
Danilo Krummrich <dakr@kernel.org>, Gary Guo <gary@garyguo.net>,
"Paul E . McKenney" <paulmck@kernel.org>
Cc: linux-media@vger.kernel.org, dri-devel@lists.freedesktop.org,
linux-kernel@vger.kernel.org, linux-arch@vger.kernel.org
Subject: Re: [PATCH 2/2] dma-buf/dma-fence: Order setting of the signaled-bit properly
Date: Wed, 21 Oct 2026 15:47:28 +0200 [thread overview]
Message-ID: <ae7ae97d-cac9-451d-a0d4-bd52d0f063d4@amd.com> (raw)
In-Reply-To: <20261021095512.1345191-4-phasta@kernel.org>
On 10/21/26 11:55, Philipp Stanner wrote:
> dma_fence_is_signaled() can return true *while* the fence is still
> signaling. This is fragile and has been involved in at least two bugs:
>
> commit c8a5d5ea3ba6 ("nouveau: fix client work fence deletion race")
> commit 7c703a7d3f2b ("drm/amdgpu: Fix one use-after-free of VM")
>
> The signaled-bit is set under lock-protection but read without it.
> Adding the lock has been rejected on the grounds of the lock-acquisition
> shooting down cache lines of parties that merely want to check whether
> the fence is already signaled.
>
> Make sure the bit can only become visible as 1 once the callbacks have
> ran. To achieve this, read the bit with test_bit_acquire() and set it
> with set_bit_release().
That has been suggested and rejected before.
Background is that the signaling bit must be visible before the callbacks are run or things like dma_fence_default_wait() (as an example) just break.
Regards,
Christian.
>
> Signed-off-by: Philipp Stanner <phasta@kernel.org>
> ---
> drivers/dma-buf/dma-fence.c | 11 +++++++++--
> include/linux/dma-fence.h | 6 +++++-
> 2 files changed, 14 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/dma-buf/dma-fence.c b/drivers/dma-buf/dma-fence.c
> index bd58688b81a7..07d499fa35ac 100644
> --- a/drivers/dma-buf/dma-fence.c
> +++ b/drivers/dma-buf/dma-fence.c
> @@ -359,8 +359,7 @@ void dma_fence_signal_timestamp_locked(struct dma_fence *fence,
>
> dma_fence_assert_held(fence);
>
> - if (unlikely(test_and_set_bit(DMA_FENCE_FLAG_SIGNALED_BIT,
> - &fence->flags)))
> + if (unlikely(dma_fence_test_signaled_flag(fence)))
> return;
>
> trace_dma_fence_signaled(fence);
> @@ -384,6 +383,14 @@ void dma_fence_signal_timestamp_locked(struct dma_fence *fence,
> INIT_LIST_HEAD(&cur->node);
> cur->func(fence, cur);
> }
> +
> + /*
> + * This orders the signaled-state with the test_bit_acquire() in
> + * dma_fence_test_signaled_flag(). This ensures that functions like
> + * dma_fence_is_signaled() can only ever return true once signaling is
> + * completed (i.e., after the callbacks above ran).
> + */
> + set_bit_release(DMA_FENCE_FLAG_SIGNALED_BIT, &fence->flags);
> }
> EXPORT_SYMBOL(dma_fence_signal_timestamp_locked);
>
> diff --git a/include/linux/dma-fence.h b/include/linux/dma-fence.h
> index dd07d128adc3..61522027af41 100644
> --- a/include/linux/dma-fence.h
> +++ b/include/linux/dma-fence.h
> @@ -496,7 +496,11 @@ const char __rcu *dma_fence_timeline_name(struct dma_fence *fence);
> static inline bool
> dma_fence_test_signaled_flag(struct dma_fence *fence)
> {
> - return test_bit(DMA_FENCE_FLAG_SIGNALED_BIT, &fence->flags);
> + /*
> + * The counterpart of this ordered operation can be found in
> + * dma_fence_signal_timestamp_locked().
> + */
> + return test_bit_acquire(DMA_FENCE_FLAG_SIGNALED_BIT, &fence->flags);
> }
>
> /**
next prev parent reply other threads:[~2026-10-21 13:47 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-21 9:55 [PATCH 0/2] dma-fence: Order is-signaled-bit Philipp Stanner
2026-10-21 9:55 ` [PATCH 1/2] asm-generic/bitops: Add set_bit_release() Philipp Stanner
2026-10-21 10:06 ` sashiko-bot
2026-10-21 11:33 ` Arnd Bergmann
2026-10-21 11:54 ` Gary Guo
2026-10-21 12:15 ` Arnd Bergmann
2026-10-21 12:06 ` Gary Guo
2026-10-21 12:17 ` Philipp Stanner
2026-10-21 12:24 ` Gary Guo
2026-10-21 13:22 ` Philipp Stanner
2026-10-21 9:55 ` [PATCH 2/2] dma-buf/dma-fence: Order setting of the signaled-bit properly Philipp Stanner
2026-10-21 10:16 ` sashiko-bot
2026-10-21 13:47 ` Christian König [this message]
2026-10-21 14:52 ` Philipp Stanner
2026-10-21 15:04 ` Christian König
2026-10-26 1:34 ` kernel test robot
2026-10-26 7:48 ` kernel test robot
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=ae7ae97d-cac9-451d-a0d4-bd52d0f063d4@amd.com \
--to=christian.koenig@amd.com \
--cc=arnd@arndb.de \
--cc=dakr@kernel.org \
--cc=dri-devel@lists.freedesktop.org \
--cc=gary@garyguo.net \
--cc=linux-arch@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-media@vger.kernel.org \
--cc=linux@rasmusvillemoes.dk \
--cc=paulmck@kernel.org \
--cc=phasta@kernel.org \
--cc=sumit.semwal@linaro.org \
--cc=tvrtko.ursulin@igalia.com \
--cc=yury.norov@gmail.com \
/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.