From: Philipp Stanner <phasta@kernel.org>
To: "Sumit Semwal" <sumit.semwal@linaro.org>,
"Christian König" <christian.koenig@amd.com>,
"Philipp Stanner" <phasta@kernel.org>,
"Danilo Krummrich" <dakr@kernel.org>,
"Alice Ryhl" <aliceryhl@google.com>,
"Miguel Ojeda" <ojeda@kernel.org>,
"Boqun Feng" <boqun@kernel.org>, "Gary Guo" <gary@garyguo.net>,
"Björn Roy Baron" <bjorn3_gh@protonmail.com>,
"Benno Lossin" <lossin@kernel.org>,
"Andreas Hindborg" <a.hindborg@kernel.org>,
"Trevor Gross" <tmgross@umich.edu>,
"Daniel Almeida" <daniel.almeida@collabora.com>,
"Tamir Duberstein" <tamird@kernel.org>,
"Alexandre Courbot" <acourbot@nvidia.com>,
"Onur Özkan" <work@onurozkan.dev>,
"David Airlie" <airlied@gmail.com>,
"Simona Vetter" <simona@ffwll.ch>,
"Tvrtko Ursulin" <tvrtko.ursulin@igalia.com>
Cc: linux-kernel@vger.kernel.org, linux-media@vger.kernel.org,
dri-devel@lists.freedesktop.org, rust-for-linux@vger.kernel.org
Subject: [RFC PATCH v7 6/8] rust: DmaFence: Tell results in signaling callbacks
Date: Tue, 3 Nov 2026 16:31:36 +0100 [thread overview]
Message-ID: <20261103153138.1087330-8-phasta@kernel.org> (raw)
In-Reply-To: <20261103153138.1087330-2-phasta@kernel.org>
A FenceCallbackRegistration invokes the on_signal() trait functions
specified by the user.
These callbacks always get executed, even if the fence was signaled with
an error. The user must then be able to react accordingly.
Since the fence->error must only be set before a fence signals, and must
not change after it signaled, we better acquire it with the lock.
Change the on_signal() trait function so that the user always gets
passed the fence's actual state.
Signed-off-by: Philipp Stanner <phasta@kernel.org>
---
rust/kernel/dma_buf/dma_fence.rs | 28 +++++++++++++++++++++-------
1 file changed, 21 insertions(+), 7 deletions(-)
diff --git a/rust/kernel/dma_buf/dma_fence.rs b/rust/kernel/dma_buf/dma_fence.rs
index 71965b26e148..c8856dbed0a2 100644
--- a/rust/kernel/dma_buf/dma_fence.rs
+++ b/rust/kernel/dma_buf/dma_fence.rs
@@ -291,9 +291,12 @@ fn from(e: AllocError) -> Self {
/// }
///
/// impl FenceCallback for MyCallback {
-/// fn on_signal(&mut self) {
-/// pr_info!("Fence signaled!\n");
-/// // Handle fence completion
+/// fn on_signal(&mut self, status: Result) {
+/// if status.is_ok() {
+/// pr_info!("Fence signaled!\n");
+/// } else {
+/// pr_err!("Fence signaled with an error!\n");
+/// }
/// }
/// }
/// ```
@@ -308,7 +311,7 @@ pub trait FenceCallback: Send {
/// An implementation likely wants to inform itself (e.g., through a work item)
/// within this callback that the associated [`FenceCallbackRegistration`]
/// can now be dropped.
- fn on_signal(&mut self);
+ fn on_signal(&mut self, status: Result);
}
/// A callback registration on a fence.
@@ -395,11 +398,18 @@ pub unsafe fn new<'a>(
// embedded into a `FenceCallbackRegistration`.
let reg: *mut Self = unsafe { container_of!(ptr, Self, callback_foreign) };
+ // SAFETY: The lock is being held by the C backend.
+ let fence_result = match unsafe { (*reg).fence.status_locked() } {
+ FenceStatus::Signaled(result) => result,
+ // Can never happen.
+ FenceStatus::Unsignaled => Err(ENOENT),
+ };
+
// SAFETY: `reg` is a valid `Self` pointer.
//
// The backend ensures synchronisation so whoever holds the registration object cannot drop
// it while this code is running. See `FenceCallbackRegistration::drop`.
- unsafe { (*reg).callback.on_signal() };
+ unsafe { (*reg).callback.on_signal(fence_result) };
}
/// Returns a reference to the fence this callback is registered on.
@@ -678,8 +688,12 @@ struct DriverFenceData<'a, T: Send + Sync + FenceContextOps> {
/// struct CallbackData { }
///
/// impl FenceCallback for CallbackData {
-/// fn on_signal(&mut self) {
-/// pr_info!("DmaFence callback executed.\n");
+/// fn on_signal(&mut self, status: Result) {
+/// if status.is_ok() {
+/// pr_info!("DmaFence callback executed.\n");
+/// else {
+/// pr_err!("DmaFence callback executed, but fence has an error.\n");
+/// }
/// }
/// }
///
--
2.56.0
next prev parent reply other threads:[~2026-11-03 15:33 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-11-03 15:31 [RFC PATCH v7 0/8] rust: Add drm::JobQueue Philipp Stanner
2026-11-03 15:31 ` [RFC PATCH v7 1/8] rust: DmaFence: Implement Deref for FenceContext Philipp Stanner
2026-11-03 15:31 ` [RFC PATCH v7 2/8] rust: DmaFence: Add ID accessor for fctx Philipp Stanner
2026-11-03 15:31 ` [RFC PATCH v7 3/8] rust: DmaFence: Don't drop on signal Philipp Stanner
2026-11-03 15:31 ` [RFC PATCH v7 4/8] rust: DmaFence: Replace call_rcu() with synchronize_rcu() Philipp Stanner
2026-11-03 15:31 ` [RFC PATCH v7 5/8] rust: DmaFence: Replace is_signaled() with status() Philipp Stanner
2026-11-03 15:31 ` Philipp Stanner [this message]
2026-11-03 15:31 ` [RFC PATCH v7 7/8] rust: drm: Add JobQueue Philipp Stanner
2026-11-03 15:31 ` [RFC PATCH v7 8/8] samples: rust: Add JobQueue Tester Philipp Stanner
2026-11-03 22:27 ` Younes Akhouayri
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=20261103153138.1087330-8-phasta@kernel.org \
--to=phasta@kernel.org \
--cc=a.hindborg@kernel.org \
--cc=acourbot@nvidia.com \
--cc=airlied@gmail.com \
--cc=aliceryhl@google.com \
--cc=bjorn3_gh@protonmail.com \
--cc=boqun@kernel.org \
--cc=christian.koenig@amd.com \
--cc=dakr@kernel.org \
--cc=daniel.almeida@collabora.com \
--cc=dri-devel@lists.freedesktop.org \
--cc=gary@garyguo.net \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-media@vger.kernel.org \
--cc=lossin@kernel.org \
--cc=ojeda@kernel.org \
--cc=rust-for-linux@vger.kernel.org \
--cc=simona@ffwll.ch \
--cc=sumit.semwal@linaro.org \
--cc=tamird@kernel.org \
--cc=tmgross@umich.edu \
--cc=tvrtko.ursulin@igalia.com \
--cc=work@onurozkan.dev \
/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
all inboxes | Powered by JetHome®