summaryrefslogtreecommitdiff
path: root/rust/kernel/alloc/kvec.rs
diff options
context:
space:
mode:
authorTamir Duberstein <tamird@gmail.com>2025-03-18 17:52:42 +0300
committerDanilo Krummrich <dakr@kernel.org>2025-04-07 17:59:06 +0300
commitc3152988c047a7b6abb10d4dc5e24fafbabe8b7e (patch)
tree64edad0597d158a4a522ac8d7600c59af2be79e5 /rust/kernel/alloc/kvec.rs
parent1679b7159379d11100e4ab7d1de23c8cd7765aa1 (diff)
downloadlinux-c3152988c047a7b6abb10d4dc5e24fafbabe8b7e.tar.xz
rust: alloc: use `spare_capacity_mut` to reduce unsafe
Use `spare_capacity_mut` in the implementation of `push` to reduce the use of `unsafe`. Both methods were added in commit 2aac4cd7dae3 ("rust: alloc: implement kernel `Vec` type"). Reviewed-by: Alice Ryhl <aliceryhl@google.com> Reviewed-by: Benno Lossin <benno.lossin@proton.me> Link: https://lore.kernel.org/r/20250318-vec-push-use-spare-v3-1-68741671d1af@gmail.com Signed-off-by: Tamir Duberstein <tamird@gmail.com> Signed-off-by: Danilo Krummrich <dakr@kernel.org>
Diffstat (limited to 'rust/kernel/alloc/kvec.rs')
-rw-r--r--rust/kernel/alloc/kvec.rs11
1 files changed, 3 insertions, 8 deletions
diff --git a/rust/kernel/alloc/kvec.rs b/rust/kernel/alloc/kvec.rs
index 7ebec5c4a277..6ac8756989e5 100644
--- a/rust/kernel/alloc/kvec.rs
+++ b/rust/kernel/alloc/kvec.rs
@@ -288,15 +288,10 @@ where
pub fn push(&mut self, v: T, flags: Flags) -> Result<(), AllocError> {
self.reserve(1, flags)?;
- // SAFETY:
- // - `self.len` is smaller than `self.capacity` and hence, the resulting pointer is
- // guaranteed to be part of the same allocated object.
- // - `self.len` can not overflow `isize`.
- let ptr = unsafe { self.as_mut_ptr().add(self.len) };
+ let spare = self.spare_capacity_mut();
- // SAFETY:
- // - `ptr` is properly aligned and valid for writes.
- unsafe { core::ptr::write(ptr, v) };
+ // SAFETY: The call to `reserve` was successful so the spare capacity is at least 1.
+ unsafe { spare.get_unchecked_mut(0) }.write(v);
// SAFETY: We just initialised the first spare entry, so it is safe to increase the length
// by 1. We also know that the new length is <= capacity because of the previous call to