linux-yocto/rust/kernel
Alice Ryhl 3b8caba932 rust: maple_tree: rcu_read_lock() in destructor to silence lockdep
commit 6558749ef3405c143711cbdc67ec88cbc1582d91 upstream.

When running the Rust maple tree kunit tests with lockdep, you may trigger
a warning that looks like this:

	lib/maple_tree.c:780 suspicious rcu_dereference_check() usage!

	other info that might help us debug this:

	rcu_scheduler_active = 2, debug_locks = 1
	no locks held by kunit_try_catch/344.

	stack backtrace:
	CPU: 3 UID: 0 PID: 344 Comm: kunit_try_catch Tainted: G                 N  6.19.0-rc1+ #2 NONE
	Tainted: [N]=TEST
	Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS rel-1.17.0-0-gb52ca86e094d-prebuilt.qemu.org 04/01/2014
	Call Trace:
	 <TASK>
	 dump_stack_lvl+0x71/0x90
	 lockdep_rcu_suspicious+0x150/0x190
	 mas_start+0x104/0x150
	 mas_find+0x179/0x240
	 _RINvNtCs5QSdWC790r4_4core3ptr13drop_in_placeINtNtCs1cdwasc6FUb_6kernel10maple_tree9MapleTreeINtNtNtBL_5alloc4kbox3BoxlNtNtB1x_9allocator7KmallocEEECsgxAQYCfdR72_25doctests_kernel_generated+0xaf/0x130
	 rust_doctest_kernel_maple_tree_rs_0+0x600/0x6b0
	 ? lock_release+0xeb/0x2a0
	 ? kunit_try_catch_run+0x210/0x210
	 kunit_try_run_case+0x74/0x160
	 ? kunit_try_catch_run+0x210/0x210
	 kunit_generic_run_threadfn_adapter+0x12/0x30
	 kthread+0x21c/0x230
	 ? __do_trace_sched_kthread_stop_ret+0x40/0x40
	 ret_from_fork+0x16c/0x270
	 ? __do_trace_sched_kthread_stop_ret+0x40/0x40
	 ret_from_fork_asm+0x11/0x20
	 </TASK>

This is because the destructor of maple tree calls mas_find() without
taking rcu_read_lock() or the spinlock.  Doing that is actually ok in this
case since the destructor has exclusive access to the entire maple tree,
but it triggers a lockdep warning.  To fix that, take the rcu read lock.

In the future, it's possible that memory reclaim could gain a feature
where it reallocates entries in maple trees even if no user-code is
touching it.  If that feature is added, then this use of rcu read lock
would become load-bearing, so I did not make it conditional on lockdep.

We have to repeatedly take and release rcu because the destructor of T
might perform operations that sleep.

Link: https://lkml.kernel.org/r/20251217-maple-drop-rcu-v1-1-702af063573f@google.com
Fixes: da939ef4c4 ("rust: maple_tree: add MapleTree")
Signed-off-by: Alice Ryhl <aliceryhl@google.com>
Reported-by: Andreas Hindborg <a.hindborg@kernel.org>
Closes: https://rust-for-linux.zulipchat.com/#narrow/channel/x/topic/x/near/564215108
Reviewed-by: Gary Guo <gary@garyguo.net>
Reviewed-by: Daniel Almeida <daniel.almeida@collabora.com>
Cc: Andrew Ballance <andrewjballance@gmail.com>
Cc: Björn Roy Baron <bjorn3_gh@protonmail.com>
Cc: Boqun Feng <boqun.feng@gmail.com>
Cc: Danilo Krummrich <dakr@kernel.org>
Cc: Liam Howlett <liam.howlett@oracle.com>
Cc: Matthew Wilcox (Oracle) <willy@infradead.org>
Cc: Miguel Ojeda <ojeda@kernel.org>
Cc: Trevor Gross <tmgross@umich.edu>
Cc: <stable@vger.kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2026-01-08 10:17:11 +01:00
..
alloc rust: alloc: employ a trailing comment to keep vertical layout 2025-10-17 00:56:20 +02:00
block for-6.18/block-20250929 2025-10-02 10:16:56 -07:00
debugfs rust: debugfs: Add support for scoped directories 2025-09-10 18:58:29 +02:00
device rust: device: use kernel::{fmt,prelude::fmt!} 2025-09-16 09:26:59 +02:00
drm rust/drm/gem: Fix missing header in Object rustdoc 2026-01-02 12:57:05 +01:00
fs rust: file: add intra-doc link for 'EBADF' 2025-10-07 12:48:33 +02:00
io rust: io: add typedef for phys_addr_t 2026-01-02 12:57:05 +01:00
irq rust: irq: add &Device<Bound> argument to irq callbacks 2025-08-12 20:33:33 +02:00
list rust: list: remove nonexistent generic parameter in link 2025-07-20 19:29:19 +02:00
mm rust: mm: update ARef and AlwaysRefCounted imports from sync::aref 2025-09-13 16:55:15 -07:00
net Networking changes for 6.18. 2025-10-02 15:17:01 -07:00
pci rust: pci: display symbolic PCI vendor names 2025-09-25 15:52:00 +02:00
sync rust: condvar: fix broken intra-doc link 2025-11-02 23:18:42 +01:00
time rust: hrtimer: Add HrTimer::expires() 2025-09-04 16:54:39 +02:00
.gitignore rust: Add warn_on macro 2025-07-23 02:05:58 +02:00
acpi.rs rust: acpi: use core::ffi::CStr method names 2025-09-16 09:26:59 +02:00
alloc.rs Summary of significant series in this pull request: 2025-10-02 18:18:33 -07:00
auxiliary.rs rust: device: fix device context of Device::parent() 2025-10-17 23:24:19 +02:00
bitmap.rs rust: bitmap: fix formatting 2025-10-17 13:02:22 +02:00
bits.rs rust: bits: add support for bits/genmask macros 2025-07-19 23:18:18 +02:00
block.rs rust: block: add block related constants 2025-09-02 05:23:56 -06:00
bug.rs rust: Add warn_on macro 2025-07-23 02:05:58 +02:00
build_assert.rs
clk.rs Rust changes for v6.17 2025-08-03 13:49:10 -07:00
configfs.rs for-6.18/block-20250929 2025-10-02 10:16:56 -07:00
cpu.rs rust: kernel: cpu: mark CpuId::current() inline 2025-09-14 23:58:45 +02:00
cpufreq.rs rust: cpufreq: fix formatting 2025-10-17 00:56:20 +02:00
cpumask.rs rust: cpumask: Mark CpumaskVar as transparent 2025-08-14 09:55:47 +05:30
cred.rs Char/Misc/IIO/Binder changes for 6.18-rc1 2025-10-04 16:26:32 -07:00
debugfs.rs rust: debugfs: Add support for scoped directories 2025-09-10 18:58:29 +02:00
device_id.rs modpost: Add modname to mod_device_table alias 2025-09-24 09:10:45 -07:00
device.rs rust: device: fix device context of Device::parent() 2025-10-17 23:24:19 +02:00
devres.rs rust: io: add typedef for phys_addr_t 2026-01-02 12:57:05 +01:00
dma.rs dma-mapping updates for Linux 6.18: 2025-10-03 17:41:12 -07:00
driver.rs driver: rust: expand documentation for driver infrastructure 2025-08-12 15:23:49 +02:00
error.rs rust: error: improve to_result documentation 2025-09-10 00:10:10 +02:00
faux.rs rust: faux: fix C header link 2025-08-13 17:40:28 +02:00
firmware.rs rust: firmware: use core::ffi::CStr method names 2025-09-16 09:26:59 +02:00
fmt.rs rust: kernel: add fmt module 2025-07-21 01:16:35 +02:00
fs.rs rust: fs: add Kiocb struct 2025-09-06 13:27:20 +02:00
generated_arch_reachable_asm.rs.S rust: Add warn_on macro 2025-07-23 02:05:58 +02:00
generated_arch_static_branch_asm.rs.S
generated_arch_warn_asm.rs.S rust: Add warn_on macro 2025-07-23 02:05:58 +02:00
id_pool.rs rust: add dynamic ID pool abstraction for bitmap 2025-09-22 15:52:44 -04:00
init.rs Rust changes for v6.17 2025-08-03 13:49:10 -07:00
io.rs rust: io: add typedef for phys_addr_t 2026-01-02 12:57:05 +01:00
ioctl.rs
iov.rs rust: iov: add iov_iter abstractions for ITER_DEST 2025-09-06 13:27:20 +02:00
irq.rs rust: irq: add support for threaded IRQs and handlers 2025-08-12 20:22:09 +02:00
jump_label.rs
kunit.rs linux_kselftest-kunit-6.18-rc1 2025-10-01 19:15:11 -07:00
lib.rs Char/Misc/IIO/Binder changes for 6.18-rc1 2025-10-04 16:26:32 -07:00
list.rs rust: list: Add an example for ListLinksSelfPtr usage 2025-09-15 01:10:23 +02:00
maple_tree.rs rust: maple_tree: rcu_read_lock() in destructor to silence lockdep 2026-01-08 10:17:11 +01:00
miscdevice.rs Char/Misc/IIO/Binder changes for 6.18-rc1 2025-10-04 16:26:32 -07:00
mm.rs rust: mm: update ARef and AlwaysRefCounted imports from sync::aref 2025-09-13 16:55:15 -07:00
net.rs
of.rs rust: of: use core::ffi::CStr method names 2025-09-16 09:26:59 +02:00
opp.rs Merge branches 'pm-em', 'pm-opp' and 'pm-devfreq' 2025-09-29 12:30:44 +02:00
page.rs Char/Misc/IIO/Binder changes for 6.18-rc1 2025-10-04 16:26:32 -07:00
pci.rs rust: pci: fix incorrect platform reference in PCI driver probe doc comment 2025-09-17 12:51:13 +02:00
pid_namespace.rs rust: pid_namespace: update AlwaysRefCounted imports from sync::aref 2025-08-19 13:08:41 +02:00
platform.rs rust: driver-core: Update ARef and AlwaysRefCounted imports from sync::aref 2025-08-15 22:34:41 +02:00
prelude.rs rust: prelude: re-export core::mem::{align,size}_of{,_val} 2025-09-08 00:11:19 +02:00
print.rs rust: use kernel::{fmt,prelude::fmt!} 2025-07-21 01:16:35 +02:00
processor.rs rust: Add cpu_relax() helper 2025-08-21 16:58:07 +02:00
ptr.rs rust: add Alignment type 2025-09-22 23:55:41 +02:00
rbtree.rs
regulator.rs rust: regulator: add devm_enable and devm_enable_optional 2025-09-10 21:02:16 +01:00
revocable.rs Rust changes for v6.17 2025-08-03 13:49:10 -07:00
scatterlist.rs rust: scatterlist: Add abstraction for sg_table 2025-09-04 23:33:50 +02:00
security.rs rust_binder: add Rust Binder driver 2025-09-19 09:40:46 +02:00
seq_file.rs rust: seq_file: use kernel::{fmt,prelude::fmt!} 2025-09-16 09:26:59 +02:00
sizes.rs
static_assert.rs
std_vendor.rs
str.rs rust: block: use NullTerminatedFormatter 2025-09-02 05:23:56 -06:00
sync.rs rust: implement kernel::sync::Refcount 2025-09-15 09:38:35 +02:00
task.rs rust: task: update ARef and AlwaysRefCounted imports from sync::aref 2025-09-08 00:11:19 +02:00
time.rs rust: time: Implement basic arithmetic operations for Delta 2025-09-04 16:56:48 +02:00
tracepoint.rs
transmute.rs rust: transmute: add from_bytes_copy method to FromBytes trait 2025-08-28 22:31:17 +09:00
types.rs Rust changes for v6.17 2025-08-03 13:49:10 -07:00
uaccess.rs
usb.rs rust: usb: keep usb::Device private for now 2025-09-26 08:09:08 +02:00
workqueue.rs rust: pin-init: add pin projections to #[pin_data] 2025-09-11 23:26:20 +02:00
xarray.rs