rust/kernel/sync/arc.rs | 5 +++++ 1 file changed, 5 insertions(+)
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>
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,
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,
"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
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
© 2016 - 2026 Red Hat, Inc.