Commit 51158207 authored by Wedson Almeida Filho's avatar Wedson Almeida Filho Committed by Greg Kroah-Hartman
Browse files

rust: add rcu abstraction



Add a simple abstraction to guard critical code sections with an rcu
read lock.

Reviewed-by: default avatarBoqun Feng <boqun.feng@gmail.com>
Signed-off-by: default avatarWedson Almeida Filho <wedsonaf@gmail.com>
Co-developed-by: default avatarDanilo Krummrich <dakr@kernel.org>
Signed-off-by: default avatarDanilo Krummrich <dakr@kernel.org>
Tested-by: default avatarDirk Behme <dirk.behme@de.bosch.com>
Tested-by: default avatarFabien Parent <fabien.parent@linaro.org>
Link: https://lore.kernel.org/r/20241219170425.12036-5-dakr@kernel.org


Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 9b90864b
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -19691,6 +19691,7 @@ T: git git://git.kernel.org/pub/scm/linux/kernel/git/paulmck/linux-rcu.git dev
F:	Documentation/RCU/
F:	include/linux/rcu*
F:	kernel/rcu/
F:	rust/kernel/sync/rcu.rs
X:	Documentation/RCU/torture.rst
X:	include/linux/srcu*.h
X:	kernel/rcu/srcu*.c
+1 −0
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@
#include "page.c"
#include "pid_namespace.c"
#include "rbtree.c"
#include "rcu.c"
#include "refcount.c"
#include "security.c"
#include "signal.c"

rust/helpers/rcu.c

0 → 100644
+13 −0
Original line number Diff line number Diff line
// SPDX-License-Identifier: GPL-2.0

#include <linux/rcupdate.h>

void rust_helper_rcu_read_lock(void)
{
	rcu_read_lock();
}

void rust_helper_rcu_read_unlock(void)
{
	rcu_read_unlock();
}
+1 −0
Original line number Diff line number Diff line
@@ -12,6 +12,7 @@
pub mod lock;
mod locked_by;
pub mod poll;
pub mod rcu;

pub use arc::{Arc, ArcBorrow, UniqueArc};
pub use condvar::{new_condvar, CondVar, CondVarTimeoutResult};
+47 −0
Original line number Diff line number Diff line
// SPDX-License-Identifier: GPL-2.0

//! RCU support.
//!
//! C header: [`include/linux/rcupdate.h`](srctree/include/linux/rcupdate.h)

use crate::{bindings, types::NotThreadSafe};

/// Evidence that the RCU read side lock is held on the current thread/CPU.
///
/// The type is explicitly not `Send` because this property is per-thread/CPU.
///
/// # Invariants
///
/// The RCU read side lock is actually held while instances of this guard exist.
pub struct Guard(NotThreadSafe);

impl Guard {
    /// Acquires the RCU read side lock and returns a guard.
    pub fn new() -> Self {
        // SAFETY: An FFI call with no additional requirements.
        unsafe { bindings::rcu_read_lock() };
        // INVARIANT: The RCU read side lock was just acquired above.
        Self(NotThreadSafe)
    }

    /// Explicitly releases the RCU read side lock.
    pub fn unlock(self) {}
}

impl Default for Guard {
    fn default() -> Self {
        Self::new()
    }
}

impl Drop for Guard {
    fn drop(&mut self) {
        // SAFETY: By the type invariants, the RCU read side is locked, so it is ok to unlock it.
        unsafe { bindings::rcu_read_unlock() };
    }
}

/// Acquires the RCU read side lock.
pub fn read_lock() -> Guard {
    Guard::new()
}