* [PATCH v3 0/5] rust: add DropGuard
@ 2026-09-26 17:33 Mohamed Osama
2026-09-26 17:33 ` [PATCH v3 1/5] rust: add DropGuard KUnit test configuration Mohamed Osama
` (4 more replies)
0 siblings, 5 replies; 7+ messages in thread
From: Mohamed Osama @ 2026-09-26 17:33 UTC (permalink / raw)
To: ojeda
Cc: boqun, gary, bjorn3_gh, lossin, a.hindborg, aliceryhl, tmgross,
dakr, daniel.almeida, tamird, acourbot, work, longman, lyude,
linux-block, linux-serial, rust-for-linux, linux-kernel
Add the Rust kernel DropGuard API and migrate the existing ScopeGuard
users in the block, serdev, and locking code.
DropGuard runs a FnOnce callback when dropped and provides dismiss() to
take ownership of the wrapped value without running the cleanup callback.
Changes since v2:
- Clarified why DropGuard is added alongside the existing ScopeGuard.
- Fixed the core imports in mem.rs to follow the Rust kernel import style.
The series was previously tested with:
- make LLVM=1 rustfmtcheck
- make LLVM=1 rustdoc
- make LLVM=1 -j$(nproc)
- git diff --check
- scripts/checkpatch.pl
The changes in v3 are limited to the import style and commit-message
clarification.
Mohamed Osama (5):
rust: add DropGuard KUnit test configuration
rust: mem: add DropGuard
rust: block: gen_disk: use DropGuard
rust: serdev: use DropGuard
rust: sync: lock: use DropGuard
rust/kernel/Kconfig.test | 10 +++
rust/kernel/block/mq/gen_disk.rs | 11 +--
rust/kernel/mem.rs | 121 +++++++++++++++++++++++++++++++
rust/kernel/serdev.rs | 10 +--
rust/kernel/sync/lock.rs | 5 +-
5 files changed, 144 insertions(+), 13 deletions(-)
--
2.43.0
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH v3 1/5] rust: add DropGuard KUnit test configuration
2026-09-26 17:33 [PATCH v3 0/5] rust: add DropGuard Mohamed Osama
@ 2026-09-26 17:33 ` Mohamed Osama
2026-09-26 17:33 ` [PATCH v3 2/5] rust: mem: add DropGuard Mohamed Osama
` (3 subsequent siblings)
4 siblings, 0 replies; 7+ messages in thread
From: Mohamed Osama @ 2026-09-26 17:33 UTC (permalink / raw)
To: ojeda
Cc: boqun, gary, bjorn3_gh, lossin, a.hindborg, aliceryhl, tmgross,
dakr, daniel.almeida, tamird, acourbot, work, longman, lyude,
linux-block, linux-serial, rust-for-linux, linux-kernel
Add a KUnit configuration option for testing the Rust DropGuard API.
The option follows the existing Rust KUnit test configuration pattern and
defaults to KUNIT_ALL_TESTS.
Signed-off-by: Mohamed Osama <mohamed.osama189110@gmail.com>
---
rust/kernel/Kconfig.test | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/rust/kernel/Kconfig.test b/rust/kernel/Kconfig.test
index e6a5c7a795f0..011c72f14e2c 100644
--- a/rust/kernel/Kconfig.test
+++ b/rust/kernel/Kconfig.test
@@ -33,6 +33,16 @@ config RUST_KVEC_KUNIT_TEST
If unsure, say N.
+config RUST_DROP_GUARD_KUNIT_TEST
+ bool "KUnit tests for Rust DropGuard API" if !KUNIT_ALL_TESTS
+ default KUNIT_ALL_TESTS
+ help
+ This option enables KUnit tests for the Rust DropGuard API.
+ These are only for development and testing, not for regular
+ kernel use cases.
+
+ If unsure, say N.
+
config RUST_BITMAP_KUNIT_TEST
bool "KUnit tests for Rust bitmap API" if !KUNIT_ALL_TESTS
default KUNIT_ALL_TESTS
--
2.43.0
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH v3 2/5] rust: mem: add DropGuard
2026-09-26 17:33 [PATCH v3 0/5] rust: add DropGuard Mohamed Osama
2026-09-26 17:33 ` [PATCH v3 1/5] rust: add DropGuard KUnit test configuration Mohamed Osama
@ 2026-09-26 17:33 ` Mohamed Osama
2026-09-26 23:53 ` Gary Guo
2026-09-26 17:33 ` [PATCH v3 3/5] rust: block: gen_disk: use DropGuard Mohamed Osama
` (2 subsequent siblings)
4 siblings, 1 reply; 7+ messages in thread
From: Mohamed Osama @ 2026-09-26 17:33 UTC (permalink / raw)
To: ojeda
Cc: boqun, gary, bjorn3_gh, lossin, a.hindborg, aliceryhl, tmgross,
dakr, daniel.almeida, tamird, acourbot, work, longman, lyude,
linux-block, linux-serial, rust-for-linux, linux-kernel
Add DropGuard to the Rust kernel memory module.
DropGuard runs a FnOnce callback when the guard is dropped and provides
dismiss() to take ownership of the wrapped value without running the
cleanup callback.
This follows the upstream core::mem::DropGuard API, which is being
stabilized in Rust.
Keep ScopeGuard for existing users rather than changing its API in this
patch. Migrate the existing users that can use DropGuard to establish
the kernel API alongside the upstream Rust API.
Signed-off-by: Mohamed Osama <mohamed.osama189110@gmail.com>
---
rust/kernel/mem.rs | 121 +++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 121 insertions(+)
diff --git a/rust/kernel/mem.rs b/rust/kernel/mem.rs
index f2d4cdf87d00..e7a84d15f3b3 100644
--- a/rust/kernel/mem.rs
+++ b/rust/kernel/mem.rs
@@ -4,6 +4,93 @@
use crate::prelude::*;
+use core::mem::ManuallyDrop;
+use core::ops::{Deref, DerefMut};
+
+/// Wraps a value and runs a closure when dropped.
+///
+/// This is useful for running cleanup code when leaving a scope.
+///
+/// The [`DropGuard::dismiss`] function can be used to take ownership of the wrapped
+/// value without running the cleanup function.
+#[doc(alias = "ScopeGuard")]
+#[doc(alias = "defer")]
+pub struct DropGuard<T, F>
+where
+ F: FnOnce(T),
+{
+ inner: ManuallyDrop<T>,
+ f: ManuallyDrop<F>,
+}
+
+impl<T, F> DropGuard<T, F>
+where
+ F: FnOnce(T),
+{
+ /// Creates a new `DropGuard`.
+ #[inline]
+ #[must_use]
+ pub fn new(inner: T, f: F) -> Self {
+ Self {
+ inner: ManuallyDrop::new(inner),
+ f: ManuallyDrop::new(f),
+ }
+ }
+
+ /// Consumes the `DropGuard`, returning the wrapped value without
+ /// running the cleanup function.
+ #[inline]
+ pub fn dismiss(guard: Self) -> T {
+ let mut guard = ManuallyDrop::new(guard);
+
+ // SAFETY: We have taken ownership of the guard and prevent its destructor from running.
+ let value = unsafe { ManuallyDrop::take(&mut guard.inner) };
+
+ // SAFETY: We have taken ownership of the guard.
+ unsafe { ManuallyDrop::drop(&mut guard.f) };
+
+ value
+ }
+}
+
+impl<T, F> Deref for DropGuard<T, F>
+where
+ F: FnOnce(T),
+{
+ type Target = T;
+
+ #[inline]
+ fn deref(&self) -> &T {
+ &self.inner
+ }
+}
+
+impl<T, F> DerefMut for DropGuard<T, F>
+where
+ F: FnOnce(T),
+{
+ #[inline]
+ fn deref_mut(&mut self) -> &mut T {
+ &mut self.inner
+ }
+}
+
+impl<T, F> Drop for DropGuard<T, F>
+where
+ F: FnOnce(T),
+{
+ #[inline]
+ fn drop(&mut self) {
+ // SAFETY: `DropGuard` is in the process of being dropped.
+ let inner = unsafe { ManuallyDrop::take(&mut self.inner) };
+
+ // SAFETY: `DropGuard` is in the process of being dropped.
+ let f = unsafe { ManuallyDrop::take(&mut self.f) };
+
+ f(inner);
+ }
+}
+
/// Transmute between two types.
///
/// Use this instead of [`core::mem::transmute`] when it is known that sizes are identical but this
@@ -232,3 +319,37 @@ unsafe impl AsReprMut for $signed {}
// `usize` is not normalized to particular integer for portability.
usize isize,
}
+
+#[cfg(CONFIG_RUST_DROP_GUARD_KUNIT_TEST)]
+#[macros::kunit_tests(rust_drop_guard)]
+mod tests {
+ use super::*;
+
+ #[test]
+ fn test_drop_runs_cleanup() {
+ let mut cleaned = false;
+
+ {
+ let _guard = DropGuard::new(42, |value| {
+ assert_eq!(value, 42);
+ cleaned = true;
+ });
+ }
+
+ assert!(cleaned);
+ }
+
+ #[test]
+ fn test_dismiss_returns_value_without_cleanup() {
+ let mut cleaned = false;
+
+ let guard = DropGuard::new(42, |_| {
+ cleaned = true;
+ });
+
+ let value = DropGuard::dismiss(guard);
+
+ assert_eq!(value, 42);
+ assert!(!cleaned);
+ }
+}
--
2.43.0
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH v3 3/5] rust: block: gen_disk: use DropGuard
2026-09-26 17:33 [PATCH v3 0/5] rust: add DropGuard Mohamed Osama
2026-09-26 17:33 ` [PATCH v3 1/5] rust: add DropGuard KUnit test configuration Mohamed Osama
2026-09-26 17:33 ` [PATCH v3 2/5] rust: mem: add DropGuard Mohamed Osama
@ 2026-09-26 17:33 ` Mohamed Osama
2026-09-26 17:33 ` [PATCH v3 4/5] rust: serdev: " Mohamed Osama
2026-09-26 17:33 ` [PATCH v3 5/5] rust: sync: lock: " Mohamed Osama
4 siblings, 0 replies; 7+ messages in thread
From: Mohamed Osama @ 2026-09-26 17:33 UTC (permalink / raw)
To: ojeda
Cc: boqun, gary, bjorn3_gh, lossin, a.hindborg, aliceryhl, tmgross,
dakr, daniel.almeida, tamird, acourbot, work, longman, lyude,
linux-block, linux-serial, rust-for-linux, linux-kernel
Replace the ScopeGuard instances in the Rust block layer generic disk
implementation with DropGuard.
DropGuard provides the same scope-exit cleanup behavior while using the
new Rust kernel memory API.
Signed-off-by: Mohamed Osama <mohamed.osama189110@gmail.com>
---
rust/kernel/block/mq/gen_disk.rs | 11 ++++++-----
1 file changed, 6 insertions(+), 5 deletions(-)
diff --git a/rust/kernel/block/mq/gen_disk.rs b/rust/kernel/block/mq/gen_disk.rs
index fc97dd873974..d9019fbbb361 100644
--- a/rust/kernel/block/mq/gen_disk.rs
+++ b/rust/kernel/block/mq/gen_disk.rs
@@ -10,11 +10,12 @@
block::mq::{Operations, TagSet},
error::{self, from_err_ptr, Result},
fmt::{self, Write},
+ mem::DropGuard,
prelude::*,
static_lock_class,
str::NullTerminatedFormatter,
sync::Arc,
- types::{ForeignOwnable, ScopeGuard},
+ types::ForeignOwnable,
};
/// A builder for [`GenDisk`].
@@ -102,7 +103,7 @@ pub fn build<T: Operations>(
queue_data: T::QueueData,
) -> Result<GenDisk<T>> {
let data = queue_data.into_foreign();
- let recover_data = ScopeGuard::new(|| {
+ let recover_data = DropGuard::new((), |_| {
// SAFETY: T::QueueData was created by the call to `into_foreign()` above
drop(unsafe { T::QueueData::from_foreign(data) });
});
@@ -150,7 +151,7 @@ pub fn build<T: Operations>(
// SAFETY: `gendisk` is a valid pointer as we initialized it above
unsafe { (*gendisk).fops = &TABLE };
- let cleanup_failure = ScopeGuard::new_with_data((gendisk, data), |(gendisk, data)| {
+ let cleanup_failure = DropGuard::new((gendisk, data), |(gendisk, data)| {
// SAFETY: `gendisk` came from `__blk_mq_alloc_disk()` above and
// has not been added to the VFS on this cleanup path.
unsafe { bindings::put_disk(gendisk) };
@@ -161,7 +162,7 @@ pub fn build<T: Operations>(
// The failure guard now owns both pieces of cleanup; the early guard
// must not run on this path anymore.
- recover_data.dismiss();
+ DropGuard::dismiss(recover_data);
let mut writer = NullTerminatedFormatter::new(
// SAFETY: `gendisk` points to a valid and initialized instance. We
@@ -185,7 +186,7 @@ pub fn build<T: Operations>(
},
)?;
- cleanup_failure.dismiss();
+ DropGuard::dismiss(cleanup_failure);
// INVARIANT: `gendisk` was initialized above.
// INVARIANT: `gendisk` was added to the VFS via `device_add_disk` above.
--
2.43.0
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH v3 4/5] rust: serdev: use DropGuard
2026-09-26 17:33 [PATCH v3 0/5] rust: add DropGuard Mohamed Osama
` (2 preceding siblings ...)
2026-09-26 17:33 ` [PATCH v3 3/5] rust: block: gen_disk: use DropGuard Mohamed Osama
@ 2026-09-26 17:33 ` Mohamed Osama
2026-09-26 17:33 ` [PATCH v3 5/5] rust: sync: lock: " Mohamed Osama
4 siblings, 0 replies; 7+ messages in thread
From: Mohamed Osama @ 2026-09-26 17:33 UTC (permalink / raw)
To: ojeda
Cc: boqun, gary, bjorn3_gh, lossin, a.hindborg, aliceryhl, tmgross,
dakr, daniel.almeida, tamird, acourbot, work, longman, lyude,
linux-block, linux-serial, rust-for-linux, linux-kernel
Replace the ScopeGuard usage in the serial device bus implementation
with DropGuard.
Use DropGuard::dismiss() when ownership of the private data needs to be
transferred without running the cleanup callback.
Signed-off-by: Mohamed Osama <mohamed.osama189110@gmail.com>
---
rust/kernel/serdev.rs | 10 ++++------
1 file changed, 4 insertions(+), 6 deletions(-)
diff --git a/rust/kernel/serdev.rs b/rust/kernel/serdev.rs
index 17ca504b7f8d..dd43b159b461 100644
--- a/rust/kernel/serdev.rs
+++ b/rust/kernel/serdev.rs
@@ -13,6 +13,7 @@
to_result,
VTABLE_DEFAULT_ERROR, //
},
+ mem::DropGuard,
new_mutex,
of,
prelude::*,
@@ -21,10 +22,7 @@
Mutex, //
},
time::Jiffies,
- types::{
- Opaque,
- ScopeGuard, //
- }, //
+ types::Opaque, //
};
use core::{
@@ -174,7 +172,7 @@ extern "C" fn probe_callback(sdev: *mut bindings::serdev_device) -> kernel::ffi:
}))?;
// SAFETY: We just set drvdata to `PrivateData<'_, T>`.
let private_data = unsafe { sdev.as_ref().drvdata_borrow::<PrivateData<'_, T>>() };
- let private_data = ScopeGuard::new_with_data(private_data, |_| {
+ let private_data = DropGuard::new(private_data, |_| {
// SAFETY: We just set drvdata to `PrivateData<'_, T>`.
drop(unsafe { sdev.as_ref().drvdata_obtain::<PrivateData<'_, T>>() });
});
@@ -204,7 +202,7 @@ extern "C" fn probe_callback(sdev: *mut bindings::serdev_device) -> kernel::ffi:
drop(active);
result.map(|()| {
- private_data.dismiss();
+ DropGuard::dismiss(private_data);
0
})
})
--
2.43.0
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH v3 5/5] rust: sync: lock: use DropGuard
2026-09-26 17:33 [PATCH v3 0/5] rust: add DropGuard Mohamed Osama
` (3 preceding siblings ...)
2026-09-26 17:33 ` [PATCH v3 4/5] rust: serdev: " Mohamed Osama
@ 2026-09-26 17:33 ` Mohamed Osama
4 siblings, 0 replies; 7+ messages in thread
From: Mohamed Osama @ 2026-09-26 17:33 UTC (permalink / raw)
To: ojeda
Cc: boqun, gary, bjorn3_gh, lossin, a.hindborg, aliceryhl, tmgross,
dakr, daniel.almeida, tamird, acourbot, work, longman, lyude,
linux-block, linux-serial, rust-for-linux, linux-kernel
Replace the ScopeGuard usage in the Rust locking implementation with
DropGuard.
The guard preserves the existing scope-exit cleanup behavior while using
the DropGuard API from the Rust kernel memory module.
Signed-off-by: Mohamed Osama <mohamed.osama189110@gmail.com>
---
rust/kernel/sync/lock.rs | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/rust/kernel/sync/lock.rs b/rust/kernel/sync/lock.rs
index 10b6b5e9b024..15f9cbe76c8d 100644
--- a/rust/kernel/sync/lock.rs
+++ b/rust/kernel/sync/lock.rs
@@ -7,8 +7,9 @@
use super::LockClassKey;
use crate::{
+ mem::DropGuard,
str::{CStr, CStrExt as _},
- types::{NotThreadSafe, Opaque, ScopeGuard},
+ types::{NotThreadSafe, Opaque},
};
use core::{cell::UnsafeCell, marker::PhantomPinned, pin::Pin};
use pin_init::{pin_data, pin_init, PinInit, Wrapper};
@@ -242,7 +243,7 @@ pub(crate) fn do_unlocked<U>(&mut self, cb: impl FnOnce() -> U) -> U {
// SAFETY: The caller owns the lock, so it is safe to unlock it.
unsafe { B::unlock(self.lock.state.get(), &self.state) };
- let _relock = ScopeGuard::new(||
+ let _relock = DropGuard::new((), |_|
// SAFETY: The lock was just unlocked above and is being relocked now.
unsafe { B::relock(self.lock.state.get(), &mut self.state) });
--
2.43.0
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v3 2/5] rust: mem: add DropGuard
2026-09-26 17:33 ` [PATCH v3 2/5] rust: mem: add DropGuard Mohamed Osama
@ 2026-09-26 23:53 ` Gary Guo
0 siblings, 0 replies; 7+ messages in thread
From: Gary Guo @ 2026-09-26 23:53 UTC (permalink / raw)
To: Mohamed Osama, ojeda
Cc: boqun, gary, bjorn3_gh, lossin, a.hindborg, aliceryhl, tmgross,
dakr, daniel.almeida, tamird, acourbot, work, longman, lyude,
linux-block, linux-serial, rust-for-linux, linux-kernel
On Sat Sep 26, 2026 at 6:33 PM BST, Mohamed Osama wrote:
> Add DropGuard to the Rust kernel memory module.
>
> DropGuard runs a FnOnce callback when the guard is dropped and provides
> dismiss() to take ownership of the wrapped value without running the
> cleanup callback.
>
> This follows the upstream core::mem::DropGuard API, which is being
> stabilized in Rust.
>
> Keep ScopeGuard for existing users rather than changing its API in this
> patch. Migrate the existing users that can use DropGuard to establish
> the kernel API alongside the upstream Rust API.
If you're vendoring code from standard library, please put them in std_vendor
and have it re-exported from kernel::mem please.
Also, if the code is taken directly from std with only minor changes (e.g.
removing const trait stuff and add `#[inline]`), then I don't think we need the
kunit tests.
Best,
Gary
>
> Signed-off-by: Mohamed Osama <mohamed.osama189110@gmail.com>
> ---
> rust/kernel/mem.rs | 121 +++++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 121 insertions(+)
>
> diff --git a/rust/kernel/mem.rs b/rust/kernel/mem.rs
> index f2d4cdf87d00..e7a84d15f3b3 100644
> --- a/rust/kernel/mem.rs
> +++ b/rust/kernel/mem.rs
> @@ -4,6 +4,93 @@
>
> use crate::prelude::*;
>
> +use core::mem::ManuallyDrop;
> +use core::ops::{Deref, DerefMut};
> +
> +/// Wraps a value and runs a closure when dropped.
> +///
> +/// This is useful for running cleanup code when leaving a scope.
> +///
> +/// The [`DropGuard::dismiss`] function can be used to take ownership of the wrapped
> +/// value without running the cleanup function.
> +#[doc(alias = "ScopeGuard")]
> +#[doc(alias = "defer")]
> +pub struct DropGuard<T, F>
> +where
> + F: FnOnce(T),
> +{
> + inner: ManuallyDrop<T>,
> + f: ManuallyDrop<F>,
> +}
> +
> +impl<T, F> DropGuard<T, F>
> +where
> + F: FnOnce(T),
> +{
> + /// Creates a new `DropGuard`.
> + #[inline]
> + #[must_use]
> + pub fn new(inner: T, f: F) -> Self {
> + Self {
> + inner: ManuallyDrop::new(inner),
> + f: ManuallyDrop::new(f),
> + }
> + }
> +
> + /// Consumes the `DropGuard`, returning the wrapped value without
> + /// running the cleanup function.
> + #[inline]
> + pub fn dismiss(guard: Self) -> T {
> + let mut guard = ManuallyDrop::new(guard);
> +
> + // SAFETY: We have taken ownership of the guard and prevent its destructor from running.
> + let value = unsafe { ManuallyDrop::take(&mut guard.inner) };
> +
> + // SAFETY: We have taken ownership of the guard.
> + unsafe { ManuallyDrop::drop(&mut guard.f) };
> +
> + value
> + }
> +}
> +
> +impl<T, F> Deref for DropGuard<T, F>
> +where
> + F: FnOnce(T),
> +{
> + type Target = T;
> +
> + #[inline]
> + fn deref(&self) -> &T {
> + &self.inner
> + }
> +}
> +
> +impl<T, F> DerefMut for DropGuard<T, F>
> +where
> + F: FnOnce(T),
> +{
> + #[inline]
> + fn deref_mut(&mut self) -> &mut T {
> + &mut self.inner
> + }
> +}
> +
> +impl<T, F> Drop for DropGuard<T, F>
> +where
> + F: FnOnce(T),
> +{
> + #[inline]
> + fn drop(&mut self) {
> + // SAFETY: `DropGuard` is in the process of being dropped.
> + let inner = unsafe { ManuallyDrop::take(&mut self.inner) };
> +
> + // SAFETY: `DropGuard` is in the process of being dropped.
> + let f = unsafe { ManuallyDrop::take(&mut self.f) };
> +
> + f(inner);
> + }
> +}
> +
> /// Transmute between two types.
> ///
> /// Use this instead of [`core::mem::transmute`] when it is known that sizes are identical but this
> @@ -232,3 +319,37 @@ unsafe impl AsReprMut for $signed {}
> // `usize` is not normalized to particular integer for portability.
> usize isize,
> }
> +
> +#[cfg(CONFIG_RUST_DROP_GUARD_KUNIT_TEST)]
> +#[macros::kunit_tests(rust_drop_guard)]
> +mod tests {
> + use super::*;
> +
> + #[test]
> + fn test_drop_runs_cleanup() {
> + let mut cleaned = false;
> +
> + {
> + let _guard = DropGuard::new(42, |value| {
> + assert_eq!(value, 42);
> + cleaned = true;
> + });
> + }
> +
> + assert!(cleaned);
> + }
> +
> + #[test]
> + fn test_dismiss_returns_value_without_cleanup() {
> + let mut cleaned = false;
> +
> + let guard = DropGuard::new(42, |_| {
> + cleaned = true;
> + });
> +
> + let value = DropGuard::dismiss(guard);
> +
> + assert_eq!(value, 42);
> + assert!(!cleaned);
> + }
> +}
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2026-09-26 23:53 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-09-26 17:33 [PATCH v3 0/5] rust: add DropGuard Mohamed Osama
2026-09-26 17:33 ` [PATCH v3 1/5] rust: add DropGuard KUnit test configuration Mohamed Osama
2026-09-26 17:33 ` [PATCH v3 2/5] rust: mem: add DropGuard Mohamed Osama
2026-09-26 23:53 ` Gary Guo
2026-09-26 17:33 ` [PATCH v3 3/5] rust: block: gen_disk: use DropGuard Mohamed Osama
2026-09-26 17:33 ` [PATCH v3 4/5] rust: serdev: " Mohamed Osama
2026-09-26 17:33 ` [PATCH v3 5/5] rust: sync: lock: " Mohamed Osama
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®