Thread (66 messages) 66 messages, 16 authors, 2021-07-23

Re: [PATCH 05/17] rust: add C helpers

From: Marco Elver <elver@google.com>
Date: 2021-07-09 10:31:56
Also in: linux-doc, linux-kbuild, lkml

On Wed, 7 Jul 2021 at 12:19, Marco Elver [off-list ref] wrote:
On Sun, Jul 04, 2021 at 10:27PM +0200, ojeda@kernel.org wrote:
quoted
From: Miguel Ojeda <ojeda@kernel.org>

This source file contains forwarders to C macros and inlined
functions.
What is the story with Rust and LTO? Intuitively, I would expect Rust
code to only perform optimally if the kernel is built with LTO
(currently only supported via Clang).
I'll answer my own question: it looks like Linux Rust code currently
does _not_ generate LLVM-LTO compatible object files, but only native
object files (which still link fine if LTO is enabled, but doesn't
permit the optimizations below we'd want).

rustc already supports playing nicely with LLVM LTO via `-C
linker-plugin-lto`:
https://doc.rust-lang.org/rustc/linker-plugin-lto.html

So, hopefully it should only require kernel work to make it play
nicely with CONFIG_LTO_CLANG.
quoted hunk ↗ jump to hunk
Because if calls to every one of these helpers are real calls, I would
expect performance to be pretty poor. There's probably a reason these
are macros or inlinable functions.

I would almost go so far and suggest that CONFIG_RUST be modified as
follows:
--- a/init/Kconfig
+++ b/init/Kconfig
@@ -2028,6 +2028,7 @@ config RUST
        depends on HAS_RUST
        depends on !COMPILE_TEST
        depends on !MODVERSIONS
+       depends on LTO || EXPERT
        default n
        help
          Enables Rust support in the kernel.
[ I'm sure there are configs that don't yet work with LTO, but could be
  useful to enable for debugging or testing purposes, and therefore would
  make it conditional on CONFIG_EXPERT as well. ]

[...]
quoted
+unsigned long rust_helper_copy_from_user(void *to, const void __user *from, unsigned long n)
+{
+     return copy_from_user(to, from, n);
+}
+
[...]

From some local tests, it looks like simply attaching
__attribute__((always_inline)) will do what one would expect when
compiling with Clang LTO (I checked -flto=thin).

If you confirm this also works across C and Rust TUs when enabling LTO,
I would then suggested adding __attribute__((always_inline)) to all
these helpers.

Thanks,
-- Marco
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help