On Tue, 02 Dec 2025 19:37:24 +0000 Alice Ryhl <[email protected]> wrote:
> This patch series adds __rust_helper to every single rust helper. The > patches do not depend on each other, so maintainers please go ahead and > pick up any patches relevant to your subsystem! Or provide your Acked-by > so that Miguel can pick them up. > > These changes were generated by adding __rust_helper and running > ClangFormat. Unrelated formatting changes were removed manually. > > Why is __rust_helper needed? > ============================ > > Currently, C helpers cannot be inlined into Rust even when using LTO > because LLVM detects slightly different options on the codegen units. > > * LLVM doesn't want to inline functions compiled with > `-fno-delete-null-pointer-checks` with code compiled without. The C > CGUs all have this enabled and Rust CGUs don't. Inlining is okay since > this is one of the hardening features that does not change the ABI, > and we shouldn't have null pointer dereferences in these helpers. > > * LLVM doesn't want to inline functions with different list of builtins. C > side has `-fno-builtin-wcslen`; `wcslen` is not a Rust builtin, so > they should be compatible, but LLVM does not perform inlining due to > attributes mismatch. > > * clang and Rust doesn't have the exact target string. Clang generates > `+cmov,+cx8,+fxsr` but Rust doesn't enable them (in fact, Rust will > complain if `-Ctarget-feature=+cmov,+cx8,+fxsr` is used). x86-64 > always enable these features, so they are in fact the same target > string, but LLVM doesn't understand this and so inlining is inhibited. > This can be bypassed with `--ignore-tti-inline-compatible`, but this > is a hidden option. > > (This analysis was written by Gary Guo.) > > How is this fixed? > ================== > > To fix this we need to add __always_inline to all helpers when compiling > with LTO. However, it should not be added when running bindgen as > bindgen will ignore functions marked inline. To achieve this, we are > using a #define called __rust_helper that is defined differently > depending on whether bindgen is running or not. > > Note that __rust_helper is currently always #defined to nothing. > Changing it to __always_inline will happen separately in another patch > series. > > Signed-off-by: Alice Ryhl <[email protected]> > --- > Alice Ryhl (46): > rust: auxiliary: add __rust_helper to helpers > rust: barrier: add __rust_helper to helpers > rust: binder: add __rust_helper to helpers > rust: bitmap: add __rust_helper to helpers > rust: bitops: add __rust_helper to helpers > rust: blk: add __rust_helper to helpers > rust: bug: add __rust_helper to helpers > rust: clk: add __rust_helper to helpers > rust: completion: add __rust_helper to helpers > rust: cpu: add __rust_helper to helpers > rust: cpufreq: add __rust_helper to helpers > rust: cpumask: add __rust_helper to helpers > rust: cred: add __rust_helper to helpers > rust: device: add __rust_helper to helpers > rust: dma: add __rust_helper to helpers > rust: drm: add __rust_helper to helpers > rust: err: add __rust_helper to helpers > rust: fs: add __rust_helper to helpers > rust: io: add __rust_helper to helpers > rust: irq: add __rust_helper to helpers > rust: jump_label: add __rust_helper to helpers > rust: kunit: add __rust_helper to helpers > rust: maple_tree: add __rust_helper to helpers > rust: mm: add __rust_helper to helpers > rust: of: add __rust_helper to helpers > rust: pci: add __rust_helper to helpers > rust: pid_namespace: add __rust_helper to helpers > rust: platform: add __rust_helper to helpers > rust: poll: add __rust_helper to helpers > rust: processor: add __rust_helper to helpers > rust: property: add __rust_helper to helpers > rust: rbtree: add __rust_helper to helpers > rust: rcu: add __rust_helper to helpers > rust: refcount: add __rust_helper to helpers > rust: regulator: add __rust_helper to helpers > rust: scatterlist: add __rust_helper to helpers > rust: security: add __rust_helper to helpers > rust: slab: add __rust_helper to helpers > rust: sync: add __rust_helper to helpers > rust: task: add __rust_helper to helpers > rust: time: add __rust_helper to helpers > rust: uaccess: add __rust_helper to helpers > rust: usb: add __rust_helper to helpers > rust: wait: add __rust_helper to helpers > rust: workqueue: add __rust_helper to helpers > rust: xarray: add __rust_helper to helpers Thansk for sending this Alice! With this series in first, my series for inlining helpers should be much easier to apply. For the whole series: Reviewed-by: Gary Guo <[email protected]> Best, Gary > > rust/helpers/auxiliary.c | 6 +++-- > rust/helpers/barrier.c | 6 ++--- > rust/helpers/binder.c | 13 ++++----- > rust/helpers/bitmap.c | 6 +++-- > rust/helpers/bitops.c | 11 +++++--- > rust/helpers/blk.c | 4 +-- > rust/helpers/bug.c | 4 +-- > rust/helpers/build_bug.c | 2 +- > rust/helpers/clk.c | 24 +++++++++-------- > rust/helpers/completion.c | 2 +- > rust/helpers/cpu.c | 2 +- > rust/helpers/cpufreq.c | 3 ++- > rust/helpers/cpumask.c | 32 +++++++++++++--------- > rust/helpers/cred.c | 4 +-- > rust/helpers/device.c | 16 +++++------ > rust/helpers/dma.c | 15 ++++++----- > rust/helpers/drm.c | 7 ++--- > rust/helpers/err.c | 6 ++--- > rust/helpers/fs.c | 2 +- > rust/helpers/io.c | 64 > +++++++++++++++++++++++--------------------- > rust/helpers/irq.c | 6 +++-- > rust/helpers/jump_label.c | 2 +- > rust/helpers/kunit.c | 2 +- > rust/helpers/maple_tree.c | 3 ++- > rust/helpers/mm.c | 20 +++++++------- > rust/helpers/mutex.c | 13 ++++----- > rust/helpers/of.c | 2 +- > rust/helpers/page.c | 9 ++++--- > rust/helpers/pci.c | 13 +++++---- > rust/helpers/pid_namespace.c | 8 +++--- > rust/helpers/platform.c | 2 +- > rust/helpers/poll.c | 5 ++-- > rust/helpers/processor.c | 2 +- > rust/helpers/property.c | 2 +- > rust/helpers/rbtree.c | 5 ++-- > rust/helpers/rcu.c | 4 +-- > rust/helpers/refcount.c | 10 +++---- > rust/helpers/regulator.c | 24 ++++++++++------- > rust/helpers/scatterlist.c | 12 +++++---- > rust/helpers/security.c | 26 ++++++++++-------- > rust/helpers/signal.c | 2 +- > rust/helpers/slab.c | 14 +++++----- > rust/helpers/spinlock.c | 13 ++++----- > rust/helpers/sync.c | 4 +-- > rust/helpers/task.c | 24 ++++++++--------- > rust/helpers/time.c | 12 ++++----- > rust/helpers/uaccess.c | 8 +++--- > rust/helpers/usb.c | 3 ++- > rust/helpers/vmalloc.c | 7 ++--- > rust/helpers/wait.c | 2 +- > rust/helpers/workqueue.c | 8 +++--- > rust/helpers/xarray.c | 10 +++---- > 52 files changed, 280 insertions(+), 226 deletions(-) > --- > base-commit: 54e3eae855629702c566bd2e130d9f40e7f35bde > change-id: 20251202-define-rust-helper-f7b531813007 > > Best regards,
