From: Philipp Stanner <phasta@kernel.org>
To: "Min Ma" <mamin506@gmail.com>, "Lizhi Hou" <lizhi.hou@amd.com>,
"Oded Gabbay" <ogabbay@kernel.org>,
"Rob Herring (Arm)" <robh@kernel.org>,
"Tomeu Vizoso" <tomeu@tomeuvizoso.net>,
"Karol Wachowski" <karol.wachowski@linux.intel.com>,
"Andrzej Kacprowski" <andrzej.kacprowski@linux.intel.com>,
"Sumit Semwal" <sumit.semwal@linaro.org>,
"Christian König" <christian.koenig@amd.com>,
"Felix Kuehling" <Felix.Kuehling@amd.com>,
"Alex Deucher" <alexander.deucher@amd.com>,
"David Airlie" <airlied@gmail.com>,
"Simona Vetter" <simona@ffwll.ch>,
"Maarten Lankhorst" <maarten.lankhorst@linux.intel.com>,
"Maxime Ripard" <mripard@kernel.org>,
"Thomas Zimmermann" <tzimmermann@suse.de>,
"Lucas Stach" <l.stach@pengutronix.de>,
"Russell King" <linux+etnaviv@armlinux.org.uk>,
"Christian Gmeiner" <christian.gmeiner@gmail.com>,
"Jani Nikula" <jani.nikula@linux.intel.com>,
"Joonas Lahtinen" <joonas.lahtinen@linux.intel.com>,
"Rodrigo Vivi" <rodrigo.vivi@intel.com>,
"Tvrtko Ursulin" <tursulin@ursulin.net>,
"Alessio Belle" <alessio.belle@imgtec.com>,
"Luigi Santivetti" <luigi.santivetti@imgtec.com>,
"Qiang Yu" <yuq825@gmail.com>,
"Rob Clark" <robin.clark@oss.qualcomm.com>,
"Dmitry Baryshkov" <lumag@kernel.org>,
"Abhinav Kumar" <abhinav.kumar@linux.dev>,
"Jessica Zhang" <jesszhan0024@gmail.com>,
"Sean Paul" <sean@poorly.run>,
"Marijn Suijten" <marijn.suijten@somainline.org>,
"Lyude Paul" <lyude@redhat.com>,
"Danilo Krummrich" <dakr@kernel.org>,
"Boris Brezillon" <boris.brezillon@collabora.com>,
"Steven Price" <steven.price@arm.com>,
"Adrián Larumbe" <adrian.larumbe@collabora.com>,
"Liviu Dudau" <liviu.dudau@arm.com>,
"Dave Airlie" <airlied@redhat.com>,
"Gerd Hoffmann" <kraxel@redhat.com>,
"Matthew Brost" <matthew.brost@intel.com>,
"Philipp Stanner" <phasta@kernel.org>,
"Natalie Vock" <nat@pixelcluster.dev>,
"Arun Pravin" <arunpravin.paneerselvam@amd.com>,
"Matthew Auld" <matthew.auld@intel.com>,
"Thomas Hellström" <thomas.hellstrom@linux.intel.com>,
"Melissa Wen" <mwen@igalia.com>,
"Maíra Canal" <mcanal@igalia.com>,
"Dave Stevenson" <dave.stevenson@raspberrypi.com>,
"Raspberry Pi Kernel Maintenance" <kernel-list@raspberrypi.com>,
"Dmitry Osipenko" <dmitry.osipenko@collabora.com>,
"Gurchetan Singh" <gurchetansingh@chromium.org>,
"Chia-I Wu" <olvaffe@gmail.com>,
"Zack Rusin" <zack.rusin@broadcom.com>,
"Broadcom internal kernel review list"
<bcm-kernel-feedback-list@broadcom.com>,
"Thierry Reding" <thierry.reding@kernel.org>,
"Mikko Perttunen" <mperttunen@nvidia.com>,
"Jonathan Cameron" <jic23@kernel.org>,
"David Lechner" <dlechner@baylibre.com>,
"Nuno Sá" <nuno.sa@analog.com>,
"Andy Shevchenko" <andy@kernel.org>,
"Greg Kroah-Hartman" <gregkh@linuxfoundation.org>,
"Sunil Khatri" <sunil.khatri@amd.com>,
"Kees Cook" <kees@kernel.org>,
"Jesse Zhang" <jesse.zhang@amd.com>,
"Timur Kristóf" <timur.kristof@gmail.com>,
"Srinivasan Shanmugam" <srinivasan.shanmugam@amd.com>,
"Kexin Sun" <kexinsun@smail.nju.edu.cn>,
"Prike Liang" <Prike.Liang@amd.com>,
"David Rosca" <david.rosca@amd.com>,
"Krzysztof Karas" <krzysztof.karas@intel.com>,
"Marco Crivellari" <marco.crivellari@suse.com>,
"Shixiong Ou" <oushixiong@kylinos.cn>,
"Jouni Högander" <jouni.hogander@intel.com>,
"Thadeu Lima de Souza Cascardo" <cascardo@igalia.com>,
"Pierre-Eric Pelloux-Prayer" <pierre-eric.pelloux-prayer@amd.com>,
"Joel Fernandes" <joelagnelf@nvidia.com>,
"Al Viro" <viro@zeniv.linux.org.uk>,
"Neill Kapron" <nkapron@google.com>,
"Michael Bommarito" <michael.bommarito@gmail.com>,
"Sam Day" <me@samcday.com>,
"Gabriel Prostitis" <prostitisgabriel@gmail.com>
Cc: dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org,
linux-media@vger.kernel.org, amd-gfx@lists.freedesktop.org,
etnaviv@lists.freedesktop.org, intel-gfx@lists.freedesktop.org,
imagination@lists.freedesktop.org, lima@lists.freedesktop.org,
linux-arm-msm@vger.kernel.org, freedreno@lists.freedesktop.org,
nouveau@lists.freedesktop.org, virtualization@lists.linux.dev,
spice-devel@lists.freedesktop.org,
intel-xe@lists.freedesktop.org, linux-tegra@vger.kernel.org,
linux-iio@vger.kernel.org, linux-usb@vger.kernel.org
Subject: [RFC PATCH 5/6] dma-buf: dma-fence: Close race in dma_fence_is_signaled() by default
Date: Thu, 29 Oct 2026 10:55:42 +0100 [thread overview]
Message-ID: <20261029095542.1526750-8-phasta@kernel.org> (raw)
In-Reply-To: <20261029095542.1526750-3-phasta@kernel.org>
dma_fence_is_signaled() contains a lockless check of the signaled-bit,
which is set under lock protection. This is a race condition which makes
the API fragile and has caused at least two bugs already, addressed in:
commit c8a5d5ea3ba6 ("nouveau: fix client work fence deletion race")
commit 7c703a7d3f2b ("drm/amdgpu: Fix one use-after-free of VM")
It has been argued by some that this race cannot be closed for the
entire kernel through locking because this would lead to a cache line
invalidation for all parties reading that fence. While it remains
unclear why these parties don't simply let themselves be notified about
the fence being signaled instead of checking this repeatedly manually,
there is a way to preserve this behavior in any case:
This patch adds a new flag for dma_fence_init(),
DMA_FENCE_INIT_FLAG_RACY_SIGNALED_CHECK. If this flag is not set, the
spinlock is taken and dma_fence_is_signaled() becomes perfectly
synchronized: it can only return true once signaling of the fence is
completed.
Disable the racy check for everyone by default. Should some parties
really experience severe performance degredations because of this, they
can trivially re-enable the race condition for their driver by setting
the flag in dma_fence_init().
Signed-off-by: Philipp Stanner <phasta@kernel.org>
---
drivers/dma-buf/dma-fence.c | 2 ++
include/linux/dma-fence.h | 22 ++++++++++++++++++++++
2 files changed, 24 insertions(+)
diff --git a/drivers/dma-buf/dma-fence.c b/drivers/dma-buf/dma-fence.c
index f7c084926ae6..1ae8c7aade39 100644
--- a/drivers/dma-buf/dma-fence.c
+++ b/drivers/dma-buf/dma-fence.c
@@ -1119,6 +1119,8 @@ dma_fence_init(struct dma_fence *fence, const struct dma_fence_ops *ops,
/* Mapp the init_flags to the fence-internal flags. */
if (test_bit(DMA_FENCE_INIT_FLAG_SEQNO64, &init_flags))
set_bit(DMA_FENCE_FLAG_SEQNO64_BIT, &fence_flag_bits);
+ if (test_bit(DMA_FENCE_INIT_FLAG_RACY_SIGNALED_CHECK, &init_flags))
+ set_bit(DMA_FENCE_FLAG_RACY_SIGNALED_CHECK_BIT, &fence_flag_bits);
__dma_fence_init(fence, ops, lock, context, seqno, fence_flag_bits);
}
diff --git a/include/linux/dma-fence.h b/include/linux/dma-fence.h
index 52e7ddfd2d06..ee6e8de3ebc6 100644
--- a/include/linux/dma-fence.h
+++ b/include/linux/dma-fence.h
@@ -115,6 +115,7 @@ enum dma_fence_flag_bits {
DMA_FENCE_FLAG_SIGNALED_BIT,
DMA_FENCE_FLAG_TIMESTAMP_BIT,
DMA_FENCE_FLAG_ENABLE_SIGNAL_BIT,
+ DMA_FENCE_FLAG_RACY_SIGNALED_CHECK_BIT,
DMA_FENCE_FLAG_USER_BITS, /* must always be last member */
};
@@ -124,9 +125,12 @@ enum dma_fence_flag_bits {
* These flags can be passed in dma_fence_init().
*
* @DMA_FENCE_INIT_FLAG_SEQNO64: Use 64-bit sequence numbers.
+ * @DMA_FENCE_INIT_FLAG_RACY_SIGNALED_CHECK:
+ * Legacy flag. Enables a race condition in dma_fence_is_signaled().
*/
enum dma_fence_init_flags {
DMA_FENCE_INIT_FLAG_SEQNO64,
+ DMA_FENCE_INIT_FLAG_RACY_SIGNALED_CHECK,
/* Must always be last member. */
DMA_FENCE_INIT_FLAG_NR_OF_FLAGs,
@@ -568,9 +572,27 @@ dma_fence_is_signaled_locked(struct dma_fence *fence)
static inline bool
dma_fence_is_signaled(struct dma_fence *fence)
{
+ const bool racy_check = test_bit(DMA_FENCE_FLAG_RACY_SIGNALED_CHECK_BIT,
+ &fence->flags);
const struct dma_fence_ops *ops;
+ bool signaled = false;
+ unsigned long flags;
+ /*
+ * For legacy reasons, there is a race window here against parties
+ * signaling the fence. They might still be doing that right now.
+ *
+ * For most users, this window shall be closed, but there are parties
+ * for whom the cache-line invalidation by taking the lock might be so
+ * significant that they prefer to accept the race at their own risk.
+ */
+ if (!racy_check)
+ dma_fence_lock_irqsave(fence, flags);
if (dma_fence_test_signaled_flag(fence))
+ signaled = true;
+ if (!racy_check)
+ dma_fence_unlock_irqrestore(fence, flags);
+ if (signaled)
return true;
rcu_read_lock();
--
2.56.0
next prev parent reply other threads:[~2026-10-29 10:00 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-29 9:55 [RFC PATCH 0/6] dma-buf: Phase out is_signaled() race Philipp Stanner
2026-10-29 9:55 ` [RFC PATCH 1/6] dma-buf: dma-fence: Add flags parameter to dma_fence_init() Philipp Stanner
2026-10-29 13:38 ` Christian König
2026-10-29 9:55 ` [RFC PATCH 2/6] dma-buf: dma-fence: Add flag for using 64-bit seqnos Philipp Stanner
2026-10-29 9:55 ` [RFC PATCH 3/6] dma-buf: Port users of dma_fence_init64() Philipp Stanner
2026-10-29 9:55 ` [RFC PATCH 4/6] dma-buf: dma-fence: remove dma_fence_init64() Philipp Stanner
2026-10-29 9:55 ` Philipp Stanner [this message]
2026-10-29 9:55 ` [RFC PATCH 6/6] drm/nouveau: Remove hacky fence check Philipp Stanner
2026-10-29 10:23 ` [RFC PATCH 0/6] dma-buf: Phase out is_signaled() race Lucas Stach
2026-10-29 10:28 ` Philipp Stanner
2026-10-29 11:23 ` Lucas Stach
2026-10-29 13:43 ` Christian König
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=20261029095542.1526750-8-phasta@kernel.org \
--to=phasta@kernel.org \
--cc=Felix.Kuehling@amd.com \
--cc=Prike.Liang@amd.com \
--cc=abhinav.kumar@linux.dev \
--cc=adrian.larumbe@collabora.com \
--cc=airlied@gmail.com \
--cc=airlied@redhat.com \
--cc=alessio.belle@imgtec.com \
--cc=alexander.deucher@amd.com \
--cc=amd-gfx@lists.freedesktop.org \
--cc=andrzej.kacprowski@linux.intel.com \
--cc=andy@kernel.org \
--cc=arunpravin.paneerselvam@amd.com \
--cc=bcm-kernel-feedback-list@broadcom.com \
--cc=boris.brezillon@collabora.com \
--cc=cascardo@igalia.com \
--cc=christian.gmeiner@gmail.com \
--cc=christian.koenig@amd.com \
--cc=dakr@kernel.org \
--cc=dave.stevenson@raspberrypi.com \
--cc=david.rosca@amd.com \
--cc=dlechner@baylibre.com \
--cc=dmitry.osipenko@collabora.com \
--cc=dri-devel@lists.freedesktop.org \
--cc=etnaviv@lists.freedesktop.org \
--cc=freedreno@lists.freedesktop.org \
--cc=gregkh@linuxfoundation.org \
--cc=gurchetansingh@chromium.org \
--cc=imagination@lists.freedesktop.org \
--cc=intel-gfx@lists.freedesktop.org \
--cc=intel-xe@lists.freedesktop.org \
--cc=jani.nikula@linux.intel.com \
--cc=jesse.zhang@amd.com \
--cc=jesszhan0024@gmail.com \
--cc=jic23@kernel.org \
--cc=joelagnelf@nvidia.com \
--cc=joonas.lahtinen@linux.intel.com \
--cc=jouni.hogander@intel.com \
--cc=karol.wachowski@linux.intel.com \
--cc=kees@kernel.org \
--cc=kernel-list@raspberrypi.com \
--cc=kexinsun@smail.nju.edu.cn \
--cc=kraxel@redhat.com \
--cc=krzysztof.karas@intel.com \
--cc=l.stach@pengutronix.de \
--cc=lima@lists.freedesktop.org \
--cc=linux+etnaviv@armlinux.org.uk \
--cc=linux-arm-msm@vger.kernel.org \
--cc=linux-iio@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-media@vger.kernel.org \
--cc=linux-tegra@vger.kernel.org \
--cc=linux-usb@vger.kernel.org \
--cc=liviu.dudau@arm.com \
--cc=lizhi.hou@amd.com \
--cc=luigi.santivetti@imgtec.com \
--cc=lumag@kernel.org \
--cc=lyude@redhat.com \
--cc=maarten.lankhorst@linux.intel.com \
--cc=mamin506@gmail.com \
--cc=marco.crivellari@suse.com \
--cc=marijn.suijten@somainline.org \
--cc=matthew.auld@intel.com \
--cc=matthew.brost@intel.com \
--cc=mcanal@igalia.com \
--cc=me@samcday.com \
--cc=michael.bommarito@gmail.com \
--cc=mperttunen@nvidia.com \
--cc=mripard@kernel.org \
--cc=mwen@igalia.com \
--cc=nat@pixelcluster.dev \
--cc=nkapron@google.com \
--cc=nouveau@lists.freedesktop.org \
--cc=nuno.sa@analog.com \
--cc=ogabbay@kernel.org \
--cc=olvaffe@gmail.com \
--cc=oushixiong@kylinos.cn \
--cc=pierre-eric.pelloux-prayer@amd.com \
--cc=prostitisgabriel@gmail.com \
--cc=robh@kernel.org \
--cc=robin.clark@oss.qualcomm.com \
--cc=rodrigo.vivi@intel.com \
--cc=sean@poorly.run \
--cc=simona@ffwll.ch \
--cc=spice-devel@lists.freedesktop.org \
--cc=srinivasan.shanmugam@amd.com \
--cc=steven.price@arm.com \
--cc=sumit.semwal@linaro.org \
--cc=sunil.khatri@amd.com \
--cc=thierry.reding@kernel.org \
--cc=thomas.hellstrom@linux.intel.com \
--cc=timur.kristof@gmail.com \
--cc=tomeu@tomeuvizoso.net \
--cc=tursulin@ursulin.net \
--cc=tzimmermann@suse.de \
--cc=viro@zeniv.linux.org.uk \
--cc=virtualization@lists.linux.dev \
--cc=yuq825@gmail.com \
--cc=zack.rusin@broadcom.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox