File tree Expand file tree Collapse file tree 4 files changed +62
-0
lines changed Expand file tree Collapse file tree 4 files changed +62
-0
lines changed Original file line number Diff line number Diff line change 20
20
#include "page.c"
21
21
#include "pid_namespace.c"
22
22
#include "rbtree.c"
23
+ #include "rcu.c"
23
24
#include "refcount.c"
24
25
#include "security.c"
25
26
#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;
12
12
pub mod lock;
13
13
mod locked_by;
14
14
pub mod poll;
15
+ pub mod rcu;
15
16
16
17
pub use arc:: { Arc , ArcBorrow , UniqueArc } ;
17
18
pub 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