@@ -6,66 +6,85 @@ minutes: 18
66
77` bindgen ` is used to generate low-level, unsafe bindings for C interfaces.
88
9- But to reap the benefits of Rust, we want to use safe, foolproof interfaces to unsafe functionality.
9+ But to reap the benefits of Rust, we want to use safe, foolproof interfaces to
10+ unsafe functionality.
1011
11- Subsystems are expected to implement safe interfaces on top of the low-level generated bindings.
12- These safe interfaces are exposed as top-level modules within the [ ` kernel ` crate] ( https://rust.docs.kernel.org/kernel/ ) .
13- The top-level ` bindings ` module holds the unsafe ` bindgen ` -generated bindings,
14- which are generated from the C headers included by ` rust/bindings/bindings_helper.h ` .
12+ Subsystems are expected to implement safe interfaces on top of the low-level
13+ generated bindings. These safe interfaces are exposed as top-level modules
14+ within the [ ` kernel ` crate] ( https://rust.docs.kernel.org/kernel/ ) . The top-level
15+ ` bindings ` module holds the unsafe ` bindgen ` -generated bindings, which are
16+ generated from the C headers included by ` rust/bindings/bindings_helper.h ` .
1517
16- In Rust for Linux, unsafe ` bindgen ` -generated bindings should not be used outside the ` kernel ` crate.
17- Drivers and other subsystems will make use of the safe abstractions from this crate.
18+ In Rust for Linux, unsafe ` bindgen ` -generated bindings should not be used
19+ outside the ` kernel ` crate. Drivers and other subsystems will make use of the
20+ safe abstractions from this crate.
1821
1922Only a subset of Linux subsystems currently have such abstractions.
2023
21- It's worth browsing the [ list of modules] ( https://rust.docs.kernel.org/kernel/#modules )
22- exposed by the ` kernel ` crate to see what exists currently.
23- Many of these subsystems have only partial bindings based on the needs of consumers so far.
24+ It's worth browsing the
25+ [ list of modules] ( https://rust.docs.kernel.org/kernel/#modules ) exposed by the
26+ ` kernel ` crate to see what exists currently. Many of these subsystems have only
27+ partial bindings based on the needs of consumers so far.
2428
2529## Adding a Module
2630
27- To add a module for some subsystem, first its header must be added to ` bindings_helper.h ` .
28- It may be necessary to write some custom code to wrap macros or ` inline ` functions
29- that are not automatically handled by ` bindgen ` ; this code lives in the ` rust/helpers/ ` directory.
31+ To add a module for some subsystem, first its header must be added to
32+ ` bindings_helper.h ` . It may be necessary to write some custom code to wrap
33+ macros or ` inline ` functions that are not automatically handled by ` bindgen ` ;
34+ this code lives in the ` rust/helpers/ ` directory.
3035
31- Then we need to write a safe abstraction using these bindings and exposing them to the rest of kernel Rust.
36+ Then we need to write a safe abstraction using these bindings and exposing them
37+ to the rest of kernel Rust.
3238
33- Some commits from work-in-progress bindings and abstractions
34- can provide an idea of what it looks like to expose new kernel functionality:
39+ Some commits from work-in-progress bindings and abstractions can provide an idea
40+ of what it looks like to expose new kernel functionality:
3541
36- - GPIO Consumer: [ fecb4bd73f06bb2cac8e16aca7ef0e2f1b6acb50] ( https://github.com/Fabo/linux/commit/fecb4bd73f06bb2cac8e16aca7ef0e2f1b6acb50 )
37- - Regmap: [ ec0b740ac5ab299e4c86011a0002919e5bbe5c2d] ( https://github.com/Fabo/linux/commit/ec0b740ac5ab299e4c86011a0002919e5bbe5c2d )
38- - I2C: [ 70ed30fcdf8ec62fa91485c3c0a161a9d0194668] ( https://github.com/Fabo/linux/commit/70ed30fcdf8ec62fa91485c3c0a161a9d0194668 )
42+ - GPIO Consumer:
43+ [ fecb4bd73f06bb2cac8e16aca7ef0e2f1b6acb50] ( https://github.com/Fabo/linux/commit/fecb4bd73f06bb2cac8e16aca7ef0e2f1b6acb50 )
44+ - Regmap:
45+ [ ec0b740ac5ab299e4c86011a0002919e5bbe5c2d] ( https://github.com/Fabo/linux/commit/ec0b740ac5ab299e4c86011a0002919e5bbe5c2d )
46+ - I2C:
47+ [ 70ed30fcdf8ec62fa91485c3c0a161a9d0194668] ( https://github.com/Fabo/linux/commit/70ed30fcdf8ec62fa91485c3c0a161a9d0194668 )
3948
4049## Guidelines for Abstractions
4150
42- Abstractions may not be perfectly safe, but should try to be as safe as possible.
43- Unsafe functionality exposed should have its safety conditions documented
44- so that users have guidance on how to use the functionality and justify such use.
51+ Abstractions may not be perfectly safe, but should try to be as safe as
52+ possible. Unsafe functionality exposed should have its safety conditions
53+ documented so that users have guidance on how to use the functionality and
54+ justify such use.
4555
46- Abstractions should also attempt to present relatively idiomatic Rust in their interfaces:
47- - Follow Rust naming/capitalization conventions while remaining unsurprising to kernel developers.
56+ Abstractions should also attempt to present relatively idiomatic Rust in their
57+ interfaces:
58+
59+ - Follow Rust naming/capitalization conventions while remaining unsurprising to
60+ kernel developers.
4861- Use RAII instead of manual resource management where possible.
49- - Avoid raw pointers to bound kernel objects in favor of safer, more limited interfaces.
50-
62+ - Avoid raw pointers to bound kernel objects in favor of safer, more limited
63+ interfaces.
64+
5165 When exposing types from generated bindings, code should make use of the
52- [ ` Opaque<T> ` ] ( https://rust.docs.kernel.org/kernel/types/struct.Opaque.html ) type
53- along with native Rust references and the
54- [ ` ARef<T> ` ] ( https://rust.docs.kernel.org/kernel/types/struct.ARef.html ) type for types that are inherently reference-counted.
55- This type links types' built-in reference count operations to the ` Clone ` and ` Drop ` traits.
66+ [ ` Opaque<T> ` ] ( https://rust.docs.kernel.org/kernel/types/struct.Opaque.html )
67+ type along with native Rust references and the
68+ [ ` ARef<T> ` ] ( https://rust.docs.kernel.org/kernel/types/struct.ARef.html ) type
69+ for types that are inherently reference-counted. This type links types'
70+ built-in reference count operations to the ` Clone ` and ` Drop ` traits.
5671
5772## Submitting the cyclic dependency
5873
59- We already know that drivers should not use unsafe bindings directly.
60- But subsystem maintainers may balk if they see patches submitted that add Rust abstractions without motivation or consumers.
61- But drivers and subsystem abstractions may have to be submitted separately to different maintainers
62- due to the distributed nature of Linux development.
74+ We already know that drivers should not use unsafe bindings directly. But
75+ subsystem maintainers may balk if they see patches submitted that add Rust
76+ abstractions without motivation or consumers. But drivers and subsystem
77+ abstractions may have to be submitted separately to different maintainers due to
78+ the distributed nature of Linux development.
6379
64- So how should a developer submit a driver that requires bindings/abstractions for a subsystem not yet exposed to Rust?
80+ So how should a developer submit a driver that requires bindings/abstractions
81+ for a subsystem not yet exposed to Rust?
6582
6683There are two main approaches[ ^ 1 ] :
6784
68- 1 . Submit the driver as an RFC before submitting the abstractions it relies upon while referencing the RFC as a potential consumer.
69- 2 . Submit a stub driver and fill out non-stub functionality as subsystem abstractions land.
85+ 1 . Submit the driver as an RFC before submitting the abstractions it relies upon
86+ while referencing the RFC as a potential consumer.
87+ 2 . Submit a stub driver and fill out non-stub functionality as subsystem
88+ abstractions land.
7089
7190[ ^ 1 ] : < https://rust-for-linux.zulipchat.com/#narrow/channel/288089-General/topic/Upstreaming.20a.20driver.20with.20unsave.20C.20API.20calls.3F/near/471677707 >
0 commit comments