[PATCH 1/2] rust: kunit: add config to fail kunit tests if a lockdep warning is triggered

Malte Wechter <[email protected]>
Newsgroups org.kernel.vger.linux-kernel,org.kernel.vger.linux-kselftest,org.kernel.vger.rust-for-linux
Message-ID <[email protected]>
When running KUnit tests and a lockdep warning is triggered, the test is
still marked as passed based only on if test assertions are true.
Thus, add a Kconfig option CONFIG_RUST_LOCKDEP_KUNIT_DEBUG_LOCKS. When
this option selected, if lockdep triggers during a test, fail the test.

Signed-off-by: Malte Wechter <[email protected]>
---
 lib/kunit/Kconfig    | 13 +++++++++++++
 rust/macros/kunit.rs | 10 ++++++++++
 2 files changed, 23 insertions(+)

diff --git a/lib/kunit/Kconfig b/lib/kunit/Kconfig
index 94ff8e4089bfb..30bac00c42ce1 100644
--- a/lib/kunit/Kconfig
+++ b/lib/kunit/Kconfig
@@ -142,4 +142,17 @@ config KUNIT_UML_PCI
 
 	  If unsure, say N.
 
+config RUST_LOCKDEP_KUNIT_DEBUG_LOCKS
+	bool "Enable extra debug_locks assertion in Rust KUnit tests"
+	depends on RUST
+	depends on LOCKDEP
+	default n
+	help
+	  Adds an extra assertion to each Rust kunit test case that asserts
+	  that the debug_locks flag from `lockdep` is unchanged. This is useful
+	  when writing unit tests that could potentially trigger a lockdep warning,
+	  this makes it so the KUnit test does not succeed if the test assertions are
+	  true, but a lockdep warning is triggered.
+
+	  If unsure, say N.
 endif # KUNIT
diff --git a/rust/macros/kunit.rs b/rust/macros/kunit.rs
index ae20ed6768f15..d1cd0349f86f0 100644
--- a/rust/macros/kunit.rs
+++ b/rust/macros/kunit.rs
@@ -144,9 +144,19 @@ macro_rules! assert_eq {
                 // here to reduce the length of the assert message.
                 #(#cfg_attrs)*
                 {
+                    #[cfg(CONFIG_RUST_LOCKDEP_KUNIT_DEBUG_LOCKS)]
+                    let __debug_locks_snapshot = ::kernel::bindings::debug_locks;
+
                     (*_test).status = ::kernel::bindings::kunit_status_KUNIT_SUCCESS;
                     use ::kernel::kunit::is_test_result_ok;
                     assert!(is_test_result_ok(#test()));
+
+                    #[cfg(CONFIG_RUST_LOCKDEP_KUNIT_DEBUG_LOCKS)]
+                    {
+                        let __debug_locks_ok =
+                            ::kernel::bindings::debug_locks == __debug_locks_snapshot;
+                        assert!(__debug_locks_ok);
+                    }
                 }
             }
         });

-- 
2.51.2
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.