From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id E28A7CD11DB for ; Fri, 22 Mar 2024 23:39:36 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-ID:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=1c1IUuZkcyXQzWbi54LTV7AIsk6nQpyF4fXMop7F6Aw=; b=Kl4uj1nN329VbK BvtBmtC2SJZv3CaSffP7MohopHoAozbKONkQNKzc03Xg3vY3Vophn3WESVHajjzI2JJtpJcIAaR9W S+7XEetCKZeeJyaQkhcAzadOe0dd7+IjVNRt0ipt31YAxZp+zp7SF0xn1zuSjPVPbYg0ImBDe+QaO Kcy0U4BnWbq27U4XuF3/xilG9YG4snAOvwjfpf3iYYGCuCcoGmXWW6UqOBB+bw2QvxojEP628ilVW 14DpK0ZLTnEbLuDRHKZaZ+/M7AoY7L+XaNMrym1QEzlvu+Eac6ju5yfvnmT52db3eTMCq4zUfo4eB Xrm84k19oq/x+ajbQgxQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.97.1 #2 (Red Hat Linux)) id 1rnoTq-00000008vve-0aYZ; Fri, 22 Mar 2024 23:39:22 +0000 Received: from mail-qv1-xf36.google.com ([2607:f8b0:4864:20::f36]) by bombadil.infradead.org with esmtps (Exim 4.97.1 #2 (Red Hat Linux)) id 1rnoTf-00000008vph-3S7A for linux-arm-kernel@lists.infradead.org; Fri, 22 Mar 2024 23:39:13 +0000 Received: by mail-qv1-xf36.google.com with SMTP id 6a1803df08f44-6963cf14771so23910036d6.3 for ; Fri, 22 Mar 2024 16:39:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1711150749; x=1711755549; darn=lists.infradead.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:feedback-id:from:to:cc:subject :date:message-id:reply-to; bh=CMsNwHviwi/fcgZpZ6hEf/r33sW+GCsEsvaN1TfyKyc=; b=LBZ+ne262m1n/xMlOC0a6JfbIDpDEr8ydfFYxL6/RHrG1igTSjjW3sHKsKL/RtH4UU J/yDkDew0Yf1UoF3dC0Kf5vESCEEpOIIUq/pvYaLDvBGbhOuOHkpe76MTJObM0P5Kg6r WijfFaUx5u69cL4MTAmIcr26eeXgcK1zMZVMOqvKJw4hYgaTsHxy+sF4JxZ9d0FkMoop /LXEPFedX175ZeJM7OBV+0ltTzMFrNu2bcwQMTEYnLtBZwxhNE5twRjm74p9h0mLzL5T O3AzWW+fyWKCnWbEZ2NArZaNkzGyZPWrN9BVDUme1rOqN+bFdLpV2FRCphLri+ESCA5i Oj+g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1711150749; x=1711755549; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:feedback-id:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; bh=CMsNwHviwi/fcgZpZ6hEf/r33sW+GCsEsvaN1TfyKyc=; b=fZN/TKthY9wVXtmmN06A7vKDtNDvbzgT3wWlh/2HDuGLqfn1l0etn5Tc4B6oCuIHHy cxkahn/mPvF2eL/+rH6DetoPLtddqChuewyZo/EaEBSlDP1TvywCVsrFrP5N1Mhzm6wp xTrZzcBX5Ju/oIvtns7CVHUGiCrNkHlz/LjI3RB+rGDkvCnZ8H9wDJzdW0UWvatVv8un USaOw6eeS9AFh7cv5OU961gf8ALT16TFqe04jVmDaXJBvYI3d1dChAFSLhsoouZT2Xwe Pr6LY/vy9yaSrLESF58eT1krdyUHgFdGmZOstWXob9RRuqf/+Mtr62xuE9FihbjBsaby oi1Q== X-Forwarded-Encrypted: i=1; AJvYcCWN1zc/N7UwqMlT//FXMNLfx/1+3wW2f5ZS2eXXNJ3+hDKbuOTPSZ7j/Mm5NA/Y6w53urKDNE5Gs1JI9KAPv5q5g9GOaSv+exPIi0YEtK/La94CoyU= X-Gm-Message-State: AOJu0YzzCjvX/b/WaLRBz/HYqHpU7tyykkvYkujhvuCWThqm/H29l+qf BAT1Ir1JDCvyXQDylnXPJfHO/0xfOPxevRuUaH61Ltu/3istyh4Q X-Google-Smtp-Source: AGHT+IHZ+NuIYKcs3sHrLWDGnicqM7RhyyK/vWc/KL6bEIvyatErGn/eE74OoTUwRrPjNflkhje49A== X-Received: by 2002:ad4:5ba9:0:b0:696:1ffd:a32c with SMTP id 9-20020ad45ba9000000b006961ffda32cmr714687qvq.31.1711150749485; Fri, 22 Mar 2024 16:39:09 -0700 (PDT) Received: from fauth1-smtp.messagingengine.com (fauth1-smtp.messagingengine.com. [103.168.172.200]) by smtp.gmail.com with ESMTPSA id mx17-20020a0562142e1100b0069679a663e6sm105329qvb.21.2024.03.22.16.39.08 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 22 Mar 2024 16:39:09 -0700 (PDT) Received: from compute1.internal (compute1.nyi.internal [10.202.2.41]) by mailfauth.nyi.internal (Postfix) with ESMTP id 2EC3C1200032; Fri, 22 Mar 2024 19:39:08 -0400 (EDT) Received: from mailfrontend1 ([10.202.2.162]) by compute1.internal (MEProxy); Fri, 22 Mar 2024 19:39:08 -0400 X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgedvledruddtfedgudefucetufdoteggodetrfdotf fvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfqfgfvpdfurfetoffkrfgpnffqhgen uceurghilhhouhhtmecufedttdenucesvcftvggtihhpihgvnhhtshculddquddttddmne cujfgurhephffvvefufffkofgjfhgggfestdekredtredttdenucfhrhhomhepuehoqhhu nhcuhfgvnhhguceosghoqhhunhdrfhgvnhhgsehgmhgrihhlrdgtohhmqeenucggtffrrg htthgvrhhnpeegleejiedthedvheeggfejveefjeejkefgveffieeujefhueeigfegueeh geeggfenucevlhhushhtvghrufhiiigvpedtnecurfgrrhgrmhepmhgrihhlfhhrohhmpe gsohhquhhnodhmvghsmhhtphgruhhthhhpvghrshhonhgrlhhithihqdeiledvgeehtdei gedqudejjeekheehhedvqdgsohhquhhnrdhfvghngheppehgmhgrihhlrdgtohhmsehfih igmhgvrdhnrghmvg X-ME-Proxy: Feedback-ID: iad51458e:Fastmail Received: by mail.messagingengine.com (Postfix) with ESMTPA; Fri, 22 Mar 2024 19:39:06 -0400 (EDT) From: Boqun Feng To: rust-for-linux@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arch@vger.kernel.org, llvm@lists.linux.dev Cc: Miguel Ojeda , Alex Gaynor , Wedson Almeida Filho , Boqun Feng , Gary Guo , =?UTF-8?q?Bj=C3=B6rn=20Roy=20Baron?= , Benno Lossin , Andreas Hindborg , Alice Ryhl , Alan Stern , Andrea Parri , Will Deacon , Peter Zijlstra , Nicholas Piggin , David Howells , Jade Alglave , Luc Maranget , "Paul E. McKenney" , Akira Yokosawa , Daniel Lustig , Joel Fernandes , Nathan Chancellor , Nick Desaulniers , kent.overstreet@gmail.com, Greg Kroah-Hartman , elver@google.com, Mark Rutland , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Catalin Marinas , torvalds@linux-foundation.org, linux-arm-kernel@lists.infradead.org, linux-fsdevel@vger.kernel.org Subject: [WIP 1/3] rust: Introduce atomic module Date: Fri, 22 Mar 2024 16:38:36 -0700 Message-ID: <20240322233838.868874-2-boqun.feng@gmail.com> X-Mailer: git-send-email 2.44.0 In-Reply-To: <20240322233838.868874-1-boqun.feng@gmail.com> References: <20240322233838.868874-1-boqun.feng@gmail.com> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20240322_163911_927900_67DEFCA5 X-CRM114-Status: GOOD ( 21.24 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org Although Rust has its own memory ordering model (in the standard C++ memory model), having two models is not wise to start with: it increases the difficulty for correctness reasoning. Since we use Linux Kernel Memory Model for C code in kernel, it makes sense that Rust code also uses LKMM, therefore introduce a module to provide LKMM atomic primitives. Signed-off-by: Boqun Feng --- rust/kernel/sync.rs | 1 + rust/kernel/sync/atomic.rs | 42 ++++++++++++++++++++++++++++ rust/kernel/sync/atomic/arch.rs | 9 ++++++ rust/kernel/sync/atomic/arch/x86.rs | 43 +++++++++++++++++++++++++++++ 4 files changed, 95 insertions(+) create mode 100644 rust/kernel/sync/atomic.rs create mode 100644 rust/kernel/sync/atomic/arch.rs create mode 100644 rust/kernel/sync/atomic/arch/x86.rs diff --git a/rust/kernel/sync.rs b/rust/kernel/sync.rs index c983f63fd56e..dc2d26712f26 100644 --- a/rust/kernel/sync.rs +++ b/rust/kernel/sync.rs @@ -8,6 +8,7 @@ use crate::types::Opaque; mod arc; +pub mod atomic; mod condvar; pub mod lock; mod locked_by; diff --git a/rust/kernel/sync/atomic.rs b/rust/kernel/sync/atomic.rs new file mode 100644 index 000000000000..280040705fb0 --- /dev/null +++ b/rust/kernel/sync/atomic.rs @@ -0,0 +1,42 @@ +// SPDX-License-Identifier: GPL-2.0 + +//! Atomic and barrier primitives. +//! +//! These primitives should have the same semantics as their C counterparts, for precise definitions +//! of the semantics, please refer to tools/memory-model. Note that Linux Kernel Memory +//! (Consistency) Model is the only model for Rust development in kernel right now, please avoid to +//! use Rust's own atomics. + +use core::cell::UnsafeCell; + +mod arch; + +/// An atomic `i32`. +pub struct AtomicI32(pub(crate) UnsafeCell); + +impl AtomicI32 { + /// Creates a new atomic value. + pub fn new(v: i32) -> Self { + Self(UnsafeCell::new(v)) + } + + /// Adds `i` to the atomic variable with RELAXED ordering. + /// + /// Returns the old value before the add. + /// + /// # Example + /// + /// ```rust + /// use kernel::sync::atomic::AtomicI32; + /// + /// let a = AtomicI32::new(0); + /// let b = a.fetch_add_relaxed(1); + /// let c = a.fetch_add_relaxed(2); + /// + /// assert_eq!(b, 0); + /// assert_eq!(c, 1); + /// ``` + pub fn fetch_add_relaxed(&self, i: i32) -> i32 { + arch::i32_fetch_add_relaxed(&self.0, i) + } +} diff --git a/rust/kernel/sync/atomic/arch.rs b/rust/kernel/sync/atomic/arch.rs new file mode 100644 index 000000000000..3eb5a103a69a --- /dev/null +++ b/rust/kernel/sync/atomic/arch.rs @@ -0,0 +1,9 @@ +// SPDX-License-Identifier: GPL-2.0 + +//! Architectural atomic and barrier primitives. + +#[cfg(CONFIG_X86)] +pub(crate) use x86::*; + +#[cfg(CONFIG_X86)] +pub(crate) mod x86; diff --git a/rust/kernel/sync/atomic/arch/x86.rs b/rust/kernel/sync/atomic/arch/x86.rs new file mode 100644 index 000000000000..2d715f740b22 --- /dev/null +++ b/rust/kernel/sync/atomic/arch/x86.rs @@ -0,0 +1,43 @@ +// SPDX-License-Identifier: GPL-2.0 + +//! x86 implementation for atomic and barrier primitives. + +use core::arch::asm; +use core::cell::UnsafeCell; + +/// Generates an instruction with "lock" prefix. +#[cfg(CONFIG_SMP)] +macro_rules! lock_instr { + ($i:literal) => { concat!("lock; ", $i) } +} + +#[cfg(not(CONFIG_SMP))] +macro_rules! lock_instr { + ($i:literal) => { $i } +} + +/// Atomically exchanges and adds `i` to `*v` in a wrapping way. +/// +/// Return the old value before the addition. +/// +/// # Safety +/// +/// The caller need to make sure `v` points to a valid `i32`. +unsafe fn i32_xadd(v: *mut i32, mut i: i32) -> i32 { + // SAFETY: Per function safety requirement, the address of `v` is valid for "xadd". + unsafe { + asm!( + lock_instr!("xaddl {i:e}, ({v})"), + i = inout(reg) i, + v = in(reg) v, + options(att_syntax, preserves_flags), + ); + } + + i +} + +pub(crate) fn i32_fetch_add_relaxed(v: &UnsafeCell, i: i32) -> i32 { + // SAFETY: `v.get()` points to a valid `i32`. + unsafe { i32_xadd(v.get(), i) } +} -- 2.44.0 _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel