[PATCH 00/19] Rust support

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Rust support

This is the patch series (v2) to add support for Rust as a second
language to the Linux kernel.

If you are interested in following this effort, please join us in
the mailing list at:

    rust-for-linux@xxxxxxxxxxxxxxx

and take a look at the project itself at:

    https://github.com/Rust-for-Linux

As usual, special thanks go to ISRG (Internet Security Research
Group) and Google for their financial support on this endeavor.

Cheers,
Miguel

--

# Rust support

This cover letter explains the major changes and updates done since
v1, plus a few extra notes and news. For the previous cover letters,
please see:

  RFC: https://lore.kernel.org/lkml/20210414184604.23473-1-ojeda@xxxxxxxxxx/
  v1:  https://lore.kernel.org/lkml/20210704202756.29107-1-ojeda@xxxxxxxxxx/


## Infrastructure updates

There have been several improvements to the overall Rust support.
The following sections cover some of these.


### Stable compiler & Rust Edition 2021

We moved from the beta Rust compiler to using stable releases,
migrating each time a new one gets released. Currently we just moved
to Rust 1.57.0, released last Thursday.

By upgrading the compiler, we have been able to take off the list
a few unstable features we were using: `const_fn_transmute`,
`const_panic`, `const_unreachable_unchecked`, `core_panic` and
`try_reserve`. For an up-to-date list on the features and other
wishlists we have, please see:

    https://github.com/Rust-for-Linux/linux/issues/2

We will keep upgrading until we do not rely on any unstable features;
at which point we may want to start declaring a minimum Rust version
is supported, like it is done for e.g. GCC and Clang.

Similarly, we also migrated to the 2021 edition of the Rust language.


### Customizing `core` and `alloc`

We added a couple more "modularization" options to `alloc` in order
to disable some features we do not need: `no_rc` and `no_sync`.

We would like to thank upstream Rust for working with us on
upstreaming these so that the kernel use case is well supported
(or, more precisely, the "combination" of options the kernel needs).

Upstream `core` has added `no_fp_fmt_parse` too, which we are using.


### Stricter code, docs and new lints

Following the `CONFIG_WERROR` discussions, we are trying to do our
bit by making the option apply to Rust code and having our CI build
with it enabled.

We also enabled a bunch of extra Rust compiler diagnostics and Clippy
lints. We may need to disable some of them in the future if they
prove too noisy or disruptive, but we think this is the best time
to try them out. For instance, one of them checks that no unreachable
public items are present.

One difference with respect to C here is that Rust diagnostics are
slightly more natural to disable within code, which we may allow us to
be more strict in the general case.


## Abstractions and driver updates

We added abstractions for sequence locks, power management callbacks,
io memory (`readX`/`writeX`), irq chips & high-level flow handlers,
gpio chips (including irq ones), devices, amba devices & drivers and
credentials.

There is improved driver support with bus-independent infrastructure,
revocable objects, revocable mutexes, efficient bit iterators, better
panic diagnostics and simplified pointer wrappers.

In addition, we improved and simplified `Ref` (`refcount_t`-backed)
objects and replaced all instances of Rust's `Arc` by it. Completely
removed `Arc` and `Rc` from the `alloc` crate.

A new driver for PL061 gpio devices was implemented and is submitted
as an RFC patch.


## Patch series status

Like we mentioned last time, the Rust support is still to be
considered experimental. However, support is good enough that kernel
developers can start working on the Rust abstractions for subsystems
and write drivers and other modules.

The current series has just arrived in `linux-next`, thus the first
run will happen in a day. Similarly, the preview docs for this series
can be seen at:

    https://rust-for-linux.github.io/docs/kernel/

>From now on, we will also start submitting the patches regularly,
every two weeks or so.


## Industry and academia support

In addition to the statements from Arm, Google and Microsoft from
the previous cover letter, we have one from Red Hat this time:

  There is interest in using Rust for kernel work that Red Hat
  is considering.


## Conferences, meetings and liaisons

Kangrejos, the Rust for Linux conference we announced last time,
took place before LPC (made possible by Jonathan Corbet et. al. and
LPC's infrastructure). Thanks everyone that joined!

    https://kangrejos.com

We would also want to thank you the venues we were invited to:

  - Linaro Virtual Connect 2021 Fall
  - Clang Built Linux Meetup II turbo
  - Linux Plumbers Conference 2021 (quite a few Rust-related talks
    from us and others as well!)
  - Samsung Engineering Summit 2021
  - Linux Foundation Live Mentorship Series

There will also be a talk in the Open Source Summit Japan this month.

We also want to thank Niko Matsakis and the Rust CTCFT (Cross Team
Collaboration Fun Times) team for inviting us to present our work
and our needs from Rust.


## Other related news

### `rustc_codegen_gcc` merged

The GCC backend for the Rust compiler (through `libgccjit`, although
used for ahead-of-time compilation) was merged into upstream Rust:

    https://github.com/rust-lang/rustc_codegen_gcc

If the backend keeps progressing, we hope to soon be able to start
experimenting with compiling the Rust side of the kernel with GCC!


### Compiler Explorer improvements

This useful online tool added support for `rustc_codegen_gcc`.
Together with GCC Rust and `mrustc`, the site now supports all the
alternative Rust compilers. See a live example at:

    https://godbolt.org/z/6br9Ef73E

They are also adding further options for Rust we requested, e.g. MIR
and macro expansion views are already live on the site.


## Acknowledgements

The signatures in the main commits correspond to the people that
wrote code that has ended up in them at the present time. For details
on contributions to code and discussions, please see our repository:

    https://github.com/Rust-for-Linux/linux

However, we would like to give credit to everyone that has contributed
in one way or another to the Rust for Linux project. Since the v1:

  - bjorn3 and Gary Guo for all the input on Rust compiler details
    and all the reviews and suggestions.

  - Jonathan Corbet and the LPC organizers for lending us the Linux
    Plumbers Conference infrastructure so that we could have an easy
    time setting up Kangrejos.

  - Josh Triplett for reviewing the Rust CTCFT presentation.

  - Robin Randhawa for reviewing the Linaro Connect presentation.

  - Viresh Kumar for his work on adding Rust bindings to `libgpiod`.

  - Philip Herrons (and his supporters Open Source Security and
    Embecosm) et. al. for their ongoing work on GCC Rust.

  - Antoni Boucher (and his supporters) et. al. for their ongoing
    work on `rustc_codegen_gcc`.

  - Mats Larsen, Marc Poulhiès et. al. for their ongoing work on
    improving Rust support in Compiler Explorer.

  - All the Rust and LLVM contributors taking a look into codegen
    and other issues we have raised.

  - Many folks that have reported issues, tested the project,
    helped spread the word, joined discussions and contributed in
    other ways!

Please also see the acknowledgements on the previous cover letters.


Boqun Feng (1):
  kallsyms: use the correct buffer size for symbols

Gary Guo (2):
  rust: add `build_error` crate
  vsprintf: add new `%pA` format specifier

Miguel Ojeda (13):
  kallsyms: support "big" kernel symbols
  kallsyms: increase maximum kernel symbol length to 512
  rust: add C helpers
  rust: add `compiler_builtins` crate
  rust: add `alloc` crate
  rust: add `macros` crate
  rust: export generated symbols
  scripts: add `generate_rust_analyzer.py`
  scripts: decode_stacktrace: demangle Rust symbols
  docs: add Rust documentation
  Kbuild: add Rust support
  samples: add Rust examples
  MAINTAINERS: Rust

Wedson Almeida Filho (3):
  rust: add `kernel` crate
  [RFC] drivers: gpio: PrimeCell PL061 in Rust
  [RFC] drivers: android: Binder IPC in Rust

 .gitignore                                  |    5 +
 .rustfmt.toml                               |   12 +
 Documentation/doc-guide/kernel-doc.rst      |    3 +
 Documentation/index.rst                     |    1 +
 Documentation/kbuild/kbuild.rst             |    4 +
 Documentation/process/changes.rst           |   13 +
 Documentation/rust/arch-support.rst         |   35 +
 Documentation/rust/assets/favicon-16x16.png |  Bin 0 -> 798 bytes
 Documentation/rust/assets/favicon-32x32.png |  Bin 0 -> 2076 bytes
 Documentation/rust/assets/rust-logo.png     |  Bin 0 -> 53976 bytes
 Documentation/rust/coding.rst               |   91 +
 Documentation/rust/docs.rst                 |  101 +
 Documentation/rust/index.rst                |   21 +
 Documentation/rust/quick-start.rst          |  212 ++
 MAINTAINERS                                 |   14 +
 Makefile                                    |  146 +-
 arch/arm/rust/target.json                   |   27 +
 arch/arm64/rust/target.json                 |   34 +
 arch/powerpc/rust/target.json               |   29 +
 arch/riscv/Makefile                         |    1 +
 arch/riscv/rust/rv32ima.json                |   36 +
 arch/riscv/rust/rv32imac.json               |   36 +
 arch/riscv/rust/rv64ima.json                |   36 +
 arch/riscv/rust/rv64imac.json               |   36 +
 arch/x86/rust/target.json                   |   36 +
 drivers/android/Kconfig                     |    7 +
 drivers/android/Makefile                    |    2 +
 drivers/android/allocation.rs               |  266 ++
 drivers/android/context.rs                  |   79 +
 drivers/android/defs.rs                     |   99 +
 drivers/android/node.rs                     |  476 +++
 drivers/android/process.rs                  |  964 ++++++
 drivers/android/range_alloc.rs              |  189 ++
 drivers/android/rust_binder.rs              |  114 +
 drivers/android/thread.rs                   |  871 +++++
 drivers/android/transaction.rs              |  326 ++
 drivers/gpio/Kconfig                        |    8 +
 drivers/gpio/Makefile                       |    1 +
 drivers/gpio/gpio_pl061_rust.rs             |  362 ++
 include/linux/kallsyms.h                    |    2 +-
 include/linux/spinlock.h                    |   17 +-
 include/uapi/linux/android/binder.h         |   28 +-
 init/Kconfig                                |   31 +-
 kernel/kallsyms.c                           |   26 +-
 kernel/livepatch/core.c                     |    4 +-
 kernel/printk/printk.c                      |    5 +-
 lib/Kconfig.debug                           |  144 +
 lib/vsprintf.c                              |   12 +
 rust/.gitignore                             |    7 +
 rust/Makefile                               |  353 ++
 rust/alloc/README.md                        |   32 +
 rust/alloc/alloc.rs                         |  424 +++
 rust/alloc/borrow.rs                        |  498 +++
 rust/alloc/boxed.rs                         | 1844 ++++++++++
 rust/alloc/collections/mod.rs               |  155 +
 rust/alloc/fmt.rs                           |  583 ++++
 rust/alloc/lib.rs                           |  212 ++
 rust/alloc/macros.rs                        |  126 +
 rust/alloc/raw_vec.rs                       |  612 ++++
 rust/alloc/slice.rs                         | 1275 +++++++
 rust/alloc/str.rs                           |  621 ++++
 rust/alloc/string.rs                        | 2857 ++++++++++++++++
 rust/alloc/vec/drain.rs                     |  158 +
 rust/alloc/vec/drain_filter.rs              |  145 +
 rust/alloc/vec/into_iter.rs                 |  356 ++
 rust/alloc/vec/is_zero.rs                   |  106 +
 rust/alloc/vec/mod.rs                       | 3327 +++++++++++++++++++
 rust/alloc/vec/partial_eq.rs                |   49 +
 rust/alloc/vec/set_len_on_drop.rs           |   30 +
 rust/alloc/vec/spec_extend.rs               |  172 +
 rust/bindgen_parameters                     |   13 +
 rust/build_error.rs                         |   29 +
 rust/compiler_builtins.rs                   |   57 +
 rust/exports.c                              |   16 +
 rust/helpers.c                              |  436 +++
 rust/kernel/allocator.rs                    |   65 +
 rust/kernel/amba.rs                         |  276 ++
 rust/kernel/bindings.rs                     |   47 +
 rust/kernel/bindings_helper.h               |   30 +
 rust/kernel/buffer.rs                       |   52 +
 rust/kernel/build_assert.rs                 |   80 +
 rust/kernel/c_types.rs                      |  119 +
 rust/kernel/chrdev.rs                       |  212 ++
 rust/kernel/cred.rs                         |   73 +
 rust/kernel/device.rs                       |  206 ++
 rust/kernel/driver.rs                       |  198 ++
 rust/kernel/error.rs                        |  542 +++
 rust/kernel/file.rs                         |  141 +
 rust/kernel/file_operations.rs              |  723 ++++
 rust/kernel/gpio.rs                         |  475 +++
 rust/kernel/io_buffer.rs                    |  153 +
 rust/kernel/io_mem.rs                       |  207 ++
 rust/kernel/iov_iter.rs                     |   81 +
 rust/kernel/irq.rs                          |  408 +++
 rust/kernel/lib.rs                          |  256 ++
 rust/kernel/linked_list.rs                  |  247 ++
 rust/kernel/miscdev.rs                      |  166 +
 rust/kernel/module_param.rs                 |  497 +++
 rust/kernel/of.rs                           |  101 +
 rust/kernel/pages.rs                        |  162 +
 rust/kernel/platdev.rs                      |  152 +
 rust/kernel/power.rs                        |  118 +
 rust/kernel/prelude.rs                      |   33 +
 rust/kernel/print.rs                        |  441 +++
 rust/kernel/random.rs                       |   50 +
 rust/kernel/raw_list.rs                     |  361 ++
 rust/kernel/rbtree.rs                       |  562 ++++
 rust/kernel/revocable.rs                    |  163 +
 rust/kernel/security.rs                     |   36 +
 rust/kernel/static_assert.rs                |   39 +
 rust/kernel/std_vendor.rs                   |  150 +
 rust/kernel/str.rs                          |  375 +++
 rust/kernel/sync/arc.rs                     |  500 +++
 rust/kernel/sync/condvar.rs                 |  137 +
 rust/kernel/sync/guard.rs                   |  181 +
 rust/kernel/sync/locked_by.rs               |  112 +
 rust/kernel/sync/mod.rs                     |   92 +
 rust/kernel/sync/mutex.rs                   |  111 +
 rust/kernel/sync/revocable_mutex.rs         |  184 +
 rust/kernel/sync/seqlock.rs                 |  201 ++
 rust/kernel/sync/spinlock.rs                |  180 +
 rust/kernel/sysctl.rs                       |  197 ++
 rust/kernel/task.rs                         |  182 +
 rust/kernel/types.rs                        |  486 +++
 rust/kernel/user_ptr.rs                     |  175 +
 rust/macros/helpers.rs                      |   79 +
 rust/macros/lib.rs                          |   94 +
 rust/macros/module.rs                       |  622 ++++
 samples/Kconfig                             |    2 +
 samples/Makefile                            |    1 +
 samples/rust/Kconfig                        |  113 +
 samples/rust/Makefile                       |   12 +
 samples/rust/rust_chrdev.rs                 |   50 +
 samples/rust/rust_minimal.rs                |   38 +
 samples/rust/rust_miscdev.rs                |  149 +
 samples/rust/rust_module_parameters.rs      |   72 +
 samples/rust/rust_print.rs                  |   57 +
 samples/rust/rust_random.rs                 |   61 +
 samples/rust/rust_semaphore.rs              |  174 +
 samples/rust/rust_semaphore_c.c             |  212 ++
 samples/rust/rust_stack_probing.rs          |   40 +
 samples/rust/rust_sync.rs                   |   81 +
 scripts/Makefile.build                      |   22 +
 scripts/Makefile.debug                      |   10 +
 scripts/Makefile.lib                        |   12 +
 scripts/Makefile.modfinal                   |    8 +-
 scripts/decode_stacktrace.sh                |   14 +
 scripts/generate_rust_analyzer.py           |  133 +
 scripts/is_rust_module.sh                   |   19 +
 scripts/kallsyms.c                          |   40 +-
 scripts/kconfig/confdata.c                  |   75 +
 scripts/rust-version.sh                     |   31 +
 tools/include/linux/kallsyms.h              |    2 +-
 tools/include/linux/lockdep.h               |    2 +-
 tools/lib/perf/include/perf/event.h         |    2 +-
 tools/lib/symbol/kallsyms.h                 |    2 +-
 156 files changed, 32369 insertions(+), 50 deletions(-)
 create mode 100644 .rustfmt.toml
 create mode 100644 Documentation/rust/arch-support.rst
 create mode 100644 Documentation/rust/assets/favicon-16x16.png
 create mode 100644 Documentation/rust/assets/favicon-32x32.png
 create mode 100644 Documentation/rust/assets/rust-logo.png
 create mode 100644 Documentation/rust/coding.rst
 create mode 100644 Documentation/rust/docs.rst
 create mode 100644 Documentation/rust/index.rst
 create mode 100644 Documentation/rust/quick-start.rst
 create mode 100644 arch/arm/rust/target.json
 create mode 100644 arch/arm64/rust/target.json
 create mode 100644 arch/powerpc/rust/target.json
 create mode 100644 arch/riscv/rust/rv32ima.json
 create mode 100644 arch/riscv/rust/rv32imac.json
 create mode 100644 arch/riscv/rust/rv64ima.json
 create mode 100644 arch/riscv/rust/rv64imac.json
 create mode 100644 arch/x86/rust/target.json
 create mode 100644 drivers/android/allocation.rs
 create mode 100644 drivers/android/context.rs
 create mode 100644 drivers/android/defs.rs
 create mode 100644 drivers/android/node.rs
 create mode 100644 drivers/android/process.rs
 create mode 100644 drivers/android/range_alloc.rs
 create mode 100644 drivers/android/rust_binder.rs
 create mode 100644 drivers/android/thread.rs
 create mode 100644 drivers/android/transaction.rs
 create mode 100644 drivers/gpio/gpio_pl061_rust.rs
 create mode 100644 rust/.gitignore
 create mode 100644 rust/Makefile
 create mode 100644 rust/alloc/README.md
 create mode 100644 rust/alloc/alloc.rs
 create mode 100644 rust/alloc/borrow.rs
 create mode 100644 rust/alloc/boxed.rs
 create mode 100644 rust/alloc/collections/mod.rs
 create mode 100644 rust/alloc/fmt.rs
 create mode 100644 rust/alloc/lib.rs
 create mode 100644 rust/alloc/macros.rs
 create mode 100644 rust/alloc/raw_vec.rs
 create mode 100644 rust/alloc/slice.rs
 create mode 100644 rust/alloc/str.rs
 create mode 100644 rust/alloc/string.rs
 create mode 100644 rust/alloc/vec/drain.rs
 create mode 100644 rust/alloc/vec/drain_filter.rs
 create mode 100644 rust/alloc/vec/into_iter.rs
 create mode 100644 rust/alloc/vec/is_zero.rs
 create mode 100644 rust/alloc/vec/mod.rs
 create mode 100644 rust/alloc/vec/partial_eq.rs
 create mode 100644 rust/alloc/vec/set_len_on_drop.rs
 create mode 100644 rust/alloc/vec/spec_extend.rs
 create mode 100644 rust/bindgen_parameters
 create mode 100644 rust/build_error.rs
 create mode 100644 rust/compiler_builtins.rs
 create mode 100644 rust/exports.c
 create mode 100644 rust/helpers.c
 create mode 100644 rust/kernel/allocator.rs
 create mode 100644 rust/kernel/amba.rs
 create mode 100644 rust/kernel/bindings.rs
 create mode 100644 rust/kernel/bindings_helper.h
 create mode 100644 rust/kernel/buffer.rs
 create mode 100644 rust/kernel/build_assert.rs
 create mode 100644 rust/kernel/c_types.rs
 create mode 100644 rust/kernel/chrdev.rs
 create mode 100644 rust/kernel/cred.rs
 create mode 100644 rust/kernel/device.rs
 create mode 100644 rust/kernel/driver.rs
 create mode 100644 rust/kernel/error.rs
 create mode 100644 rust/kernel/file.rs
 create mode 100644 rust/kernel/file_operations.rs
 create mode 100644 rust/kernel/gpio.rs
 create mode 100644 rust/kernel/io_buffer.rs
 create mode 100644 rust/kernel/io_mem.rs
 create mode 100644 rust/kernel/iov_iter.rs
 create mode 100644 rust/kernel/irq.rs
 create mode 100644 rust/kernel/lib.rs
 create mode 100644 rust/kernel/linked_list.rs
 create mode 100644 rust/kernel/miscdev.rs
 create mode 100644 rust/kernel/module_param.rs
 create mode 100644 rust/kernel/of.rs
 create mode 100644 rust/kernel/pages.rs
 create mode 100644 rust/kernel/platdev.rs
 create mode 100644 rust/kernel/power.rs
 create mode 100644 rust/kernel/prelude.rs
 create mode 100644 rust/kernel/print.rs
 create mode 100644 rust/kernel/random.rs
 create mode 100644 rust/kernel/raw_list.rs
 create mode 100644 rust/kernel/rbtree.rs
 create mode 100644 rust/kernel/revocable.rs
 create mode 100644 rust/kernel/security.rs
 create mode 100644 rust/kernel/static_assert.rs
 create mode 100644 rust/kernel/std_vendor.rs
 create mode 100644 rust/kernel/str.rs
 create mode 100644 rust/kernel/sync/arc.rs
 create mode 100644 rust/kernel/sync/condvar.rs
 create mode 100644 rust/kernel/sync/guard.rs
 create mode 100644 rust/kernel/sync/locked_by.rs
 create mode 100644 rust/kernel/sync/mod.rs
 create mode 100644 rust/kernel/sync/mutex.rs
 create mode 100644 rust/kernel/sync/revocable_mutex.rs
 create mode 100644 rust/kernel/sync/seqlock.rs
 create mode 100644 rust/kernel/sync/spinlock.rs
 create mode 100644 rust/kernel/sysctl.rs
 create mode 100644 rust/kernel/task.rs
 create mode 100644 rust/kernel/types.rs
 create mode 100644 rust/kernel/user_ptr.rs
 create mode 100644 rust/macros/helpers.rs
 create mode 100644 rust/macros/lib.rs
 create mode 100644 rust/macros/module.rs
 create mode 100644 samples/rust/Kconfig
 create mode 100644 samples/rust/Makefile
 create mode 100644 samples/rust/rust_chrdev.rs
 create mode 100644 samples/rust/rust_minimal.rs
 create mode 100644 samples/rust/rust_miscdev.rs
 create mode 100644 samples/rust/rust_module_parameters.rs
 create mode 100644 samples/rust/rust_print.rs
 create mode 100644 samples/rust/rust_random.rs
 create mode 100644 samples/rust/rust_semaphore.rs
 create mode 100644 samples/rust/rust_semaphore_c.c
 create mode 100644 samples/rust/rust_stack_probing.rs
 create mode 100644 samples/rust/rust_sync.rs
 create mode 100755 scripts/generate_rust_analyzer.py
 create mode 100755 scripts/is_rust_module.sh
 create mode 100755 scripts/rust-version.sh

-- 
2.34.0




[Index of Archives]     [Linux&nblp;USB Development]     [Linux Media]     [Video for Linux]     [Linux Audio Users]     [Yosemite Secrets]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux