[PATCH] rust: sync: add `UniqueArc::as_ptr`

Andreas Hindborg posted 1 patch 1 month, 2 weeks ago
rust/kernel/sync/arc.rs | 5 +++++
1 file changed, 5 insertions(+)
[PATCH] rust: sync: add `UniqueArc::as_ptr`
Posted by Andreas Hindborg 1 month, 2 weeks ago
Add a method to `UniqueArc` for getting a raw pointer. The implementation
defers to the `Arc` implementation of the same method.

Signed-off-by: Andreas Hindborg <a.hindborg@kernel.org>
---
 rust/kernel/sync/arc.rs | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/rust/kernel/sync/arc.rs b/rust/kernel/sync/arc.rs
index 289f77abf415a..9c70fdd39bd2f 100644
--- a/rust/kernel/sync/arc.rs
+++ b/rust/kernel/sync/arc.rs
@@ -770,6 +770,11 @@ pub fn new_uninit(flags: Flags) -> Result<UniqueArc<MaybeUninit<T>>, AllocError>
             inner: unsafe { Arc::from_inner(KBox::leak(inner).into()) },
         })
     }
+
+    /// Return a raw pointer to the data in this unique arc.
+    pub fn as_ptr(&self) -> *const T {
+        Arc::as_ptr(&self.inner)
+    }
 }
 
 impl<T> UniqueArc<MaybeUninit<T>> {

---
base-commit: 05f7e89ab9731565d8a62e3b5d1ec206485eeb0b
change-id: 20260215-unique-arc-as-ptr-32eb209dde1b

Best regards,
-- 
Andreas Hindborg <a.hindborg@kernel.org>
Re: [PATCH] rust: sync: add `UniqueArc::as_ptr`
Posted by Gary Guo 1 month, 2 weeks ago
On 2026-02-15 20:38, Andreas Hindborg wrote:
> Add a method to `UniqueArc` for getting a raw pointer. The 
> implementation
> defers to the `Arc` implementation of the same method.
> 
> Signed-off-by: Andreas Hindborg <a.hindborg@kernel.org>
> ---
>  rust/kernel/sync/arc.rs | 5 +++++
>  1 file changed, 5 insertions(+)
> 
> diff --git a/rust/kernel/sync/arc.rs b/rust/kernel/sync/arc.rs
> index 289f77abf415a..9c70fdd39bd2f 100644
> --- a/rust/kernel/sync/arc.rs
> +++ b/rust/kernel/sync/arc.rs
> @@ -770,6 +770,11 @@ pub fn new_uninit(flags: Flags) -> 
> Result<UniqueArc<MaybeUninit<T>>, AllocError>
>              inner: unsafe { Arc::from_inner(KBox::leak(inner).into()) 
> },
>          })
>      }
> +
> +    /// Return a raw pointer to the data in this unique arc.

Please add an `#[inline]` here and make this function not a method.

Best,
Gary

> +    pub fn as_ptr(&self) -> *const T {
> +        Arc::as_ptr(&self.inner)
> +    }
>  }
> 
>  impl<T> UniqueArc<MaybeUninit<T>> {
> 
> ---
> base-commit: 05f7e89ab9731565d8a62e3b5d1ec206485eeb0b
> change-id: 20260215-unique-arc-as-ptr-32eb209dde1b
> 
> Best regards,
Re: [PATCH] rust: sync: add `UniqueArc::as_ptr`
Posted by Benno Lossin 1 month, 2 weeks ago
On Sun Feb 15, 2026 at 9:38 PM CET, Andreas Hindborg wrote:
> Add a method to `UniqueArc` for getting a raw pointer. The implementation
> defers to the `Arc` implementation of the same method.
>
> Signed-off-by: Andreas Hindborg <a.hindborg@kernel.org>
> ---
>  rust/kernel/sync/arc.rs | 5 +++++
>  1 file changed, 5 insertions(+)
>
> diff --git a/rust/kernel/sync/arc.rs b/rust/kernel/sync/arc.rs
> index 289f77abf415a..9c70fdd39bd2f 100644
> --- a/rust/kernel/sync/arc.rs
> +++ b/rust/kernel/sync/arc.rs
> @@ -770,6 +770,11 @@ pub fn new_uninit(flags: Flags) -> Result<UniqueArc<MaybeUninit<T>>, AllocError>
>              inner: unsafe { Arc::from_inner(KBox::leak(inner).into()) },
>          })
>      }
> +
> +    /// Return a raw pointer to the data in this unique arc.
> +    pub fn as_ptr(&self) -> *const T {

This should be an associated function instead of an inherent method.

Cheers,
Benno

> +        Arc::as_ptr(&self.inner)
> +    }
>  }
>  
>  impl<T> UniqueArc<MaybeUninit<T>> {
>
> ---
> base-commit: 05f7e89ab9731565d8a62e3b5d1ec206485eeb0b
> change-id: 20260215-unique-arc-as-ptr-32eb209dde1b
>
> Best regards,
Re: [PATCH] rust: sync: add `UniqueArc::as_ptr`
Posted by Andreas Hindborg 1 month, 2 weeks ago
"Benno Lossin" <lossin@kernel.org> writes:

> On Sun Feb 15, 2026 at 9:38 PM CET, Andreas Hindborg wrote:
>> Add a method to `UniqueArc` for getting a raw pointer. The implementation
>> defers to the `Arc` implementation of the same method.
>>
>> Signed-off-by: Andreas Hindborg <a.hindborg@kernel.org>
>> ---
>>  rust/kernel/sync/arc.rs | 5 +++++
>>  1 file changed, 5 insertions(+)
>>
>> diff --git a/rust/kernel/sync/arc.rs b/rust/kernel/sync/arc.rs
>> index 289f77abf415a..9c70fdd39bd2f 100644
>> --- a/rust/kernel/sync/arc.rs
>> +++ b/rust/kernel/sync/arc.rs
>> @@ -770,6 +770,11 @@ pub fn new_uninit(flags: Flags) -> Result<UniqueArc<MaybeUninit<T>>, AllocError>
>>              inner: unsafe { Arc::from_inner(KBox::leak(inner).into()) },
>>          })
>>      }
>> +
>> +    /// Return a raw pointer to the data in this unique arc.
>> +    pub fn as_ptr(&self) -> *const T {
>
> This should be an associated function instead of an inherent method.

I think this is so that we always call the function on the intended
object rather than going through Deref. Could you please clarify if this
is correct?


Best regards,
Andreas Hindborg
Re: [PATCH] rust: sync: add `UniqueArc::as_ptr`
Posted by Benno Lossin 1 month, 2 weeks ago
On Mon Feb 16, 2026 at 8:13 AM CET, Andreas Hindborg wrote:
> "Benno Lossin" <lossin@kernel.org> writes:
>
>> On Sun Feb 15, 2026 at 9:38 PM CET, Andreas Hindborg wrote:
>>> Add a method to `UniqueArc` for getting a raw pointer. The implementation
>>> defers to the `Arc` implementation of the same method.
>>>
>>> Signed-off-by: Andreas Hindborg <a.hindborg@kernel.org>
>>> ---
>>>  rust/kernel/sync/arc.rs | 5 +++++
>>>  1 file changed, 5 insertions(+)
>>>
>>> diff --git a/rust/kernel/sync/arc.rs b/rust/kernel/sync/arc.rs
>>> index 289f77abf415a..9c70fdd39bd2f 100644
>>> --- a/rust/kernel/sync/arc.rs
>>> +++ b/rust/kernel/sync/arc.rs
>>> @@ -770,6 +770,11 @@ pub fn new_uninit(flags: Flags) -> Result<UniqueArc<MaybeUninit<T>>, AllocError>
>>>              inner: unsafe { Arc::from_inner(KBox::leak(inner).into()) },
>>>          })
>>>      }
>>> +
>>> +    /// Return a raw pointer to the data in this unique arc.
>>> +    pub fn as_ptr(&self) -> *const T {
>>
>> This should be an associated function instead of an inherent method.
>
> I think this is so that we always call the function on the intended
> object rather than going through Deref. Could you please clarify if this
> is correct?

If you declare an inherent method on a type that is `Deref` (or
`Receiver`), then you can never call a method with the same name on the
object it derefs to:

    struct MyThing;

    impl MyThing {
        fn as_ptr(&self) -> *const () { /* ... */ }
    }

    let my_thing = UniqueArc::new(MyThing);
    let _: *const MyThing = my_thing.as_ptr(); // this is the method from `UniqueArc`
    // to call the other one, we have to write:
    let _: *const () = MyThing::my_thing(&*my_thing);

Especially a function with the name `as_ptr` should be associated, since
both very likely return a pointer; this increases the likelihood of
accidentally calling the wrong one.

Cheers,
Benno