Hi, This is a follow-up of [1]. Thanks for all the inputs from that thread. I use Mark's outline atomic scripts, but make them specific for atomics in Rust. The reason is that I want to use Gary's work [2], and inline atomics if possible in Rust code. My local test can confirm it works: With RUST_LTO_HELPERS=n 224edc: 52800180 mov w0, #0xc // #12 224ee0: 94000000 bl 219640 <rust_helper_atomic_fetch_add_relaxed> With RUST_LTO_HELPERS=y 222fd4: 52800189 mov w9, #0xc // #12 222fd8: b8290108 ldadd w9, w8, [x8] Only AtomicI32 (atomic_t) and AtomicI64 (atomic64_t) are added, and for AtomicPtr (atomic pointers) I plan to implement with compile-time selection on either of these two. You can find a branch contains this series and Gray's patchset at: https://github.com/fbq/linux.git dev/rust/atomic-rfc For testing, I randomly picked up some function and inspected the generated code, plus Rust code can use the function document as tests, so I added two tests there. Ideally we should have something similar to lib/atomic64_test.c, but I want to get some feedback on the implementation part first, plus it's just using C functions, so as long as C code passes the tests, it should be fine (famous last words). ARM64 maintainers, I use the following to simulate cases where LSE is configured but not available from hardware: diff --git a/arch/arm64/kernel/cpufeature.c b/arch/arm64/kernel/cpufeature.c index 48e7029f1054..99e6e2b2867f 100644 --- a/arch/arm64/kernel/cpufeature.c +++ b/arch/arm64/kernel/cpufeature.c @@ -1601,6 +1601,8 @@ static bool has_cpuid_feature(const struct arm64_cpu_capabilities *entry, int scope) { u64 val = read_scoped_sysreg(entry, scope); + if (entry->capability == ARM64_HAS_LSE_ATOMICS) + return false; return feature_matches(val, entry); } and my tests in a qemu emulated VM passed for both RUST_LTO_HELPERS=n and =y cases. Let me know what I can also do to test this. Notes for people who are working on Rust code and need atomics, my target of this set of APIs is 6.11 or 6.12 (will work hard on it, but no guarantee ;-)). If you are currently using Rust own atomics, it's OK, we can always clean up quickly after this merged. Regards, Boqun [1]: https://lore.kernel.org/rust-for-linux/20240322233838.868874-1-boqun.feng@xxxxxxxxx/ [2]: https://lore.kernel.org/rust-for-linux/20240529202817.3641974-1-gary@xxxxxxxxxxx/ Boqun Feng (2): rust: Introduce atomic API helpers rust: sync: Add atomic support MAINTAINERS | 4 +- arch/arm64/kernel/cpufeature.c | 2 + rust/atomic_helpers.h | 1035 ++++++++++++++++ rust/helpers.c | 2 + rust/kernel/sync.rs | 1 + rust/kernel/sync/atomic.rs | 63 + rust/kernel/sync/atomic/impl.rs | 1375 +++++++++++++++++++++ scripts/atomic/gen-atomics.sh | 2 + scripts/atomic/gen-rust-atomic-helpers.sh | 64 + scripts/atomic/gen-rust-atomic.sh | 136 ++ 10 files changed, 2683 insertions(+), 1 deletion(-) create mode 100644 rust/atomic_helpers.h create mode 100644 rust/kernel/sync/atomic.rs create mode 100644 rust/kernel/sync/atomic/impl.rs create mode 100755 scripts/atomic/gen-rust-atomic-helpers.sh create mode 100755 scripts/atomic/gen-rust-atomic.sh -- 2.45.2