rust-for-linux.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 00/13] rust: bindings: Auto-generate inline static functions
@ 2024-11-07  2:08 Alistair Francis
  2024-11-07  2:08 ` [PATCH 01/13] rust: bindings: Support some " Alistair Francis
                   ` (13 more replies)
  0 siblings, 14 replies; 18+ messages in thread
From: Alistair Francis @ 2024-11-07  2:08 UTC (permalink / raw)
  To: alex.gaynor, benno.lossin, gary, linux-kernel, ojeda,
	rust-for-linux, bjorn3_gh, alistair.francis, me, a.hindborg,
	tmgross, boqun.feng, aliceryhl
  Cc: alistair23

The kernel includes a large number of static inline functions that are
defined in header files. One example is the crypto_shash_descsize()
function which is defined in hash.h as

```
static inline unsigned int crypto_shash_descsize(struct crypto_shash *tfm)
{
        return tfm->descsize;
}
```

bindgen is currently unable to generate bindings to these functions as
they are not publically exposed (they are static after all).

The Rust code currently uses rust_helper_* functions, such as
rust_helper_alloc_pages() for example to call the static inline
functions. But this is a hassle as someone needs to write a C helper
function.

Instead we can use the bindgen wrap-static-fns feature. The feature
is marked as experimental, but has recently been promoted to
non-experimental (dependig on your version of bindgen).

By supporting wrap-static-fns we automatically generate a C file called
extern.c that exposes the static inline functions, for example like this

```
unsigned int crypto_shash_descsize__extern(struct crypto_shash *tfm) { return crypto_shash_descsize(tfm); }
```

The nice part is that this is auto-generated.

We then also get a bindings_generate_static.rs file with the Rust
binding, like this

```
extern "C" {
    #[link_name = "crypto_shash_descsize__extern"]
    pub fn crypto_shash_descsize(tfm: *mut crypto_shash) -> core::ffi::c_uint;
}
```

So now we can use the static inline functions just like normal
functions.

There are a bunch of static inline functions that don't work though, because
the C compiler fails to build extern.c:
 * functions with inline asm generate "operand probably does not match constraints"
   errors (rip_rel_ptr() for example)
 * functions with bit masks (u32_encode_bits() and friends) result in
   "call to ‘__bad_mask’ declared with attribute error: bad bitfield mask"
   errors

As well as that any static inline function that calls a function that has been
kconfig-ed out will fail to link as the function being called isn't built
(mdio45_ethtool_gset_npage for example)

Due to these failures we use a allow-list system (where functions must
be manually enabled).

This series adds support for bindgen generating wrappers for inline statics and
then converts the existing helper functions to this new method. This doesn't
work for C macros, so we can't reamove all of the helper functions, but we
can remove most.

Alistair Francis (13):
  rust: bindings: Support some inline static functions
  rust: helpers: Remove blk helper
  rust: helpers: Remove build_bug helper
  rust: helpers: Remove err helper
  rust: helpers: Remove kunit helper
  rust: helpers: Remove mutex helper
  rust: helpers: Remove some page helpers
  rust: helpers: Remove rbtree helper
  rust: helpers: Remove some refcount helpers
  rust: helpers: Remove signal helper
  rust: helpers: Remove some spinlock helpers
  rust: helpers: Remove some task helpers
  rust: helpers: Remove uaccess helpers

 rust/.gitignore                 |  2 ++
 rust/Makefile                   | 36 ++++++++++++++++++++++++++++++---
 rust/bindgen_static_functions   | 31 ++++++++++++++++++++++++++++
 rust/bindings/bindings_helper.h |  5 +++++
 rust/bindings/lib.rs            |  4 ++++
 rust/exports.c                  |  1 +
 rust/helpers/blk.c              | 14 -------------
 rust/helpers/build_bug.c        |  9 ---------
 rust/helpers/err.c              | 19 -----------------
 rust/helpers/helpers.c          | 13 ++----------
 rust/helpers/kunit.c            |  9 ---------
 rust/helpers/mutex.c            | 15 --------------
 rust/helpers/page.c             |  5 -----
 rust/helpers/rbtree.c           |  9 ---------
 rust/helpers/refcount.c         | 10 ---------
 rust/helpers/signal.c           |  9 ---------
 rust/helpers/spinlock.c         | 10 ---------
 rust/helpers/task.c             | 10 ---------
 rust/helpers/uaccess.c          | 15 --------------
 19 files changed, 78 insertions(+), 148 deletions(-)
 create mode 100644 rust/bindgen_static_functions
 delete mode 100644 rust/helpers/blk.c
 delete mode 100644 rust/helpers/build_bug.c
 delete mode 100644 rust/helpers/err.c
 delete mode 100644 rust/helpers/kunit.c
 delete mode 100644 rust/helpers/mutex.c
 delete mode 100644 rust/helpers/rbtree.c
 delete mode 100644 rust/helpers/signal.c
 delete mode 100644 rust/helpers/uaccess.c

-- 
2.47.0


^ permalink raw reply	[flat|nested] 18+ messages in thread

end of thread, other threads:[~2024-11-07 13:47 UTC | newest]

Thread overview: 18+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-11-07  2:08 [PATCH 00/13] rust: bindings: Auto-generate inline static functions Alistair Francis
2024-11-07  2:08 ` [PATCH 01/13] rust: bindings: Support some " Alistair Francis
2024-11-07  9:25   ` kernel test robot
2024-11-07  2:08 ` [PATCH 02/13] rust: helpers: Remove blk helper Alistair Francis
2024-11-07  2:08 ` [PATCH 03/13] rust: helpers: Remove build_bug helper Alistair Francis
2024-11-07 13:46   ` kernel test robot
2024-11-07  2:08 ` [PATCH 04/13] rust: helpers: Remove err helper Alistair Francis
2024-11-07  2:08 ` [PATCH 05/13] rust: helpers: Remove kunit helper Alistair Francis
2024-11-07  2:08 ` [PATCH 06/13] rust: helpers: Remove mutex helper Alistair Francis
2024-11-07 11:20   ` kernel test robot
2024-11-07  2:08 ` [PATCH 07/13] rust: helpers: Remove some page helpers Alistair Francis
2024-11-07  2:08 ` [PATCH 08/13] rust: helpers: Remove rbtree helper Alistair Francis
2024-11-07  2:08 ` [PATCH 09/13] rust: helpers: Remove some refcount helpers Alistair Francis
2024-11-07  2:08 ` [PATCH 10/13] rust: helpers: Remove signal helper Alistair Francis
2024-11-07  2:08 ` [PATCH 11/13] rust: helpers: Remove some spinlock helpers Alistair Francis
2024-11-07  2:08 ` [PATCH 12/13] rust: helpers: Remove some task helpers Alistair Francis
2024-11-07  2:08 ` [PATCH 13/13] rust: helpers: Remove uaccess helpers Alistair Francis
2024-11-07  7:01 ` [PATCH 00/13] rust: bindings: Auto-generate inline static functions Dirk Behme

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).