All of lore.kernel.org
 help / color / mirror / Atom feed
From: sashiko-bot@kernel.org
To: "Philipp Stanner" <phasta@kernel.org>
Cc: dri-devel@lists.freedesktop.org, gary@garyguo.net,
	ojeda@kernel.org, media-ci@linuxtv.org
Subject: Re: [RFC PATCH v5 4/6] rust: DmaFence: [RFC] Add Signaler
Date: Fri, 09 Oct 2026 19:23:49 +0000	[thread overview]
Message-ID: <sashiko-outbox-165997@kernel.org> (raw)
In-Reply-To: <20261009191124.1022902-6-phasta@kernel.org>

Thank you for your contribution! Sashiko AI review found 2 potential issue(s) to consider:
- [High] dma_fence: counter leak in FenceSignaler::signal causes panic on drop
- [Low] rust: missing inline annotations on small forwarding functions in abstraction crate
--

commit 31b644dae0c3cdaaa05c7d23cd49d1e5209e51c7
Author: Philipp Stanner <phasta@kernel.org>

rust: DmaFence: [RFC] Add Signaler

This commit introduces a FenceSignaler type that allows signaling an
associated DriverFence independently of the locked data structure it
resides in.

> diff --git a/rust/kernel/dma_buf/dma_fence.rs b/rust/kernel/dma_buf/dma_fence.rs
> index b67121c7abd41..4e9b4a6a9471b 100644
> --- a/rust/kernel/dma_buf/dma_fence.rs
> +++ b/rust/kernel/dma_buf/dma_fence.rs
> @@ -590,6 +590,45 @@ unsafe fn dec_ref(ptr: NonNull<Self>) {
>      }
>  }
>  
> +/// An object that can signal an associated [`DriverFence`], independently of
> +/// that one's lifetime.
> +///
> +/// Use with great caucion! Only the producer of a fence should ever be able to
> +/// signal it.
> +///
> +/// This helper is necessary to signal DriverFences that are hidden behind locks
> +/// which cannot be taken in certain situations.
> +pub struct FenceSignaler {
> +    fence: ARef<Fence>,
> +}
> +
> +impl FenceSignaler {
> +    /// Signal the associated [`DriverFence`].
> +    pub fn signal(&self, res: Result) {
> +        let fence = self.fence.lock();
> +
> +        // SAFETY: `fence` is valid because `self` is valid. The lock must be
> +        // held, which we acquired directly above.
> +        if !unsafe { bindings::dma_fence_test_signaled_flag(fence.as_raw()) } {
> +            if let Err(err) = res {
> +                // SAFETY: `fence` is valid because `self` is valid. The fence
> +                // must not have been signaled yet, which we check directly above.
> +                unsafe { bindings::dma_fence_set_error(fence.as_raw(), err.to_errno()) };
> +            }
> +            // SAFETY: `fence` is valid because `self` is valid. The lock must
> +            // be held, which we acquired above.
> +            unsafe { bindings::dma_fence_signal_locked(fence.as_raw()) };
> +        }
> +
> +        // TODO: This should decrement the nr-of-unsignaled-fences tracker in fctx
> +    }

[Severity: High]
Does skipping the counter decrement here cause a resource leak leading to a
kernel panic?

When FenceSignaler::signal() signals the fence without decrementing
nr_of_unsignaled_fences, it creates an issue during teardown. If the
associated DriverFence is subsequently dropped, DriverFence::drop() will
observe that the fence is already signaled and skip its own decrement:

DriverFence::drop() {
    ...
    let signaled: bool = unsafe { bindings::dma_fence_test_signaled_flag(guard.as_raw()) };
    if !signaled {
    ...
}

As a result, the unsignaled counter permanently leaks 1 count per use of
FenceSignaler. When the FenceContext is eventually dropped, its non-zero
counter triggers panic!("Forgotten fences in FenceContext.").

Can this TODO be resolved before merging to prevent drivers from triggering a
denial of service on normal cleanup paths?

> +
> +    /// Get the associated fence's sequence number.
> +    pub fn seqno(&self) -> u64 {
> +        self.fence.seqno()
> +    }

[Severity: Low]
Are small forwarding functions like this missing the #[inline] attribute?

According to the Rust subsystem coding guidelines, small functions or functions
forwarding to a C binding call in abstractions should be annotated with
#[inline] to avoid minor performance overhead across crate boundaries.

[ ... ]

> @@ -805,6 +844,16 @@ pub fn as_fence(&self) -> &Fence {
>          unsafe { Fence::from_raw(self.as_raw()) }
>      }
>  
> +    /// Create a [`FenceSignaler`] associated with this `DriverFence`.
> +    ///
> +    /// Use with caution! Only the producer of a [`DriverFence`] should be able
> +    /// to signal it.
> +    pub fn new_signaler(&self) -> FenceSignaler {
> +        FenceSignaler {
> +            fence: ARef::from(self.as_fence()),
> +        }
> +    }

[Severity: Low]
Should this small constructor also have an #[inline] annotation?

Additionally, FenceContext::deref() is a trivial deref implementation in
this file missing the #[inline] attribute. Could these annotations be added?

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20261009191124.1022902-2-phasta@kernel.org?part=4

  reply	other threads:[~2026-10-09 19:23 UTC|newest]

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-10-09 19:11 [RFC PATCH v5 0/6] rust: Add drm::JobQueue Philipp Stanner
2026-10-09 19:11 ` [RFC PATCH v5 1/6] rust: DmaFence: remove static lifetime Philipp Stanner
2026-10-09 19:24   ` sashiko-bot
2026-10-09 19:11 ` [RFC PATCH v5 2/6] rust: DmaFence: Implement Deref for FenceContext Philipp Stanner
2026-10-09 19:19   ` sashiko-bot
2026-10-09 19:11 ` [RFC PATCH v5 3/6] rust: DmaFence: Don't drop on signal Philipp Stanner
2026-10-09 19:26   ` sashiko-bot
2026-10-09 19:11 ` [RFC PATCH v5 4/6] rust: DmaFence: [RFC] Add Signaler Philipp Stanner
2026-10-09 19:23   ` sashiko-bot [this message]
2026-10-09 19:11 ` [RFC PATCH v5 5/6] rust: DmaFence: Replace call_rcu() with synchronize_rcu() Philipp Stanner
2026-10-09 19:25   ` sashiko-bot
2026-10-09 19:11 ` [RFC PATCH v5 6/6] rust: drm: Add JobQueue Philipp Stanner
2026-10-09 19:24   ` sashiko-bot
2026-10-11  0:22 ` [RFC PATCH v5 0/6] rust: Add drm::JobQueue Daniel Almeida
2026-10-12  8:17   ` Philipp Stanner

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=sashiko-outbox-165997@kernel.org \
    --to=sashiko-bot@kernel.org \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=gary@garyguo.net \
    --cc=media-ci@linuxtv.org \
    --cc=ojeda@kernel.org \
    --cc=phasta@kernel.org \
    --cc=sashiko-reviews@lists.linux.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 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.