Thread (43 messages) 43 messages, 6 authors, 2025-09-25

Re: [PATCH v11 1/4] rust: types: Add Ownable/Owned types

From: "Benno Lossin" <lossin@kernel.org>
Date: 2025-08-20 07:41:09
Also in: lkml

On Wed Aug 20, 2025 at 8:02 AM CEST, Oliver Mangold wrote:
On 250819 1913, Benno Lossin wrote:
quoted
On Tue Aug 19, 2025 at 10:53 AM CEST, Andreas Hindborg wrote:
quoted
"Benno Lossin" [off-list ref] writes:
quoted
On Tue Aug 19, 2025 at 8:04 AM CEST, Oliver Mangold wrote:
quoted
On 250819 0027, Benno Lossin wrote:
quoted
On Mon Aug 18, 2025 at 3:04 PM CEST, Oliver Mangold wrote:
quoted
On 250818 1446, Andreas Hindborg wrote:
quoted
"Oliver Mangold" [off-list ref] writes:
quoted
+impl<T: OwnableMut> DerefMut for Owned<T> {
+    fn deref_mut(&mut self) -> &mut Self::Target {
+        // SAFETY: The type invariants guarantee that the object is valid, and that we can safely
+        // return a mutable reference to it.
+        unsafe { self.ptr.as_mut() }
+    }
+}
I think someone mentioned this before, but handing out mutable
references can be a problem if `T: !Unpin`. For instance, we don't want
to hand out `&mut Page` in case of `Owned<Page>`.
That was the reason, why `OwnableMut` was introduced in the first place.
It's clear, I guess, that as-is it cannot be implemented on many classes.
Yeah the safety requirements ensure that you can't implement it on
`!Unpin` types.

But I'm not sure it's useful then? As you said there aren't many types
that will implement the type then, so how about we change the meaning
and make it give out a pinned mutable reference instead?
Making `deref_mut()` give out a pinned type won't work. The return types of
deref() are required to match.
I meant the changes that Andreas suggested.
Not sure what you are asking, but I need to assert exclusive access to
an `Page`. I could either get this by taking a `&mut Owned<Page>` or a
`Pin<&mut Page>`. I think the latter is more agnostic.
The former isn't really correct? It's like having a `&mut Box<Page>`
which is weird. I was saying we can have a `DerefMut` impl gated on `T:
Unpin` and a `fn get_pin_mut(&mut self) -> Pin<&mut T>`.
Yes. I think `Page` is the wrong example, as it already has owned semantics
and does its own cleanup. Wrapping it in an Owned would be redundant.
After we have these owned patches, we are going to change `Page` to
`Opaque<bindings::page>`.

---
Cheers,
Benno
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help