[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20260205095727.4c3e2941@fedora>
Date: Thu, 5 Feb 2026 09:57:27 +0100
From: Boris Brezillon <boris.brezillon@...labora.com>
To: Philipp Stanner <phasta@...nel.org>
Cc: David Airlie <airlied@...il.com>, Simona Vetter <simona@...ll.ch>,
Danilo Krummrich <dakr@...nel.org>, Alice Ryhl <aliceryhl@...gle.com>, Gary
Guo <gary@...yguo.net>, Benno Lossin <lossin@...nel.org>, Christian
König <christian.koenig@....com>, Daniel Almeida
<daniel.almeida@...labora.com>, Joel Fernandes <joelagnelf@...dia.com>,
linux-kernel@...r.kernel.org, dri-devel@...ts.freedesktop.org,
rust-for-linux@...r.kernel.org
Subject: Re: [RFC PATCH 2/4] rust: sync: Add dma_fence abstractions
Hi Philipp,
On Tue, 3 Feb 2026 09:14:01 +0100
Philipp Stanner <phasta@...nel.org> wrote:
> +
> + /// Mark the beginning of a DmaFence signalling critical section. Should be called once a fence
> + /// gets published.
> + ///
> + /// The signalling critical section is marked as finished automatically once the fence signals.
> + pub fn begin_signalling(&mut self) {
> + // FIXME: this needs to be mutable, obviously, but we can't borrow mutably. *sigh*
> + self.signalling = true;
> + // TODO: Should we warn if a user tries to do this several times for the same
> + // fence? And should we ignore the request if the fence is already signalled?
> +
> + // SAFETY: `dma_fence_begin_signalling()` works on global lockdep data and calling it is
> + // always safe.
> + self.signalling_cookie = unsafe { bindings::dma_fence_begin_signalling() };
Maybe it's me misunderstanding what's happening here, but I don't think
you can tie the signalling section to the fence [published -> signalled]
timeframe. DmaFence signalling critical section is a section of code, in
a thread, that's needed for any previously published fence to be signalled,
and as such, has constraints on memory allocation types and locks it can
acquire (any lock taken while a blocking allocation happens can't be taken
in the DmaFence signalling path for instance).
But here, you're going to flag the thread doing the submission as
being in the signalling path, and this will likely be dropped in a
different thread (because the signalling will happen asynchronously,
when the job is done or cancelled). Think about this sequence for
instance:
thread A thread B (workqueue thread)
iocl(SUBMIT_xxx) {
create(job)
arm(job->fence) <- fence signalling section starts here
queue(job)
}
ioctl(xxxx) {
kmalloc(GFP_KERNEL) <- BOOM, can't do blocking alloc in a
fence signalling path
}
job_done_work() {
...
signal(job->fence) <- fence signalling section supposedly ends here in
a completely different thread it was started
}
Unfortunately, I don't know how to translate that in rust, but we
need a way to check if any path code path does a DmaFence.signal(),
go back to the entry point (for a WorkItem, that would be
WorkItem::run() for instance), and make it a DmaFenceSignallingPath.
Not only that, but we need to know all the deps that make it so
this path can be called (if I take the WorkItem example, that would
be the path that leads to the WorkItem being scheduled).
Hopefully Alice and other rust experts can come up with some ideas
to handle that.
Regards,
Boris
Powered by blists - more mailing lists