diff options
| author | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2025-02-25 16:03:25 -0800 | 
|---|---|---|
| committer | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2025-02-25 16:03:25 -0800 | 
| commit | 0b119045b79a672bc6d8f18641c60fc8ce1b4585 (patch) | |
| tree | 69c63ecfec55b9576c34dc742e0c38f46f8a317a /rust/kernel/alloc/kbox.rs | |
| parent | 7f7573bd4f37d4edc168c5b5def0bc2a1951c657 (diff) | |
| parent | d082ecbc71e9e0bf49883ee4afd435a77a5101b6 (diff) | |
Merge tag 'v6.14-rc4' into next
Sync up with the mainline.
Diffstat (limited to 'rust/kernel/alloc/kbox.rs')
| -rw-r--r-- | rust/kernel/alloc/kbox.rs | 53 | 
1 files changed, 42 insertions, 11 deletions
| diff --git a/rust/kernel/alloc/kbox.rs b/rust/kernel/alloc/kbox.rs index 9ce414361c2c..cb4ebea3b074 100644 --- a/rust/kernel/alloc/kbox.rs +++ b/rust/kernel/alloc/kbox.rs @@ -354,22 +354,30 @@ where      A: Allocator,  {      type Borrowed<'a> = &'a T; +    type BorrowedMut<'a> = &'a mut T; -    fn into_foreign(self) -> *const crate::ffi::c_void { -        Box::into_raw(self) as _ +    fn into_foreign(self) -> *mut crate::ffi::c_void { +        Box::into_raw(self).cast()      } -    unsafe fn from_foreign(ptr: *const crate::ffi::c_void) -> Self { +    unsafe fn from_foreign(ptr: *mut crate::ffi::c_void) -> Self {          // SAFETY: The safety requirements of this function ensure that `ptr` comes from a previous          // call to `Self::into_foreign`. -        unsafe { Box::from_raw(ptr as _) } +        unsafe { Box::from_raw(ptr.cast()) }      } -    unsafe fn borrow<'a>(ptr: *const crate::ffi::c_void) -> &'a T { +    unsafe fn borrow<'a>(ptr: *mut crate::ffi::c_void) -> &'a T {          // SAFETY: The safety requirements of this method ensure that the object remains alive and          // immutable for the duration of 'a.          unsafe { &*ptr.cast() }      } + +    unsafe fn borrow_mut<'a>(ptr: *mut crate::ffi::c_void) -> &'a mut T { +        let ptr = ptr.cast(); +        // SAFETY: The safety requirements of this method ensure that the pointer is valid and that +        // nothing else will access the value for the duration of 'a. +        unsafe { &mut *ptr } +    }  }  impl<T: 'static, A> ForeignOwnable for Pin<Box<T, A>> @@ -377,19 +385,20 @@ where      A: Allocator,  {      type Borrowed<'a> = Pin<&'a T>; +    type BorrowedMut<'a> = Pin<&'a mut T>; -    fn into_foreign(self) -> *const crate::ffi::c_void { +    fn into_foreign(self) -> *mut crate::ffi::c_void {          // SAFETY: We are still treating the box as pinned. -        Box::into_raw(unsafe { Pin::into_inner_unchecked(self) }) as _ +        Box::into_raw(unsafe { Pin::into_inner_unchecked(self) }).cast()      } -    unsafe fn from_foreign(ptr: *const crate::ffi::c_void) -> Self { +    unsafe fn from_foreign(ptr: *mut crate::ffi::c_void) -> Self {          // SAFETY: The safety requirements of this function ensure that `ptr` comes from a previous          // call to `Self::into_foreign`. -        unsafe { Pin::new_unchecked(Box::from_raw(ptr as _)) } +        unsafe { Pin::new_unchecked(Box::from_raw(ptr.cast())) }      } -    unsafe fn borrow<'a>(ptr: *const crate::ffi::c_void) -> Pin<&'a T> { +    unsafe fn borrow<'a>(ptr: *mut crate::ffi::c_void) -> Pin<&'a T> {          // SAFETY: The safety requirements for this function ensure that the object is still alive,          // so it is safe to dereference the raw pointer.          // The safety requirements of `from_foreign` also ensure that the object remains alive for @@ -399,6 +408,18 @@ where          // SAFETY: This pointer originates from a `Pin<Box<T>>`.          unsafe { Pin::new_unchecked(r) }      } + +    unsafe fn borrow_mut<'a>(ptr: *mut crate::ffi::c_void) -> Pin<&'a mut T> { +        let ptr = ptr.cast(); +        // SAFETY: The safety requirements for this function ensure that the object is still alive, +        // so it is safe to dereference the raw pointer. +        // The safety requirements of `from_foreign` also ensure that the object remains alive for +        // the lifetime of the returned value. +        let r = unsafe { &mut *ptr }; + +        // SAFETY: This pointer originates from a `Pin<Box<T>>`. +        unsafe { Pin::new_unchecked(r) } +    }  }  impl<T, A> Deref for Box<T, A> @@ -427,13 +448,23 @@ where      }  } +impl<T, A> fmt::Display for Box<T, A> +where +    T: ?Sized + fmt::Display, +    A: Allocator, +{ +    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { +        <T as fmt::Display>::fmt(&**self, f) +    } +} +  impl<T, A> fmt::Debug for Box<T, A>  where      T: ?Sized + fmt::Debug,      A: Allocator,  {      fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { -        fmt::Debug::fmt(&**self, f) +        <T as fmt::Debug>::fmt(&**self, f)      }  } | 
