Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

uaccess: decouple INLINE_COPY_FROM_USER and CONFIG_RUST

Commit 1f9a8286bc0c ("uaccess: always export _copy_[from|to]_user with
CONFIG_RUST") exports _copy_{from,to}_user() unconditionally, if RUST is
enabled. This pollutes exported symbols namespace, and spreads RUST
ifdefery in core files.

It's better to declare a corresponding helper under the rust/helpers,
similarly to how non-underscored copy_{from,to}_user() is handled.

[yury.norov@gmail.com: drop rust part of comment for _copy_from_user(), per Alice]
Link: https://lkml.kernel.org/r/20251024154754.99768-1-yury.norov@gmail.com
Link: https://lkml.kernel.org/r/20251023171607.1171534-1-yury.norov@gmail.com
Signed-off-by: Yury Norov (NVIDIA) <yury.norov@gmail.com>
Acked-by: Arnd Bergmann <arnd@arndb.de>
Acked-by: Miguel Ojeda <ojeda@kernel.org>
Reviewed-by: Alice Ryhl <aliceryhl@google.com>
Tested-by: Alice Ryhl <aliceryhl@google.com>
Cc: Alex Gaynor <alex.gaynor@gmail.com>
Cc: Andreas Hindborg <a.hindborg@kernel.org>
Cc: Björn Roy Baron <bjorn3_gh@protonmail.com>
Cc: Boqun Feng <boqun.feng@gmail.com>
Cc: Danilo Krummrich <dakr@kernel.org>
Cc: Gary Guo <gary@garyguo.net>
Cc: John Hubbard <jhubbard@nvidia.com>
Cc: Trevor Gross <tmgross@umich.edu>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

authored by

Yury Norov (NVIDIA) and committed by
Andrew Morton
d99dc586 032a7302

+14 -4
-2
include/linux/uaccess.h
··· 152 152 * directly in the normal copy_to/from_user(), the other ones go 153 153 * through an extern _copy_to/from_user(), which expands the same code 154 154 * here. 155 - * 156 - * Rust code always uses the extern definition. 157 155 */ 158 156 static inline __must_check unsigned long 159 157 _inline_copy_from_user(void *to, const void __user *from, unsigned long n)
+2 -2
lib/usercopy.c
··· 12 12 13 13 /* out-of-line parts */ 14 14 15 - #if !defined(INLINE_COPY_FROM_USER) || defined(CONFIG_RUST) 15 + #if !defined(INLINE_COPY_FROM_USER) 16 16 unsigned long _copy_from_user(void *to, const void __user *from, unsigned long n) 17 17 { 18 18 return _inline_copy_from_user(to, from, n); ··· 20 20 EXPORT_SYMBOL(_copy_from_user); 21 21 #endif 22 22 23 - #if !defined(INLINE_COPY_TO_USER) || defined(CONFIG_RUST) 23 + #if !defined(INLINE_COPY_TO_USER) 24 24 unsigned long _copy_to_user(void __user *to, const void *from, unsigned long n) 25 25 { 26 26 return _inline_copy_to_user(to, from, n);
+12
rust/helpers/uaccess.c
··· 13 13 { 14 14 return copy_to_user(to, from, n); 15 15 } 16 + 17 + #ifdef INLINE_COPY_FROM_USER 18 + unsigned long rust_helper__copy_from_user(void *to, const void __user *from, unsigned long n) 19 + { 20 + return _inline_copy_from_user(to, from, n); 21 + } 22 + 23 + unsigned long rust_helper__copy_to_user(void __user *to, const void *from, unsigned long n) 24 + { 25 + return _inline_copy_to_user(to, from, n); 26 + } 27 + #endif