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 kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id D3B13C83F1D for ; Sun, 13 Jul 2025 09:30:40 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 61B386B007B; Sun, 13 Jul 2025 05:30:40 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 5CC916B0088; Sun, 13 Jul 2025 05:30:40 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 494166B0089; Sun, 13 Jul 2025 05:30:40 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0017.hostedemail.com [216.40.44.17]) by kanga.kvack.org (Postfix) with ESMTP id 2B3316B007B for ; Sun, 13 Jul 2025 05:30:40 -0400 (EDT) Received: from smtpin22.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay06.hostedemail.com (Postfix) with ESMTP id BEFC910B5F1 for ; Sun, 13 Jul 2025 09:30:39 +0000 (UTC) X-FDA: 83658721398.22.C6AE63C Received: from dfw.source.kernel.org (dfw.source.kernel.org [139.178.84.217]) by imf24.hostedemail.com (Postfix) with ESMTP id 12607180005 for ; Sun, 13 Jul 2025 09:30:37 +0000 (UTC) Authentication-Results: imf24.hostedemail.com; dkim=pass header.d=kernel.org header.s=k20201202 header.b=SJ1oCnWP; spf=pass (imf24.hostedemail.com: domain of lossin@kernel.org designates 139.178.84.217 as permitted sender) smtp.mailfrom=lossin@kernel.org; dmarc=pass (policy=quarantine) header.from=kernel.org ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1752399038; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=AycNQonYzbHMm9sc364/onAy8dLgHKmuchEp5IHTmko=; b=Lme/vMIcUhGUHahfkdOaPPC5l07ghknktVlw2ma8mU6fCT972DbAtYpeT3It4wXUqLbyC1 OrSYClV0IB97l8p4HQly+hOjdAG9chJXGDQfmcUQ/dcHG/2PT2ug1Pfi03T2YEyGGD8NbK qfAeyl1Y21cSUnBq80vPUVrauim7pKw= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1752399038; a=rsa-sha256; cv=none; b=RiZ2CjWOm6rbHMEt/AcLlcgac0ulZEP+HOGcjLEwchlE7mlZKOyE15DIiNCjr2u7NcYsbR W1Hw8tePUEXaqn+4JRIFh5nuvPtCqFUGoFYiFfM08izzDsrusMQu8T8zE9TqubRBrPc0vo NIUdZeiIR7WjmWaSk4tQHdG3xJQdSUw= ARC-Authentication-Results: i=1; imf24.hostedemail.com; dkim=pass header.d=kernel.org header.s=k20201202 header.b=SJ1oCnWP; spf=pass (imf24.hostedemail.com: domain of lossin@kernel.org designates 139.178.84.217 as permitted sender) smtp.mailfrom=lossin@kernel.org; dmarc=pass (policy=quarantine) header.from=kernel.org Received: from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58]) by dfw.source.kernel.org (Postfix) with ESMTP id 2FB935C570C; Sun, 13 Jul 2025 09:30:37 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 97E85C4CEE3; Sun, 13 Jul 2025 09:30:33 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1752399036; bh=nKbk6E47aaqEXS0XKE/C976P4mu6SktTQNRnupN5EMs=; h=Date:Cc:Subject:From:To:References:In-Reply-To:From; b=SJ1oCnWP7GGo8/oqSsTzDM10/zjCsKRghHncNrZIA3H/wDMnv8HVZPRB5ioeqc8QU x9XPmnpk4ANH8f44LGVmCp69KXLzaLYp2DCDxpieBqJUcjcQPmB1Pb/lxS8oD3RW9e XaSJYkvOTecnQetUNKlAaHJY8dBxuK4ckCZoCmPBeX3CBiazFnOQuFyAvrlsyp/jhS lGIa3GJnJEvs3ewACwYm6ZxSHgC3RpabeRtsxU5GJfmw1ryO/qXnIj074S/oA59xmY C7d+K7CFrFmUPAACLDtykOfLIzl4UXAtLBBB8lo0gwfhUl3lVlBM9PNbO9OSjuHKAk 3l8iNb+AtNJdg== Mime-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=UTF-8 Date: Sun, 13 Jul 2025 11:30:31 +0200 Message-Id: Cc: , , Subject: Re: [PATCH v2 3/5] rust: percpu: add a rust per-CPU variable test From: "Benno Lossin" To: "Mitchell Levy" , "Miguel Ojeda" , "Alex Gaynor" , "Boqun Feng" , "Gary Guo" , =?utf-8?q?Bj=C3=B6rn_Roy_Baron?= , "Andreas Hindborg" , "Alice Ryhl" , "Trevor Gross" , "Andrew Morton" , "Dennis Zhou" , "Tejun Heo" , "Christoph Lameter" , "Danilo Krummrich" X-Mailer: aerc 0.20.1 References: <20250712-rust-percpu-v2-0-826f2567521b@gmail.com> <20250712-rust-percpu-v2-3-826f2567521b@gmail.com> In-Reply-To: <20250712-rust-percpu-v2-3-826f2567521b@gmail.com> X-Rspamd-Queue-Id: 12607180005 X-Rspam-User: X-Rspamd-Server: rspam09 X-Stat-Signature: y35xey1rj53hucs5mds65sue8sb877nz X-HE-Tag: 1752399037-424836 X-HE-Meta: U2FsdGVkX18cKJ27jEBtG2z6G3NLFGVq0y3ubE3yaYko+6mCA1zqFbs2njUCIXSdNFBx6nsRikyXMly+XIngsUT7820Bl21OH2qZ+GO8dEi3nzraNLDVt6jM3P7EwplQTXqKqO51QC58B2TNdNewLMxCpb57bamY1XTxikZMK9XO1Ug1X71hAXrquVsBDz9u8m/KH8d1TnDLRsfen7SuNb12O0KoMQrb3NlzzulcYe1Az9mC7aMeZJBJFohaCNhl8joduRgQewXsPkLEYursIK2ghW+ClmDjTbEYsYlkefp/xaMVdZf3AeppHCK37n9CzIuerFeP86mKyfR4fgH3atH+TQDqdNlNWgnJDSZ0RIWwFxDJXW6IcIr5wE652xwY78zjPlM85D8DMDtO05/4M7ykdQ0Qpe692jhsXJcq6pzD7u/UTDEsXMziPTBkrnL8HhcX74mGET7wZhNxzxLFwa5TnHtvH+IXmCyMONr+YPAtvcNHU/deAFmZFwCyeRvLZE6868yB5kJJ5jj4w2330YZeItviKLOAPvmTlyjRwMGbJtu7Nsy4LGbx/LCMtJBhH3+SZu2eFMhS1vQ3eAj3htGdc9elDOrQZPlJKhEOzM04naWnJksDQlD95cVygLDwRJz8aAwdhaqjXAtu5wF+Xw2saxilDdPOtNoDzwO3uY7u8gesERJy4IaJu8bAAYh3vtaomXsoB7FTe8jGmsx2HvPGZspatI7y2Cpf+PJiSwjdBJaNsdckizlw1Gu1YaBckC4HM0wwkPLkWDu9FEqlLSeDhTWcZiFJPyZ/EvNBS4/LYzBKvY8BVT3aMtvbp8tq8nkPkUgY6jPszKJpj6erWH3WOeURvqVcz5bEaT1u8AvaKiW2LeBk0MS4R5qi5M8gJTIMtNWgc4qZNSifqoy5rpg4bePneDPam2VccIVNiqxCuuuLEkE8UZBqsoZEWeMHyJsDO3vK4mWRKggIQnE k5Y0puNB NP6+BEPKxkvcYieYHxORlikDzkACRJ3vkPEUgRidoNUisz8g0nvh7J6efbeMn96Yz1S+3I/8IoHustFmbj8AVdG6IhT7MkMHUefeTfhKzQ++zLggAC+fvHv1UWo8icggYWNrOsNmh1mw3WR1rb/dLXICHYxsPKShW90TulhNxqVBoENTJUbQ2gGPZv4b2hCHzKtftPa6z56/sKlUl6OPlpsOeLkwDCnaAtMgo2OWZ82fnL+pmy9E5aDKhtsny1bB2SlcfF6bh6Wr3gIxitMZbIzDI34qyXHkeCOk7kCQY1d+ruBlb/70EwZBkmgcSaN9kwCMSPj7x0F4Cf4KbPcpW2BIUP6CmBPCitbEbklRsIv9GUTsdbq6aLzwQk3kXVw4gTJMn5phNj7llVzpegjwvX7cqrR5GjWJ+g3c9yxnFCVCeDyk= X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: On Sat Jul 12, 2025 at 11:31 PM CEST, Mitchell Levy wrote: > Add a short exercise for Rust's per-CPU variable API, modelled after > lib/percpu_test.c > > Signed-off-by: Mitchell Levy > --- > lib/Kconfig.debug | 9 ++++ > lib/Makefile | 1 + > lib/percpu_test_rust.rs | 120 ++++++++++++++++++++++++++++++++++++++++++= ++++++ I don't know if this is the correct place, the code looks much more like a sample, so why not place it there instead? > rust/helpers/percpu.c | 11 +++++ > 4 files changed, 141 insertions(+) > diff --git a/lib/percpu_test_rust.rs b/lib/percpu_test_rust.rs > new file mode 100644 > index 000000000000..a9652e6ece08 > --- /dev/null > +++ b/lib/percpu_test_rust.rs > @@ -0,0 +1,120 @@ > +// SPDX-License-Identifier: GPL-2.0 > +//! A simple self test for the rust per-CPU API. > + > +use core::ffi::c_void; > + > +use kernel::{ > + bindings::{on_each_cpu, smp_processor_id}, > + define_per_cpu, > + percpu::{cpu_guard::*, *}, > + pr_info, > + prelude::*, > + unsafe_get_per_cpu, > +}; > + > +module! { > + type: PerCpuTestModule, > + name: "percpu_test_rust", > + author: "Mitchell Levy", > + description: "Test code to exercise the Rust Per CPU variable API", > + license: "GPL v2", > +} > + > +struct PerCpuTestModule; > + > +define_per_cpu!(PERCPU: i64 =3D 0); > +define_per_cpu!(UPERCPU: u64 =3D 0); > + > +impl kernel::Module for PerCpuTestModule { > + fn init(_module: &'static ThisModule) -> Result { > + pr_info!("rust percpu test start\n"); > + > + let mut native: i64 =3D 0; > + // SAFETY: PERCPU is properly defined > + let mut pcpu: StaticPerCpu =3D unsafe { unsafe_get_per_cpu!= (PERCPU) }; I don't understand why we need unsafe here, can't we just create something specially in the `define_per_cpu` macro that is then confirmed by the `get_per_cpu!` macro and thus it can be safe? > + // SAFETY: We only have one PerCpu that points at PERCPU > + unsafe { pcpu.get(CpuGuard::new()) }.with(|val: &mut i64| { Hmm I also don't like the unsafe part here... Can't we use the same API that `thread_local!` in the standard library has: https://doc.rust-lang.org/std/macro.thread_local.html So in this example you would store a `Cell` instead. I'm not familiar with per CPU variables, but if you're usually storing `Copy` types, then this is much better wrt not having unsafe code everywhere. If one also often stores `!Copy` types, then we might be able to get away with `RefCell`, but that's a small runtime overhead -- which is probably bad given that per cpu variables are most likely used for performance reasons? In that case the user might just need to store `UnsafeCell` and use unsafe regardless. (or we invent something specifically for that case, eg tokens that are statically known to be unique etc) --- Cheers, Benno > + pr_info!("The contents of pcpu are {}\n", val); > + > + native +=3D -1; > + *val +=3D -1; > + pr_info!("Native: {}, *pcpu: {}\n", native, val); > + assert!(native =3D=3D *val && native =3D=3D -1); > + > + native +=3D 1; > + *val +=3D 1; > + pr_info!("Native: {}, *pcpu: {}\n", native, val); > + assert!(native =3D=3D *val && native =3D=3D 0); > + });