* [PATCH 0/4] rust: a few common Borrow/BorrowMut implementations
@ 2025-06-01 3:00 Alexandre Courbot
2025-06-01 3:00 ` [PATCH 1/4] rust: alloc: implement `Borrow` and `BorrowMut` for `Vec` Alexandre Courbot
` (4 more replies)
0 siblings, 5 replies; 17+ messages in thread
From: Alexandre Courbot @ 2025-06-01 3:00 UTC (permalink / raw)
To: Danilo Krummrich, Miguel Ojeda, Alex Gaynor, Boqun Feng, Gary Guo,
Björn Roy Baron, Benno Lossin, Andreas Hindborg, Alice Ryhl,
Trevor Gross
Cc: rust-for-linux, linux-kernel, Alexandre Courbot
The Borrow trait has multiple uses, one of them being to store either an
owned value or a reference to it inside a generic container. This series
adds these implementations for `Box`, `Arc`, `Vec`, and `CString`. I
came across the need for this while experimenting with the scatterlist
abstraction series [1].
This series provides just the `Borrow` and `BorrowMut` implementations,
but another common use of `Borrow` in the standard library is to use the
borrowed type for key lookups in collections. For this to work, a few
consistency traits (`Eq`, `Hash`, and `Ord`) need to be implemented. I
am not sure whether we want this on kernel types as well, but please let
me know if we do and I will add them in the next revision.
[1] https://lore.kernel.org/rust-for-linux/DA9JTYA0EQU8.26M0ZX80FOBWY@nvidia.com/
Signed-off-by: Alexandre Courbot <acourbot@nvidia.com>
---
Alexandre Courbot (4):
rust: alloc: implement `Borrow` and `BorrowMut` for `Vec`
rust: alloc: implement `Borrow` and `BorrowMut` for `Arc` types
rust: alloc: implement `Borrow` and `BorrowMut` for `KBox`
rust: alloc: implement `Borrow` and `BorrowMut` for `CString`
rust/kernel/alloc/kbox.rs | 21 +++++++++++++++++++++
rust/kernel/alloc/kvec.rs | 19 +++++++++++++++++++
rust/kernel/str.rs | 13 +++++++++++++
rust/kernel/sync/arc.rs | 21 ++++++++++++++++++++-
4 files changed, 73 insertions(+), 1 deletion(-)
---
base-commit: 7a17bbc1d952057898cb0739e60665908fbb8c72
change-id: 20250531-borrow_impls-8dfef3fcee93
Best regards,
--
Alexandre Courbot <acourbot@nvidia.com>
^ permalink raw reply [flat|nested] 17+ messages in thread
* [PATCH 1/4] rust: alloc: implement `Borrow` and `BorrowMut` for `Vec`
2025-06-01 3:00 [PATCH 0/4] rust: a few common Borrow/BorrowMut implementations Alexandre Courbot
@ 2025-06-01 3:00 ` Alexandre Courbot
2025-06-01 16:11 ` Benno Lossin
2025-06-01 3:00 ` [PATCH 2/4] rust: alloc: implement `Borrow` and `BorrowMut` for `Arc` types Alexandre Courbot
` (3 subsequent siblings)
4 siblings, 1 reply; 17+ messages in thread
From: Alexandre Courbot @ 2025-06-01 3:00 UTC (permalink / raw)
To: Danilo Krummrich, Miguel Ojeda, Alex Gaynor, Boqun Feng, Gary Guo,
Björn Roy Baron, Benno Lossin, Andreas Hindborg, Alice Ryhl,
Trevor Gross
Cc: rust-for-linux, linux-kernel, Alexandre Courbot
Implement these two common traits, which allow generic types to store
either an owned value or a reference to it.
The implementation leverages `as_slice` and `as_mut_slice`.
Signed-off-by: Alexandre Courbot <acourbot@nvidia.com>
---
rust/kernel/alloc/kvec.rs | 19 +++++++++++++++++++
1 file changed, 19 insertions(+)
diff --git a/rust/kernel/alloc/kvec.rs b/rust/kernel/alloc/kvec.rs
index 1a0dd852a468ccda6ea1b521bc1e7dbc8d7fc79c..45f813f69fe0f338a83c577752dd3ba1b3b2003f 100644
--- a/rust/kernel/alloc/kvec.rs
+++ b/rust/kernel/alloc/kvec.rs
@@ -8,6 +8,7 @@
AllocError, Allocator, Box, Flags,
};
use core::{
+ borrow::{Borrow, BorrowMut},
fmt,
marker::PhantomData,
mem::{ManuallyDrop, MaybeUninit},
@@ -890,6 +891,24 @@ fn deref_mut(&mut self) -> &mut [T] {
}
}
+impl<T, A> Borrow<[T]> for Vec<T, A>
+where
+ A: Allocator,
+{
+ fn borrow(&self) -> &[T] {
+ self.as_slice()
+ }
+}
+
+impl<T, A> BorrowMut<[T]> for Vec<T, A>
+where
+ A: Allocator,
+{
+ fn borrow_mut(&mut self) -> &mut [T] {
+ self.as_mut_slice()
+ }
+}
+
impl<T: Eq, A> Eq for Vec<T, A> where A: Allocator {}
impl<T, I: SliceIndex<[T]>, A> Index<I> for Vec<T, A>
--
2.49.0
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH 2/4] rust: alloc: implement `Borrow` and `BorrowMut` for `Arc` types
2025-06-01 3:00 [PATCH 0/4] rust: a few common Borrow/BorrowMut implementations Alexandre Courbot
2025-06-01 3:00 ` [PATCH 1/4] rust: alloc: implement `Borrow` and `BorrowMut` for `Vec` Alexandre Courbot
@ 2025-06-01 3:00 ` Alexandre Courbot
2025-06-01 3:06 ` Alexandre Courbot
2025-06-01 16:17 ` Benno Lossin
2025-06-01 3:00 ` [PATCH 3/4] rust: alloc: implement `Borrow` and `BorrowMut` for `KBox` Alexandre Courbot
` (2 subsequent siblings)
4 siblings, 2 replies; 17+ messages in thread
From: Alexandre Courbot @ 2025-06-01 3:00 UTC (permalink / raw)
To: Danilo Krummrich, Miguel Ojeda, Alex Gaynor, Boqun Feng, Gary Guo,
Björn Roy Baron, Benno Lossin, Andreas Hindborg, Alice Ryhl,
Trevor Gross
Cc: rust-for-linux, linux-kernel, Alexandre Courbot
Implement these two common traits, which allow generic types to store
either an owned value or a reference to it, leveraging the `Deref`
implementation.
`Arc` can only implement `Borrow`, but `UniqueArc` is able to support
both.
`ForeignOwnable` makes a call to its own `borrow` method which must be
disambiguated.
Signed-off-by: Alexandre Courbot <acourbot@nvidia.com>
---
rust/kernel/sync/arc.rs | 21 ++++++++++++++++++++-
1 file changed, 20 insertions(+), 1 deletion(-)
diff --git a/rust/kernel/sync/arc.rs b/rust/kernel/sync/arc.rs
index c7af0aa48a0a049bfeeba3a81080355f4d381738..40507e8901c349ba5f782457c203ff4cc181dd6c 100644
--- a/rust/kernel/sync/arc.rs
+++ b/rust/kernel/sync/arc.rs
@@ -25,6 +25,7 @@
};
use core::{
alloc::Layout,
+ borrow::{Borrow, BorrowMut},
fmt,
marker::PhantomData,
mem::{ManuallyDrop, MaybeUninit},
@@ -406,7 +407,7 @@ unsafe fn borrow<'a>(ptr: *mut Self::PointedTo) -> ArcBorrow<'a, T> {
unsafe fn borrow_mut<'a>(ptr: *mut Self::PointedTo) -> ArcBorrow<'a, T> {
// SAFETY: The safety requirements for `borrow_mut` are a superset of the safety
// requirements for `borrow`.
- unsafe { Self::borrow(ptr) }
+ unsafe { <Self as ForeignOwnable>::borrow(ptr) }
}
}
@@ -426,6 +427,12 @@ fn as_ref(&self) -> &T {
}
}
+impl<T: ?Sized> Borrow<T> for Arc<T> {
+ fn borrow(&self) -> &T {
+ self.deref()
+ }
+}
+
impl<T: ?Sized> Clone for Arc<T> {
fn clone(&self) -> Self {
// SAFETY: By the type invariant, there is necessarily a reference to the object, so it is
@@ -834,6 +841,18 @@ fn deref_mut(&mut self) -> &mut Self::Target {
}
}
+impl<T: ?Sized> Borrow<T> for UniqueArc<T> {
+ fn borrow(&self) -> &T {
+ self.deref()
+ }
+}
+
+impl<T: ?Sized> BorrowMut<T> for UniqueArc<T> {
+ fn borrow_mut(&mut self) -> &mut T {
+ self.deref_mut()
+ }
+}
+
impl<T: fmt::Display + ?Sized> fmt::Display for UniqueArc<T> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
fmt::Display::fmt(self.deref(), f)
--
2.49.0
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH 3/4] rust: alloc: implement `Borrow` and `BorrowMut` for `KBox`
2025-06-01 3:00 [PATCH 0/4] rust: a few common Borrow/BorrowMut implementations Alexandre Courbot
2025-06-01 3:00 ` [PATCH 1/4] rust: alloc: implement `Borrow` and `BorrowMut` for `Vec` Alexandre Courbot
2025-06-01 3:00 ` [PATCH 2/4] rust: alloc: implement `Borrow` and `BorrowMut` for `Arc` types Alexandre Courbot
@ 2025-06-01 3:00 ` Alexandre Courbot
2025-06-01 3:00 ` [PATCH 4/4] rust: alloc: implement `Borrow` and `BorrowMut` for `CString` Alexandre Courbot
2025-06-02 8:49 ` [PATCH 0/4] rust: a few common Borrow/BorrowMut implementations Alice Ryhl
4 siblings, 0 replies; 17+ messages in thread
From: Alexandre Courbot @ 2025-06-01 3:00 UTC (permalink / raw)
To: Danilo Krummrich, Miguel Ojeda, Alex Gaynor, Boqun Feng, Gary Guo,
Björn Roy Baron, Benno Lossin, Andreas Hindborg, Alice Ryhl,
Trevor Gross
Cc: rust-for-linux, linux-kernel, Alexandre Courbot
Implement these two common traits, which allow generic types to store
either an owned value or a reference to it, leveraging the `Deref`
implementation.
Signed-off-by: Alexandre Courbot <acourbot@nvidia.com>
---
rust/kernel/alloc/kbox.rs | 21 +++++++++++++++++++++
1 file changed, 21 insertions(+)
diff --git a/rust/kernel/alloc/kbox.rs b/rust/kernel/alloc/kbox.rs
index c386ff771d506a2eb4c211a93ea9b59bc04c93f5..73e66b4118b723a5e54de53144e4c1884098342f 100644
--- a/rust/kernel/alloc/kbox.rs
+++ b/rust/kernel/alloc/kbox.rs
@@ -6,6 +6,7 @@
use super::allocator::{KVmalloc, Kmalloc, Vmalloc};
use super::{AllocError, Allocator, Flags};
use core::alloc::Layout;
+use core::borrow::{Borrow, BorrowMut};
use core::fmt;
use core::marker::PhantomData;
use core::mem::ManuallyDrop;
@@ -499,6 +500,26 @@ fn deref_mut(&mut self) -> &mut T {
}
}
+impl<T, A> Borrow<T> for Box<T, A>
+where
+ T: ?Sized,
+ A: Allocator,
+{
+ fn borrow(&self) -> &T {
+ self.deref()
+ }
+}
+
+impl<T, A> BorrowMut<T> for Box<T, A>
+where
+ T: ?Sized,
+ A: Allocator,
+{
+ fn borrow_mut(&mut self) -> &mut T {
+ self.deref_mut()
+ }
+}
+
impl<T, A> fmt::Display for Box<T, A>
where
T: ?Sized + fmt::Display,
--
2.49.0
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH 4/4] rust: alloc: implement `Borrow` and `BorrowMut` for `CString`
2025-06-01 3:00 [PATCH 0/4] rust: a few common Borrow/BorrowMut implementations Alexandre Courbot
` (2 preceding siblings ...)
2025-06-01 3:00 ` [PATCH 3/4] rust: alloc: implement `Borrow` and `BorrowMut` for `KBox` Alexandre Courbot
@ 2025-06-01 3:00 ` Alexandre Courbot
2025-06-02 8:49 ` [PATCH 0/4] rust: a few common Borrow/BorrowMut implementations Alice Ryhl
4 siblings, 0 replies; 17+ messages in thread
From: Alexandre Courbot @ 2025-06-01 3:00 UTC (permalink / raw)
To: Danilo Krummrich, Miguel Ojeda, Alex Gaynor, Boqun Feng, Gary Guo,
Björn Roy Baron, Benno Lossin, Andreas Hindborg, Alice Ryhl,
Trevor Gross
Cc: rust-for-linux, linux-kernel, Alexandre Courbot
Implement these two common traits, which allow generic types to store
either an owned value or a reference to it, leveraging the `Deref`
implementation.
Signed-off-by: Alexandre Courbot <acourbot@nvidia.com>
---
rust/kernel/str.rs | 13 +++++++++++++
1 file changed, 13 insertions(+)
diff --git a/rust/kernel/str.rs b/rust/kernel/str.rs
index a927db8e079c3597860880947a03959e1d6d712e..f5da512ebcfef6c8d5227e8177ae32f6194ecffb 100644
--- a/rust/kernel/str.rs
+++ b/rust/kernel/str.rs
@@ -3,6 +3,7 @@
//! String representations.
use crate::alloc::{flags::*, AllocError, KVec};
+use core::borrow::{Borrow, BorrowMut};
use core::fmt::{self, Write};
use core::ops::{self, Deref, DerefMut, Index};
@@ -911,6 +912,18 @@ fn deref_mut(&mut self) -> &mut Self::Target {
}
}
+impl Borrow<CStr> for CString {
+ fn borrow(&self) -> &CStr {
+ self.deref()
+ }
+}
+
+impl BorrowMut<CStr> for CString {
+ fn borrow_mut(&mut self) -> &mut CStr {
+ self.deref_mut()
+ }
+}
+
impl<'a> TryFrom<&'a CStr> for CString {
type Error = AllocError;
--
2.49.0
^ permalink raw reply related [flat|nested] 17+ messages in thread
* Re: [PATCH 2/4] rust: alloc: implement `Borrow` and `BorrowMut` for `Arc` types
2025-06-01 3:00 ` [PATCH 2/4] rust: alloc: implement `Borrow` and `BorrowMut` for `Arc` types Alexandre Courbot
@ 2025-06-01 3:06 ` Alexandre Courbot
2025-06-01 16:17 ` Benno Lossin
1 sibling, 0 replies; 17+ messages in thread
From: Alexandre Courbot @ 2025-06-01 3:06 UTC (permalink / raw)
To: Alexandre Courbot, Danilo Krummrich, Miguel Ojeda, Alex Gaynor,
Boqun Feng, Gary Guo, Björn Roy Baron, Benno Lossin,
Andreas Hindborg, Alice Ryhl, Trevor Gross
Cc: rust-for-linux, linux-kernel
Typical noticed-as-I-sent mistake: the prefix should be "rust: sync:",
not "rust: alloc:" (also wrong on patch 4). Not resending just for that,
will fix for v2.
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH 1/4] rust: alloc: implement `Borrow` and `BorrowMut` for `Vec`
2025-06-01 3:00 ` [PATCH 1/4] rust: alloc: implement `Borrow` and `BorrowMut` for `Vec` Alexandre Courbot
@ 2025-06-01 16:11 ` Benno Lossin
2025-06-02 1:13 ` Alexandre Courbot
0 siblings, 1 reply; 17+ messages in thread
From: Benno Lossin @ 2025-06-01 16:11 UTC (permalink / raw)
To: Alexandre Courbot, Danilo Krummrich, Miguel Ojeda, Alex Gaynor,
Boqun Feng, Gary Guo, Björn Roy Baron, Andreas Hindborg,
Alice Ryhl, Trevor Gross
Cc: rust-for-linux, linux-kernel
On Sun Jun 1, 2025 at 5:00 AM CEST, Alexandre Courbot wrote:
> Implement these two common traits, which allow generic types to store
> either an owned value or a reference to it.
I don't understand the second part of the sentence.
> The implementation leverages `as_slice` and `as_mut_slice`.
>
> Signed-off-by: Alexandre Courbot <acourbot@nvidia.com>
> ---
> rust/kernel/alloc/kvec.rs | 19 +++++++++++++++++++
> 1 file changed, 19 insertions(+)
The code itself looks good.
---
Cheers,
Benno
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH 2/4] rust: alloc: implement `Borrow` and `BorrowMut` for `Arc` types
2025-06-01 3:00 ` [PATCH 2/4] rust: alloc: implement `Borrow` and `BorrowMut` for `Arc` types Alexandre Courbot
2025-06-01 3:06 ` Alexandre Courbot
@ 2025-06-01 16:17 ` Benno Lossin
1 sibling, 0 replies; 17+ messages in thread
From: Benno Lossin @ 2025-06-01 16:17 UTC (permalink / raw)
To: Alexandre Courbot, Danilo Krummrich, Miguel Ojeda, Alex Gaynor,
Boqun Feng, Gary Guo, Björn Roy Baron, Andreas Hindborg,
Alice Ryhl, Trevor Gross
Cc: rust-for-linux, linux-kernel
On Sun Jun 1, 2025 at 5:00 AM CEST, Alexandre Courbot wrote:
> Implement these two common traits, which allow generic types to store
> either an owned value or a reference to it, leveraging the `Deref`
> implementation.
Same here.
---
Cheers,
Benno
>
> `Arc` can only implement `Borrow`, but `UniqueArc` is able to support
> both.
>
> `ForeignOwnable` makes a call to its own `borrow` method which must be
> disambiguated.
>
> Signed-off-by: Alexandre Courbot <acourbot@nvidia.com>
> ---
> rust/kernel/sync/arc.rs | 21 ++++++++++++++++++++-
> 1 file changed, 20 insertions(+), 1 deletion(-)
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH 1/4] rust: alloc: implement `Borrow` and `BorrowMut` for `Vec`
2025-06-01 16:11 ` Benno Lossin
@ 2025-06-02 1:13 ` Alexandre Courbot
2025-06-02 15:06 ` Boqun Feng
2025-06-04 7:34 ` Benno Lossin
0 siblings, 2 replies; 17+ messages in thread
From: Alexandre Courbot @ 2025-06-02 1:13 UTC (permalink / raw)
To: Benno Lossin, Danilo Krummrich, Miguel Ojeda, Alex Gaynor,
Boqun Feng, Gary Guo, Björn Roy Baron, Andreas Hindborg,
Alice Ryhl, Trevor Gross
Cc: rust-for-linux, linux-kernel
Hi Benno,
On Mon Jun 2, 2025 at 1:11 AM JST, Benno Lossin wrote:
> On Sun Jun 1, 2025 at 5:00 AM CEST, Alexandre Courbot wrote:
>> Implement these two common traits, which allow generic types to store
>> either an owned value or a reference to it.
>
> I don't understand the second part of the sentence.
I want to say that Borrow allows you to do something like:
struct Foo<B: Borrow<u32>>(B);
// `foo1` owns its value...
let foo1 = Foo(0x12);
let i = 0x24;
// ... but `foo2` just borrows it, subject to the lifetime of `i`.
let foo2 = Foo(&i);
And the implementations in this series also let you do:
// `foo3`'s value is owned, but heap-allocated
let foo3 = Arc::new(KBox::new(0x56, GFP_KERNEL)?);
let j = Arc::new(0x78, GFP_KERNEL)?;
// `foo4`'s value is shared and its lifetime runtime-managed.
let foo4 = Foo(j.clone());
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH 0/4] rust: a few common Borrow/BorrowMut implementations
2025-06-01 3:00 [PATCH 0/4] rust: a few common Borrow/BorrowMut implementations Alexandre Courbot
` (3 preceding siblings ...)
2025-06-01 3:00 ` [PATCH 4/4] rust: alloc: implement `Borrow` and `BorrowMut` for `CString` Alexandre Courbot
@ 2025-06-02 8:49 ` Alice Ryhl
4 siblings, 0 replies; 17+ messages in thread
From: Alice Ryhl @ 2025-06-02 8:49 UTC (permalink / raw)
To: Alexandre Courbot
Cc: Danilo Krummrich, Miguel Ojeda, Alex Gaynor, Boqun Feng, Gary Guo,
Björn Roy Baron, Benno Lossin, Andreas Hindborg,
Trevor Gross, rust-for-linux, linux-kernel
On Sun, Jun 01, 2025 at 12:00:38PM +0900, Alexandre Courbot wrote:
> The Borrow trait has multiple uses, one of them being to store either an
> owned value or a reference to it inside a generic container. This series
> adds these implementations for `Box`, `Arc`, `Vec`, and `CString`. I
> came across the need for this while experimenting with the scatterlist
> abstraction series [1].
>
> This series provides just the `Borrow` and `BorrowMut` implementations,
> but another common use of `Borrow` in the standard library is to use the
> borrowed type for key lookups in collections. For this to work, a few
> consistency traits (`Eq`, `Hash`, and `Ord`) need to be implemented. I
> am not sure whether we want this on kernel types as well, but please let
> me know if we do and I will add them in the next revision.
>
> [1] https://lore.kernel.org/rust-for-linux/DA9JTYA0EQU8.26M0ZX80FOBWY@nvidia.com/
>
> Signed-off-by: Alexandre Courbot <acourbot@nvidia.com>
Reviewed-by: Alice Ryhl <aliceryhl@google.com>
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH 1/4] rust: alloc: implement `Borrow` and `BorrowMut` for `Vec`
2025-06-02 1:13 ` Alexandre Courbot
@ 2025-06-02 15:06 ` Boqun Feng
2025-06-02 20:21 ` Benno Lossin
2025-06-13 6:15 ` Alexandre Courbot
2025-06-04 7:34 ` Benno Lossin
1 sibling, 2 replies; 17+ messages in thread
From: Boqun Feng @ 2025-06-02 15:06 UTC (permalink / raw)
To: Alexandre Courbot
Cc: Benno Lossin, Danilo Krummrich, Miguel Ojeda, Alex Gaynor,
Gary Guo, Björn Roy Baron, Andreas Hindborg, Alice Ryhl,
Trevor Gross, rust-for-linux, linux-kernel
On Mon, Jun 02, 2025 at 10:13:22AM +0900, Alexandre Courbot wrote:
> Hi Benno,
>
> On Mon Jun 2, 2025 at 1:11 AM JST, Benno Lossin wrote:
> > On Sun Jun 1, 2025 at 5:00 AM CEST, Alexandre Courbot wrote:
> >> Implement these two common traits, which allow generic types to store
> >> either an owned value or a reference to it.
> >
> > I don't understand the second part of the sentence.
>
> I want to say that Borrow allows you to do something like:
>
> struct Foo<B: Borrow<u32>>(B);
>
> // `foo1` owns its value...
> let foo1 = Foo(0x12);
>
> let i = 0x24;
> // ... but `foo2` just borrows it, subject to the lifetime of `i`.
> let foo2 = Foo(&i);
>
> And the implementations in this series also let you do:
>
> // `foo3`'s value is owned, but heap-allocated
> let foo3 = Arc::new(KBox::new(0x56, GFP_KERNEL)?);
>
> let j = Arc::new(0x78, GFP_KERNEL)?;
> // `foo4`'s value is shared and its lifetime runtime-managed.
> let foo4 = Foo(j.clone());
Maybe you could put these in the "# Examples" section before impl
blocks. E.g
/// # Examples
/// ```
/// <you case above>
/// ```
impl<T, A> Borrow<[T]> for Vec<T, A> ...
Regards,
Boqun
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH 1/4] rust: alloc: implement `Borrow` and `BorrowMut` for `Vec`
2025-06-02 15:06 ` Boqun Feng
@ 2025-06-02 20:21 ` Benno Lossin
2025-06-02 20:45 ` Boqun Feng
2025-06-13 6:15 ` Alexandre Courbot
1 sibling, 1 reply; 17+ messages in thread
From: Benno Lossin @ 2025-06-02 20:21 UTC (permalink / raw)
To: Boqun Feng, Alexandre Courbot
Cc: Danilo Krummrich, Miguel Ojeda, Alex Gaynor, Gary Guo,
Björn Roy Baron, Andreas Hindborg, Alice Ryhl, Trevor Gross,
rust-for-linux, linux-kernel
On Mon Jun 2, 2025 at 5:06 PM CEST, Boqun Feng wrote:
> On Mon, Jun 02, 2025 at 10:13:22AM +0900, Alexandre Courbot wrote:
>> On Mon Jun 2, 2025 at 1:11 AM JST, Benno Lossin wrote:
>> > On Sun Jun 1, 2025 at 5:00 AM CEST, Alexandre Courbot wrote:
>> >> Implement these two common traits, which allow generic types to store
>> >> either an owned value or a reference to it.
>> >
>> > I don't understand the second part of the sentence.
>>
>> I want to say that Borrow allows you to do something like:
>>
>> struct Foo<B: Borrow<u32>>(B);
>>
>> // `foo1` owns its value...
>> let foo1 = Foo(0x12);
>>
>> let i = 0x24;
>> // ... but `foo2` just borrows it, subject to the lifetime of `i`.
>> let foo2 = Foo(&i);
>>
>> And the implementations in this series also let you do:
>>
>> // `foo3`'s value is owned, but heap-allocated
>> let foo3 = Arc::new(KBox::new(0x56, GFP_KERNEL)?);
>>
>> let j = Arc::new(0x78, GFP_KERNEL)?;
>> // `foo4`'s value is shared and its lifetime runtime-managed.
>> let foo4 = Foo(j.clone());
>
> Maybe you could put these in the "# Examples" section before impl
> blocks. E.g
>
> /// # Examples
> /// ```
> /// <you case above>
> /// ```
> impl<T, A> Borrow<[T]> for Vec<T, A> ...
Does that get rendered in the docs? If not, I don't think we should do
it.
---
Cheers,
Benno
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH 1/4] rust: alloc: implement `Borrow` and `BorrowMut` for `Vec`
2025-06-02 20:21 ` Benno Lossin
@ 2025-06-02 20:45 ` Boqun Feng
0 siblings, 0 replies; 17+ messages in thread
From: Boqun Feng @ 2025-06-02 20:45 UTC (permalink / raw)
To: Benno Lossin
Cc: Alexandre Courbot, Danilo Krummrich, Miguel Ojeda, Alex Gaynor,
Gary Guo, Björn Roy Baron, Andreas Hindborg, Alice Ryhl,
Trevor Gross, rust-for-linux, linux-kernel
On Mon, Jun 02, 2025 at 10:21:12PM +0200, Benno Lossin wrote:
> On Mon Jun 2, 2025 at 5:06 PM CEST, Boqun Feng wrote:
> > On Mon, Jun 02, 2025 at 10:13:22AM +0900, Alexandre Courbot wrote:
> >> On Mon Jun 2, 2025 at 1:11 AM JST, Benno Lossin wrote:
> >> > On Sun Jun 1, 2025 at 5:00 AM CEST, Alexandre Courbot wrote:
> >> >> Implement these two common traits, which allow generic types to store
> >> >> either an owned value or a reference to it.
> >> >
> >> > I don't understand the second part of the sentence.
> >>
> >> I want to say that Borrow allows you to do something like:
> >>
> >> struct Foo<B: Borrow<u32>>(B);
> >>
> >> // `foo1` owns its value...
> >> let foo1 = Foo(0x12);
> >>
> >> let i = 0x24;
> >> // ... but `foo2` just borrows it, subject to the lifetime of `i`.
> >> let foo2 = Foo(&i);
> >>
> >> And the implementations in this series also let you do:
> >>
> >> // `foo3`'s value is owned, but heap-allocated
> >> let foo3 = Arc::new(KBox::new(0x56, GFP_KERNEL)?);
> >>
> >> let j = Arc::new(0x78, GFP_KERNEL)?;
> >> // `foo4`'s value is shared and its lifetime runtime-managed.
> >> let foo4 = Foo(j.clone());
> >
> > Maybe you could put these in the "# Examples" section before impl
> > blocks. E.g
> >
> > /// # Examples
> > /// ```
> > /// <you case above>
> > /// ```
> > impl<T, A> Borrow<[T]> for Vec<T, A> ...
>
> Does that get rendered in the docs? If not, I don't think we should do
> it.
It does. I just tried myself, in the "Trait Implementations" section,
if you provide a doc comment for an impl block, it will show under the
"impl line" of corresponding to that impl block, including ```code```.
Regards,
Boqun
>
> ---
> Cheers,
> Benno
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH 1/4] rust: alloc: implement `Borrow` and `BorrowMut` for `Vec`
2025-06-02 1:13 ` Alexandre Courbot
2025-06-02 15:06 ` Boqun Feng
@ 2025-06-04 7:34 ` Benno Lossin
2025-06-13 5:35 ` Alexandre Courbot
1 sibling, 1 reply; 17+ messages in thread
From: Benno Lossin @ 2025-06-04 7:34 UTC (permalink / raw)
To: Alexandre Courbot, Danilo Krummrich, Miguel Ojeda, Alex Gaynor,
Boqun Feng, Gary Guo, Björn Roy Baron, Andreas Hindborg,
Alice Ryhl, Trevor Gross
Cc: rust-for-linux, linux-kernel
On Mon Jun 2, 2025 at 3:13 AM CEST, Alexandre Courbot wrote:
> Hi Benno,
>
> On Mon Jun 2, 2025 at 1:11 AM JST, Benno Lossin wrote:
>> On Sun Jun 1, 2025 at 5:00 AM CEST, Alexandre Courbot wrote:
>>> Implement these two common traits, which allow generic types to store
>>> either an owned value or a reference to it.
>>
>> I don't understand the second part of the sentence.
>
> I want to say that Borrow allows you to do something like:
>
> struct Foo<B: Borrow<u32>>(B);
>
> // `foo1` owns its value...
> let foo1 = Foo(0x12);
>
> let i = 0x24;
> // ... but `foo2` just borrows it, subject to the lifetime of `i`.
> let foo2 = Foo(&i);
>
> And the implementations in this series also let you do:
>
> // `foo3`'s value is owned, but heap-allocated
> let foo3 = Arc::new(KBox::new(0x56, GFP_KERNEL)?);
>
> let j = Arc::new(0x78, GFP_KERNEL)?;
> // `foo4`'s value is shared and its lifetime runtime-managed.
> let foo4 = Foo(j.clone());
How about something like:
Implement `Borrow<[T]>` and `BorrowMut<[T]>` for `Vec<T>`. This allows
`Vec<T>` to be used in generic APIs asking for types implementing those
traits. `[T; N]` and `&mut [T]` also implement those traits allowing
users to use either owned, borrowed and heap-owned values.
Also note this paragraph from the docs:
In particular `Eq`, `Ord` and `Hash` must be equivalent for borrowed
and owned values: `x.borrow() == y.borrow()` should give the same
result as `x == y`.
(This holds for the types that you implement it for, but I wanted to
mention it)
---
Cheers,
Benno
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH 1/4] rust: alloc: implement `Borrow` and `BorrowMut` for `Vec`
2025-06-04 7:34 ` Benno Lossin
@ 2025-06-13 5:35 ` Alexandre Courbot
2025-06-13 7:45 ` Benno Lossin
0 siblings, 1 reply; 17+ messages in thread
From: Alexandre Courbot @ 2025-06-13 5:35 UTC (permalink / raw)
To: Benno Lossin, Danilo Krummrich, Miguel Ojeda, Alex Gaynor,
Boqun Feng, Gary Guo, Björn Roy Baron, Andreas Hindborg,
Alice Ryhl, Trevor Gross
Cc: rust-for-linux, linux-kernel
On Wed Jun 4, 2025 at 4:34 PM JST, Benno Lossin wrote:
> On Mon Jun 2, 2025 at 3:13 AM CEST, Alexandre Courbot wrote:
>> Hi Benno,
>>
>> On Mon Jun 2, 2025 at 1:11 AM JST, Benno Lossin wrote:
>>> On Sun Jun 1, 2025 at 5:00 AM CEST, Alexandre Courbot wrote:
>>>> Implement these two common traits, which allow generic types to store
>>>> either an owned value or a reference to it.
>>>
>>> I don't understand the second part of the sentence.
>>
>> I want to say that Borrow allows you to do something like:
>>
>> struct Foo<B: Borrow<u32>>(B);
>>
>> // `foo1` owns its value...
>> let foo1 = Foo(0x12);
>>
>> let i = 0x24;
>> // ... but `foo2` just borrows it, subject to the lifetime of `i`.
>> let foo2 = Foo(&i);
>>
>> And the implementations in this series also let you do:
>>
>> // `foo3`'s value is owned, but heap-allocated
>> let foo3 = Arc::new(KBox::new(0x56, GFP_KERNEL)?);
>>
>> let j = Arc::new(0x78, GFP_KERNEL)?;
>> // `foo4`'s value is shared and its lifetime runtime-managed.
>> let foo4 = Foo(j.clone());
>
> How about something like:
>
> Implement `Borrow<[T]>` and `BorrowMut<[T]>` for `Vec<T>`. This allows
> `Vec<T>` to be used in generic APIs asking for types implementing those
> traits. `[T; N]` and `&mut [T]` also implement those traits allowing
> users to use either owned, borrowed and heap-owned values.
This is super clear, and I think I'll just reuse this message as-is if
that's ok with you. Thanks!
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH 1/4] rust: alloc: implement `Borrow` and `BorrowMut` for `Vec`
2025-06-02 15:06 ` Boqun Feng
2025-06-02 20:21 ` Benno Lossin
@ 2025-06-13 6:15 ` Alexandre Courbot
1 sibling, 0 replies; 17+ messages in thread
From: Alexandre Courbot @ 2025-06-13 6:15 UTC (permalink / raw)
To: Boqun Feng
Cc: Benno Lossin, Danilo Krummrich, Miguel Ojeda, Alex Gaynor,
Gary Guo, Björn Roy Baron, Andreas Hindborg, Alice Ryhl,
Trevor Gross, rust-for-linux, linux-kernel
On Tue Jun 3, 2025 at 12:06 AM JST, Boqun Feng wrote:
> On Mon, Jun 02, 2025 at 10:13:22AM +0900, Alexandre Courbot wrote:
>> Hi Benno,
>>
>> On Mon Jun 2, 2025 at 1:11 AM JST, Benno Lossin wrote:
>> > On Sun Jun 1, 2025 at 5:00 AM CEST, Alexandre Courbot wrote:
>> >> Implement these two common traits, which allow generic types to store
>> >> either an owned value or a reference to it.
>> >
>> > I don't understand the second part of the sentence.
>>
>> I want to say that Borrow allows you to do something like:
>>
>> struct Foo<B: Borrow<u32>>(B);
>>
>> // `foo1` owns its value...
>> let foo1 = Foo(0x12);
>>
>> let i = 0x24;
>> // ... but `foo2` just borrows it, subject to the lifetime of `i`.
>> let foo2 = Foo(&i);
>>
>> And the implementations in this series also let you do:
>>
>> // `foo3`'s value is owned, but heap-allocated
>> let foo3 = Arc::new(KBox::new(0x56, GFP_KERNEL)?);
>>
>> let j = Arc::new(0x78, GFP_KERNEL)?;
>> // `foo4`'s value is shared and its lifetime runtime-managed.
>> let foo4 = Foo(j.clone());
>
> Maybe you could put these in the "# Examples" section before impl
> blocks. E.g
>
> /// # Examples
> /// ```
> /// <you case above>
> /// ```
> impl<T, A> Borrow<[T]> for Vec<T, A> ...
I've started doing this, but it felt like I was writing down the obvious
as this kind of use is precisely what Borrow is intended for. I think
Benno's suggestion for the commit log addresses your request for
clarification, but let me add these on v2 anyway - we can always remove
them if we conclude they are unnecessary.
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH 1/4] rust: alloc: implement `Borrow` and `BorrowMut` for `Vec`
2025-06-13 5:35 ` Alexandre Courbot
@ 2025-06-13 7:45 ` Benno Lossin
0 siblings, 0 replies; 17+ messages in thread
From: Benno Lossin @ 2025-06-13 7:45 UTC (permalink / raw)
To: Alexandre Courbot, Danilo Krummrich, Miguel Ojeda, Alex Gaynor,
Boqun Feng, Gary Guo, Björn Roy Baron, Andreas Hindborg,
Alice Ryhl, Trevor Gross
Cc: rust-for-linux, linux-kernel
On Fri Jun 13, 2025 at 7:35 AM CEST, Alexandre Courbot wrote:
> On Wed Jun 4, 2025 at 4:34 PM JST, Benno Lossin wrote:
>> On Mon Jun 2, 2025 at 3:13 AM CEST, Alexandre Courbot wrote:
>>> Hi Benno,
>>>
>>> On Mon Jun 2, 2025 at 1:11 AM JST, Benno Lossin wrote:
>>>> On Sun Jun 1, 2025 at 5:00 AM CEST, Alexandre Courbot wrote:
>>>>> Implement these two common traits, which allow generic types to store
>>>>> either an owned value or a reference to it.
>>>>
>>>> I don't understand the second part of the sentence.
>>>
>>> I want to say that Borrow allows you to do something like:
>>>
>>> struct Foo<B: Borrow<u32>>(B);
>>>
>>> // `foo1` owns its value...
>>> let foo1 = Foo(0x12);
>>>
>>> let i = 0x24;
>>> // ... but `foo2` just borrows it, subject to the lifetime of `i`.
>>> let foo2 = Foo(&i);
>>>
>>> And the implementations in this series also let you do:
>>>
>>> // `foo3`'s value is owned, but heap-allocated
>>> let foo3 = Arc::new(KBox::new(0x56, GFP_KERNEL)?);
>>>
>>> let j = Arc::new(0x78, GFP_KERNEL)?;
>>> // `foo4`'s value is shared and its lifetime runtime-managed.
>>> let foo4 = Foo(j.clone());
>>
>> How about something like:
>>
>> Implement `Borrow<[T]>` and `BorrowMut<[T]>` for `Vec<T>`. This allows
>> `Vec<T>` to be used in generic APIs asking for types implementing those
>> traits. `[T; N]` and `&mut [T]` also implement those traits allowing
>> users to use either owned, borrowed and heap-owned values.
>
> This is super clear, and I think I'll just reuse this message as-is if
> that's ok with you. Thanks!
Sure!
---
Cheers,
Benno
^ permalink raw reply [flat|nested] 17+ messages in thread
end of thread, other threads:[~2025-06-13 7:45 UTC | newest]
Thread overview: 17+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-06-01 3:00 [PATCH 0/4] rust: a few common Borrow/BorrowMut implementations Alexandre Courbot
2025-06-01 3:00 ` [PATCH 1/4] rust: alloc: implement `Borrow` and `BorrowMut` for `Vec` Alexandre Courbot
2025-06-01 16:11 ` Benno Lossin
2025-06-02 1:13 ` Alexandre Courbot
2025-06-02 15:06 ` Boqun Feng
2025-06-02 20:21 ` Benno Lossin
2025-06-02 20:45 ` Boqun Feng
2025-06-13 6:15 ` Alexandre Courbot
2025-06-04 7:34 ` Benno Lossin
2025-06-13 5:35 ` Alexandre Courbot
2025-06-13 7:45 ` Benno Lossin
2025-06-01 3:00 ` [PATCH 2/4] rust: alloc: implement `Borrow` and `BorrowMut` for `Arc` types Alexandre Courbot
2025-06-01 3:06 ` Alexandre Courbot
2025-06-01 16:17 ` Benno Lossin
2025-06-01 3:00 ` [PATCH 3/4] rust: alloc: implement `Borrow` and `BorrowMut` for `KBox` Alexandre Courbot
2025-06-01 3:00 ` [PATCH 4/4] rust: alloc: implement `Borrow` and `BorrowMut` for `CString` Alexandre Courbot
2025-06-02 8:49 ` [PATCH 0/4] rust: a few common Borrow/BorrowMut implementations Alice Ryhl
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.