File tree Expand file tree Collapse file tree 5 files changed +63
-0
lines changed Expand file tree Collapse file tree 5 files changed +63
-0
lines changed Original file line number Diff line number Diff line change @@ -19690,6 +19690,7 @@ T: git git://git.kernel.org/pub/scm/linux/kernel/git/paulmck/linux-rcu.git dev
1969019690F: Documentation/RCU/
1969119691F: include/linux/rcu*
1969219692F: kernel/rcu/
19693+ F: rust/kernel/sync/rcu.rs
1969319694X: Documentation/RCU/torture.rst
1969419695X: include/linux/srcu*.h
1969519696X: kernel/rcu/srcu*.c
Original file line number Diff line number Diff line change 2020#include "page.c"
2121#include "pid_namespace.c"
2222#include "rbtree.c"
23+ #include "rcu.c"
2324#include "refcount.c"
2425#include "security.c"
2526#include "signal.c"
Original file line number Diff line number Diff line change 1+ // SPDX-License-Identifier: GPL-2.0
2+
3+ #include <linux/rcupdate.h>
4+
5+ void rust_helper_rcu_read_lock (void )
6+ {
7+ rcu_read_lock ();
8+ }
9+
10+ void rust_helper_rcu_read_unlock (void )
11+ {
12+ rcu_read_unlock ();
13+ }
Original file line number Diff line number Diff line change @@ -12,6 +12,7 @@ mod condvar;
1212pub mod lock;
1313mod locked_by;
1414pub mod poll;
15+ pub mod rcu;
1516
1617pub use arc:: { Arc , ArcBorrow , UniqueArc } ;
1718pub use condvar:: { new_condvar, CondVar , CondVarTimeoutResult } ;
Original file line number Diff line number Diff line change 1+ // SPDX-License-Identifier: GPL-2.0
2+
3+ //! RCU support.
4+ //!
5+ //! C header: [`include/linux/rcupdate.h`](srctree/include/linux/rcupdate.h)
6+
7+ use crate :: { bindings, types:: NotThreadSafe } ;
8+
9+ /// Evidence that the RCU read side lock is held on the current thread/CPU.
10+ ///
11+ /// The type is explicitly not `Send` because this property is per-thread/CPU.
12+ ///
13+ /// # Invariants
14+ ///
15+ /// The RCU read side lock is actually held while instances of this guard exist.
16+ pub struct Guard ( NotThreadSafe ) ;
17+
18+ impl Guard {
19+ /// Acquires the RCU read side lock and returns a guard.
20+ pub fn new ( ) -> Self {
21+ // SAFETY: An FFI call with no additional requirements.
22+ unsafe { bindings:: rcu_read_lock ( ) } ;
23+ // INVARIANT: The RCU read side lock was just acquired above.
24+ Self ( NotThreadSafe )
25+ }
26+
27+ /// Explicitly releases the RCU read side lock.
28+ pub fn unlock ( self ) { }
29+ }
30+
31+ impl Default for Guard {
32+ fn default ( ) -> Self {
33+ Self :: new ( )
34+ }
35+ }
36+
37+ impl Drop for Guard {
38+ fn drop ( & mut self ) {
39+ // SAFETY: By the type invariants, the RCU read side is locked, so it is ok to unlock it.
40+ unsafe { bindings:: rcu_read_unlock ( ) } ;
41+ }
42+ }
43+
44+ /// Acquires the RCU read side lock.
45+ pub fn read_lock ( ) -> Guard {
46+ Guard :: new ( )
47+ }
You can’t perform that action at this time.
0 commit comments