* [RFC PATCH v2 0/2] rust: crates in other kernel directories
@ 2023-10-27 0:34 Martin Rodriguez Reboredo
2023-10-27 0:34 ` [RFC PATCH v2 1/2] kbuild: Build Rust crates as libraries Martin Rodriguez Reboredo
2023-10-27 0:34 ` [RFC PATCH v2 2/2] samples: rust: Add USB sample bindings Martin Rodriguez Reboredo
0 siblings, 2 replies; 8+ messages in thread
From: Martin Rodriguez Reboredo @ 2023-10-27 0:34 UTC (permalink / raw)
To: Miguel Ojeda, Alex Gaynor, Wedson Almeida Filho, Boqun Feng,
Gary Guo, Björn Roy Baron, Benno Lossin, Andreas Hindborg,
Alice Ryhl
Cc: linux-kbuild, linux-kernel, rust-for-linux
This RFC provides makes possible to have bindings for kernel subsystems
that are compiled as modules.
Previously, if you wanted to have Rust bindings for a subsystem, like
AMBA for example, you had to put it under `rust/kernel/` so it came
part of the `kernel` crate, but this came with many downsides. Namely
if you compiled said subsystem as a module you've a dependency on it
from `kernel`, which is linked directly on `vmlinux`.
So instead of overpopulating `kernel` with a gazillion modules that
throws you into dire straits you should rather have the bindings in the
same directory as the subsystem you want to bind with and link it to
it.
With this patch Rust sources can be compiled into libraries for them to
be consumed. These libraries are ar archives that follow the `.rlib`
structure, namely a libfoo.rlib thin archive with a foo.foo.o object
and a libfoo.rmeta rustc metadata as members. Such Rust crates get
their symbols exposed and the `bindings` crate is made available for
them.
Also included there's a sample usage of this in another patch, but it
is not meant to be merged as it remains as an example.
If you want to use a crate with your Rust module just add a `rust-libs`
variable in your Makefile with a value of the relative directory of
said crate plus its name, e.g.
# Link with the foo crate
rust-libs += ../path/to/foo
Martin Rodriguez Reboredo (2):
kbuild: Build Rust crates as libraries
samples: rust: Add USB sample bindings
.gitignore | 2 ++
Makefile | 4 +--
drivers/usb/core/Kconfig | 7 +++++
drivers/usb/core/Makefile | 3 ++
drivers/usb/core/usb.rs | 13 +++++++++
samples/rust/Kconfig | 10 +++++++
samples/rust/Makefile | 3 ++
samples/rust/rust_usb_simple.rs | 22 +++++++++++++++
scripts/Makefile.build | 49 ++++++++++++++++++++++++++++++---
scripts/Makefile.lib | 18 ++++++++++--
scripts/Makefile.modfinal | 7 ++++-
11 files changed, 128 insertions(+), 10 deletions(-)
create mode 100644 drivers/usb/core/usb.rs
create mode 100644 samples/rust/rust_usb_simple.rs
--
2.42.0
^ permalink raw reply [flat|nested] 8+ messages in thread* [RFC PATCH v2 1/2] kbuild: Build Rust crates as libraries 2023-10-27 0:34 [RFC PATCH v2 0/2] rust: crates in other kernel directories Martin Rodriguez Reboredo @ 2023-10-27 0:34 ` Martin Rodriguez Reboredo 2023-10-29 3:33 ` kernel test robot 2023-10-27 0:34 ` [RFC PATCH v2 2/2] samples: rust: Add USB sample bindings Martin Rodriguez Reboredo 1 sibling, 1 reply; 8+ messages in thread From: Martin Rodriguez Reboredo @ 2023-10-27 0:34 UTC (permalink / raw) To: Masahiro Yamada, Nathan Chancellor, Nick Desaulniers, Nicolas Schier, Miguel Ojeda, Alex Gaynor, Wedson Almeida Filho, Boqun Feng, Gary Guo, Björn Roy Baron, Benno Lossin, Andreas Hindborg, Alice Ryhl, Andrew Davis, Rob Herring, Shuah Khan, Andy Shevchenko, Chuck Lever Cc: linux-kbuild, linux-kernel, rust-for-linux Enables compiling Rust crates as dependencies of kernel modules. These are also meant to be used as libraries for other parts of the kernel. For these crates `bindings` is also exposed to them and they get their symbols exported for them to be used by other code. When a composite object depends on an `.rlib` file, which by the way is a current ar archive, Kbuild will compile it from its base Rust source and archive it. This makes possible to have Rust bindings for a subsystem that is compiled either built-in or as a module. They can also be made into modules by themselves too. Signed-off-by: Martin Rodriguez Reboredo <yakoyoku@gmail.com> --- v1 -> v2: - Fixed kernel compilation. - Added support for building crates as modules. .gitignore | 2 ++ Makefile | 4 ++-- scripts/Makefile.build | 49 +++++++++++++++++++++++++++++++++++---- scripts/Makefile.lib | 18 +++++++++++--- scripts/Makefile.modfinal | 7 +++++- 5 files changed, 70 insertions(+), 10 deletions(-) diff --git a/.gitignore b/.gitignore index 0bbae167bf93..8353b01e2915 100644 --- a/.gitignore +++ b/.gitignore @@ -38,6 +38,7 @@ *.o *.o.* *.patch +*.rlib *.rmeta *.rpm *.rsi @@ -53,6 +54,7 @@ *.zst Module.symvers modules.order +exports_*_generated.c # # Top-level generic files diff --git a/Makefile b/Makefile index 8a40530868ff..4113a5b93ddc 100644 --- a/Makefile +++ b/Makefile @@ -283,7 +283,7 @@ no-compiler-targets := $(no-dot-config-targets) install dtbs_install \ headers_install modules_install modules_sign kernelrelease image_name no-sync-config-targets := $(no-dot-config-targets) %install modules_sign kernelrelease \ image_name -single-targets := %.a %.i %.ko %.lds %.ll %.lst %.mod %.o %.rsi %.s %.symtypes %/ +single-targets := %.a %.i %.ko %.lds %.ll %.lst %.mod %.o %.rlib %.rsi %.s %.symtypes %/ config-build := mixed-build := @@ -1919,7 +1919,7 @@ $(clean-dirs): clean: $(clean-dirs) $(call cmd,rmfiles) @find $(or $(KBUILD_EXTMOD), .) $(RCS_FIND_IGNORE) \ - \( -name '*.[aios]' -o -name '*.rsi' -o -name '*.ko' -o -name '.*.cmd' \ + \( -name '*.[aios]' -o -name '*.rlib' -o -name '*.rsi' -o -name '*.ko' -o -name '.*.cmd' \ -o -name '*.ko.*' \ -o -name '*.dtb' -o -name '*.dtbo' \ -o -name '*.dtb.S' -o -name '*.dtbo.S' \ diff --git a/scripts/Makefile.build b/scripts/Makefile.build index da37bfa97211..11045ddba1a9 100644 --- a/scripts/Makefile.build +++ b/scripts/Makefile.build @@ -20,6 +20,7 @@ always-m := targets := subdir-y := subdir-m := +rust-libs := EXTRA_AFLAGS := EXTRA_CFLAGS := EXTRA_CPPFLAGS := @@ -243,9 +244,13 @@ $(obj)/%.o: $(src)/%.c $(recordmcount_source) FORCE $(call if_changed_rule,cc_o_c) $(call cmd,force_checksrc) +mod_objs = $(call real-search, $*.o, .o, -objs -y -m) +exports_objs = $(foreach m, $(sort $(basename \ + $(filter $(notdir $(rlib-m)), $(mod_objs)))), exports_$m_generated.o) + # To make this rule robust against "Argument list too long" error, # ensure to add $(obj)/ prefix by a shell command. -cmd_mod = printf '%s\n' $(call real-search, $*.o, .o, -objs -y -m) | \ +cmd_mod = printf '%s\n' $(mod_objs) $(exports_objs) | \ $(AWK) '!x[$$0]++ { print("$(obj)/"$$0) }' > $@ $(obj)/%.mod: FORCE @@ -274,7 +279,7 @@ rust_common_cmd = \ -Zcrate-attr='feature($(rust_allowed_features))' \ --extern alloc --extern kernel \ --crate-type rlib -L $(objtree)/rust/ \ - --crate-name $(basename $(notdir $@)) \ + --crate-name $(basename $(notdir $<)) \ --out-dir $(dir $@) --emit=dep-info=$(depfile) # `--emit=obj`, `--emit=asm` and `--emit=llvm-ir` imply a single codegen unit @@ -285,11 +290,42 @@ rust_common_cmd = \ # i.e. the outputs we would get for the different single targets (e.g. `.ll`) # would not match each other. +rlib_obj = $(dir $@)$*.$*.o +rlib_meta = $(dir $@)$(patsubst %.rlib,%.rmeta,$(notdir $@)) + quiet_cmd_rustc_o_rs = $(RUSTC_OR_CLIPPY_QUIET) $(quiet_modtag) $@ cmd_rustc_o_rs = $(rust_common_cmd) --emit=obj=$@ $< +quiet_cmd_ln_rlib_o = SYMLINK $@ + cmd_ln_rlib_o = ln -s -f $*.$*.o $@ + $(obj)/%.o: $(src)/%.rs FORCE - $(call if_changed_dep,rustc_o_rs) + $(if $(findstring $@, $(rlib-y) $(rlib-m)), \ + $(call if_changed,ln_rlib_o), $(call if_changed_dep,rustc_o_rs)) + +quiet_cmd_rustc_rlib_rs = $(RUSTC_OR_CLIPPY_QUIET) $(quiet_modtag) $@ + cmd_rustc_rlib_rs = $(rust_common_cmd) --extern bindings \ + --emit=obj=$(rlib_obj) --emit=metadata=$(rlib_meta) $<; \ + rm -f $@; $(AR) cDPrST $@ $(rlib_obj) $(rlib_meta) + +quiet_cmd_rlib_exports = EXPORTS $@ + cmd_rlib_exports = \ + echo "\#include <linux/module.h>" > $@; \ + $(NM) -p --defined-only $(rlib_obj) \ + | grep -P ' (T|R|D) (?!(init|cleanup)_module)' | cut -d ' ' -f 3 \ + | xargs -Isymbol \ + echo 'extern int symbol; EXPORT_SYMBOL_GPL(symbol);' >> $@ + +$(rlib-m): $(obj)/%.o: $(obj)/exports_%_generated.o $(obj)/lib%.rlib $(src)/%.rs FORCE + +$(obj)/lib%.rlib: $(src)/%.rs FORCE + $(call if_changed_dep,rustc_rlib_rs) + +$(obj)/exports_%_generated.c: $(obj)/lib%.rlib FORCE + $(call if_changed,rlib_exports) + +$(obj)/exports_%_generated.o: $(obj)/exports_%_generated.c FORCE + $(call if_changed,cc_o_c) quiet_cmd_rustc_rsi_rs = $(RUSTC_OR_CLIPPY_QUIET) $(quiet_modtag) $@ cmd_rustc_rsi_rs = \ @@ -394,9 +430,14 @@ $(subdir-modorder): $(obj)/%/modules.order: $(obj)/% ; # To make this rule robust against "Argument list too long" error, # remove $(obj)/ prefix, and restore it by a shell command. +# If we have a .rlib for the archive change it for its object member +crate-obj = $(foreach m, $1, $(if $(findstring .rlib, $m), \ + $(basename $(m:lib%=%)).$(m:lib%.rlib=%.o),$m)) + quiet_cmd_ar_builtin = AR $@ cmd_ar_builtin = rm -f $@; \ - $(if $(real-prereqs), printf "$(obj)/%s " $(patsubst $(obj)/%,%,$(real-prereqs)) | xargs) \ + $(if $(real-prereqs), printf "$(obj)/%s " \ + $(call crate-obj, $(patsubst $(obj)/%,%,$(real-prereqs))) | xargs) \ $(AR) cDPrST $@ $(obj)/built-in.a: $(real-obj-y) FORCE diff --git a/scripts/Makefile.lib b/scripts/Makefile.lib index 68d0134bdbf9..3454b05dbbdc 100644 --- a/scripts/Makefile.lib +++ b/scripts/Makefile.lib @@ -45,12 +45,17 @@ else obj-y := $(filter-out %/, $(obj-y)) endif +rlib-y := $(foreach m, $(filter lib%.rlib, $(obj-y)), $(m:lib%.rlib=%.o)) +rlib-m := $(foreach m, $(filter lib%.rlib, $(obj-m)), $(m:lib%.rlib=%.o)) + # Expand $(foo-objs) $(foo-y) etc. by replacing their individuals suffix-search = $(strip $(foreach s, $3, $($(1:%$(strip $2)=%$s)))) # List composite targets that are constructed by combining other targets multi-search = $(sort $(foreach m, $1, $(if $(call suffix-search, $m, $2, $3 -), $m))) # List primitive targets that are compiled from source files real-search = $(foreach m, $1, $(if $(call suffix-search, $m, $2, $3 -), $(call suffix-search, $m, $2, $3), $m)) +# List exported symbols from .rlib targets +rlib-exports = $(foreach m, $1, $(if $(findstring .rlib, $m),$(m:lib%.rlib=exports_%_generated.o)) $m) # If $(foo-objs), $(foo-y), $(foo-m), or $(foo-) exists, foo.o is a composite object multi-obj-y := $(call multi-search, $(obj-y), .o, -objs -y) @@ -59,7 +64,7 @@ multi-obj-ym := $(multi-obj-y) $(multi-obj-m) # Replace multi-part objects by their individual parts, # including built-in.a from subdirectories -real-obj-y := $(call real-search, $(obj-y), .o, -objs -y) +real-obj-y := $(call rlib-exports, $(call real-search, $(obj-y), .o, -objs -y)) real-obj-m := $(call real-search, $(obj-m), .o, -objs -y -m) always-y += $(always-m) @@ -95,6 +100,8 @@ extra-y := $(addprefix $(obj)/,$(extra-y)) always-y := $(addprefix $(obj)/,$(always-y)) targets := $(addprefix $(obj)/,$(targets)) obj-m := $(addprefix $(obj)/,$(obj-m)) +rlib-y := $(addprefix $(obj)/,$(rlib-y)) +rlib-m := $(addprefix $(obj)/,$(rlib-m)) lib-y := $(addprefix $(obj)/,$(lib-y)) real-obj-y := $(addprefix $(obj)/,$(real-obj-y)) real-obj-m := $(addprefix $(obj)/,$(real-obj-m)) @@ -210,7 +217,11 @@ _cpp_flags += -I $(srctree)/$(src) -I $(objtree)/$(obj) endif endif -part-of-module = $(if $(filter $(basename $@).o, $(real-obj-m)),y) +_rust_libs = $(foreach l, $(rust-libs), -L $(obj)/$(dir $l) --extern $(notdir $(basename $l))) + +part-of-module = \ + $(if $(or $(filter $(basename $@).o, $(real-obj-m)), \ + $(filter $(basename $@).rlib, $(real-obj-m))),y) quiet_modtag = $(if $(part-of-module),[M], ) modkern_cflags = \ @@ -232,7 +243,8 @@ c_flags = -Wp,-MMD,$(depfile) $(NOSTDINC_FLAGS) $(LINUXINCLUDE) \ $(_c_flags) $(modkern_cflags) \ $(basename_flags) $(modname_flags) -rust_flags = $(_rust_flags) $(modkern_rustflags) @$(objtree)/include/generated/rustc_cfg +rust_flags = $(_rust_flags) $(modkern_rustflags) $(_rust_libs) \ + @$(objtree)/include/generated/rustc_cfg a_flags = -Wp,-MMD,$(depfile) $(NOSTDINC_FLAGS) $(LINUXINCLUDE) \ $(_a_flags) $(modkern_aflags) diff --git a/scripts/Makefile.modfinal b/scripts/Makefile.modfinal index b3a6aa8fbe8c..e05749a5ca0a 100644 --- a/scripts/Makefile.modfinal +++ b/scripts/Makefile.modfinal @@ -30,11 +30,16 @@ quiet_cmd_cc_o_c = CC [M] $@ ARCH_POSTLINK := $(wildcard $(srctree)/arch/$(SRCARCH)/Makefile.postlink) +# Symlinks of foo.o that point to foo.foo.o are members of a .rlib archives, +# so their exports should be added to the module +ko_objs = $(foreach o, $(filter %.o, $^),$(if \ + $(filter-out %$o,$(realpath $o)),$(dir $o)exports_$(notdir $*)_generated.o) $o) + quiet_cmd_ld_ko_o = LD [M] $@ cmd_ld_ko_o += \ $(LD) -r $(KBUILD_LDFLAGS) \ $(KBUILD_LDFLAGS_MODULE) $(LDFLAGS_MODULE) \ - -T scripts/module.lds -o $@ $(filter %.o, $^); \ + -T scripts/module.lds -o $@ $(ko_objs); \ $(if $(ARCH_POSTLINK), $(MAKE) -f $(ARCH_POSTLINK) $@, true) quiet_cmd_btf_ko = BTF [M] $@ -- 2.42.0 ^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [RFC PATCH v2 1/2] kbuild: Build Rust crates as libraries 2023-10-27 0:34 ` [RFC PATCH v2 1/2] kbuild: Build Rust crates as libraries Martin Rodriguez Reboredo @ 2023-10-29 3:33 ` kernel test robot 0 siblings, 0 replies; 8+ messages in thread From: kernel test robot @ 2023-10-29 3:33 UTC (permalink / raw) To: Martin Rodriguez Reboredo; +Cc: oe-kbuild-all Hi Martin, [This is a private test report for your RFC patch.] kernel test robot noticed the following build errors: [auto build test ERROR on masahiroy-kbuild/fixes] [also build test ERROR on usb/usb-testing usb/usb-next usb/usb-linus rust/rust-next linus/master v6.6-rc7 next-20231027] [cannot apply to masahiroy-kbuild/for-next] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch#_base_tree_information] url: https://github.com/intel-lab-lkp/linux/commits/Martin-Rodriguez-Reboredo/kbuild-Build-Rust-crates-as-libraries/20231027-083627 base: https://git.kernel.org/pub/scm/linux/kernel/git/masahiroy/linux-kbuild.git fixes patch link: https://lore.kernel.org/r/20231027003504.146703-2-yakoyoku%40gmail.com patch subject: [RFC PATCH v2 1/2] kbuild: Build Rust crates as libraries config: um-randconfig-001-20231029 (https://download.01.org/0day-ci/archive/20231029/202310291142.LW6eZd8v-lkp@intel.com/config) compiler: gcc-12 (Debian 12.2.0-14) 12.2.0 reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20231029/202310291142.LW6eZd8v-lkp@intel.com/reproduce) If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@intel.com> | Closes: https://lore.kernel.org/oe-kbuild-all/202310291142.LW6eZd8v-lkp@intel.com/ All errors (new ones prefixed by >>): >> ld: cannot find drivers/nvdimm/../../tools/testing/nvdimm/test/exports_iomap_generated.o: No such file or directory >> ld: cannot find drivers/nvdimm/../../tools/testing/nvdimm/test/exports_iomap_generated.o: No such file or directory -- 0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki ^ permalink raw reply [flat|nested] 8+ messages in thread
* [RFC PATCH v2 2/2] samples: rust: Add USB sample bindings 2023-10-27 0:34 [RFC PATCH v2 0/2] rust: crates in other kernel directories Martin Rodriguez Reboredo 2023-10-27 0:34 ` [RFC PATCH v2 1/2] kbuild: Build Rust crates as libraries Martin Rodriguez Reboredo @ 2023-10-27 0:34 ` Martin Rodriguez Reboredo 2023-10-27 3:21 ` Martin Rodriguez Reboredo ` (2 more replies) 1 sibling, 3 replies; 8+ messages in thread From: Martin Rodriguez Reboredo @ 2023-10-27 0:34 UTC (permalink / raw) To: Greg Kroah-Hartman, Miguel Ojeda, Alex Gaynor, Wedson Almeida Filho, Boqun Feng, Gary Guo, Björn Roy Baron, Benno Lossin, Andreas Hindborg, Alice Ryhl Cc: linux-kbuild, linux-kernel, linux-usb, rust-for-linux This is a demonstration of the capabilities of doing bindings with subsystems that may or may not be statically linked. Signed-off-by: Martin Rodriguez Reboredo <yakoyoku@gmail.com> --- drivers/usb/core/Kconfig | 7 +++++++ drivers/usb/core/Makefile | 3 +++ drivers/usb/core/usb.rs | 13 +++++++++++++ samples/rust/Kconfig | 10 ++++++++++ samples/rust/Makefile | 3 +++ samples/rust/rust_usb_simple.rs | 22 ++++++++++++++++++++++ 6 files changed, 58 insertions(+) create mode 100644 drivers/usb/core/usb.rs create mode 100644 samples/rust/rust_usb_simple.rs diff --git a/drivers/usb/core/Kconfig b/drivers/usb/core/Kconfig index 351ede4b5de2..4b5604282129 100644 --- a/drivers/usb/core/Kconfig +++ b/drivers/usb/core/Kconfig @@ -116,3 +116,10 @@ config USB_AUTOSUSPEND_DELAY The default value Linux has always had is 2 seconds. Change this value if you want a different delay and cannot modify the command line or module parameter. + +config USB_RUST + bool "Rust USB bindings" + depends on USB && RUST + default n + help + Enables Rust bindings for USB. diff --git a/drivers/usb/core/Makefile b/drivers/usb/core/Makefile index 7d338e9c0657..00e116913591 100644 --- a/drivers/usb/core/Makefile +++ b/drivers/usb/core/Makefile @@ -11,6 +11,7 @@ usbcore-y += phy.o port.o usbcore-$(CONFIG_OF) += of.o usbcore-$(CONFIG_USB_PCI) += hcd-pci.o usbcore-$(CONFIG_ACPI) += usb-acpi.o +usbcore-$(CONFIG_USB_RUST) += libusb.rlib ifdef CONFIG_USB_ONBOARD_HUB usbcore-y += ../misc/onboard_usb_hub_pdevs.o @@ -18,4 +19,6 @@ endif obj-$(CONFIG_USB) += usbcore.o +rust-libs := ./usb + obj-$(CONFIG_USB_LEDS_TRIGGER_USBPORT) += ledtrig-usbport.o diff --git a/drivers/usb/core/usb.rs b/drivers/usb/core/usb.rs new file mode 100644 index 000000000000..3f7ad02153f5 --- /dev/null +++ b/drivers/usb/core/usb.rs @@ -0,0 +1,13 @@ +// SPDX-License-Identifier: GPL-2.0 + +//! USB devices and drivers. +//! +//! C header: [`include/linux/usb.h`](../../../../include/linux/usb.h) + +use kernel::bindings; + +/// Check if USB is disabled. +pub fn disabled() -> bool { + // SAFETY: FFI call. + unsafe { bindings::usb_disabled() != 0 } +} diff --git a/samples/rust/Kconfig b/samples/rust/Kconfig index b0f74a81c8f9..12116f6fb526 100644 --- a/samples/rust/Kconfig +++ b/samples/rust/Kconfig @@ -30,6 +30,16 @@ config SAMPLE_RUST_PRINT If unsure, say N. +config SAMPLE_RUST_USB_SIMPLE + tristate "USB simple device driver" + help + This option builds the Rust USB simple driver sample. + + To compile this as a module, choose M here: + the module will be called rust_usb_simple. + + If unsure, say N. + config SAMPLE_RUST_HOSTPROGS bool "Host programs" help diff --git a/samples/rust/Makefile b/samples/rust/Makefile index 03086dabbea4..f1ab58a9ecdd 100644 --- a/samples/rust/Makefile +++ b/samples/rust/Makefile @@ -2,5 +2,8 @@ obj-$(CONFIG_SAMPLE_RUST_MINIMAL) += rust_minimal.o obj-$(CONFIG_SAMPLE_RUST_PRINT) += rust_print.o +obj-$(CONFIG_SAMPLE_RUST_USB_SIMPLE) += rust_usb_simple.o + +rust-libs := ../../drivers/usb/core/usb subdir-$(CONFIG_SAMPLE_RUST_HOSTPROGS) += hostprogs diff --git a/samples/rust/rust_usb_simple.rs b/samples/rust/rust_usb_simple.rs new file mode 100644 index 000000000000..3523f81d5eb8 --- /dev/null +++ b/samples/rust/rust_usb_simple.rs @@ -0,0 +1,22 @@ +// SPDX-License-Identifier: GPL-2.0 + +//! Rust USB sample. + +use kernel::prelude::*; + +module! { + type: UsbSimple, + name: "rust_usb_simple", + author: "Martin Rodriguez Reboredo", + description: "Rust USB sample", + license: "GPL v2", +} + +struct UsbSimple; + +impl kernel::Module for UsbSimple { + fn init(_module: &'static ThisModule) -> Result<Self> { + pr_info!("usb enabled: {}", !usb::disabled()); + Ok(UsbSimple) + } +} -- 2.42.0 ^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [RFC PATCH v2 2/2] samples: rust: Add USB sample bindings 2023-10-27 0:34 ` [RFC PATCH v2 2/2] samples: rust: Add USB sample bindings Martin Rodriguez Reboredo @ 2023-10-27 3:21 ` Martin Rodriguez Reboredo 2023-10-27 7:15 ` Greg Kroah-Hartman 2023-10-27 13:08 ` Greg Kroah-Hartman 2 siblings, 0 replies; 8+ messages in thread From: Martin Rodriguez Reboredo @ 2023-10-27 3:21 UTC (permalink / raw) To: yakoyoku, Miguel Ojeda, Alex Gaynor, Wedson Almeida Filho, Boqun Feng, Gary Guo, Björn Roy Baron, Benno Lossin, Andreas Hindborg, Alice Ryhl Cc: gregkh, linux-kbuild, linux-kernel, linux-usb, rust-for-linux, Wedson Almeida Filho This was missing in the patch, but you get the point... diff --git a/rust/bindings/bindings_helper.h b/rust/bindings/bindings_helper.h index c41eaab4ddb2..845cdd856981 100644 --- a/rust/bindings/bindings_helper.h +++ b/rust/bindings/bindings_helper.h @@ -10,6 +10,7 @@ #include <linux/errname.h> #include <linux/slab.h> #include <linux/refcount.h> +#include <linux/usb.h> #include <linux/wait.h> #include <linux/sched.h> #include <linux/workqueue.h> ^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [RFC PATCH v2 2/2] samples: rust: Add USB sample bindings 2023-10-27 0:34 ` [RFC PATCH v2 2/2] samples: rust: Add USB sample bindings Martin Rodriguez Reboredo 2023-10-27 3:21 ` Martin Rodriguez Reboredo @ 2023-10-27 7:15 ` Greg Kroah-Hartman 2023-10-27 13:07 ` Martin Rodriguez Reboredo 2023-10-27 13:08 ` Greg Kroah-Hartman 2 siblings, 1 reply; 8+ messages in thread From: Greg Kroah-Hartman @ 2023-10-27 7:15 UTC (permalink / raw) To: Martin Rodriguez Reboredo Cc: Miguel Ojeda, Alex Gaynor, Wedson Almeida Filho, Boqun Feng, Gary Guo, Björn Roy Baron, Benno Lossin, Andreas Hindborg, Alice Ryhl, linux-kbuild, linux-kernel, linux-usb, rust-for-linux On Thu, Oct 26, 2023 at 09:34:51PM -0300, Martin Rodriguez Reboredo wrote: > This is a demonstration of the capabilities of doing bindings with > subsystems that may or may not be statically linked. > > Signed-off-by: Martin Rodriguez Reboredo <yakoyoku@gmail.com> > --- > drivers/usb/core/Kconfig | 7 +++++++ > drivers/usb/core/Makefile | 3 +++ > drivers/usb/core/usb.rs | 13 +++++++++++++ > samples/rust/Kconfig | 10 ++++++++++ > samples/rust/Makefile | 3 +++ > samples/rust/rust_usb_simple.rs | 22 ++++++++++++++++++++++ > 6 files changed, 58 insertions(+) > create mode 100644 drivers/usb/core/usb.rs > create mode 100644 samples/rust/rust_usb_simple.rs > > diff --git a/drivers/usb/core/Kconfig b/drivers/usb/core/Kconfig > index 351ede4b5de2..4b5604282129 100644 > --- a/drivers/usb/core/Kconfig > +++ b/drivers/usb/core/Kconfig > @@ -116,3 +116,10 @@ config USB_AUTOSUSPEND_DELAY > The default value Linux has always had is 2 seconds. Change > this value if you want a different delay and cannot modify > the command line or module parameter. > + > +config USB_RUST > + bool "Rust USB bindings" > + depends on USB && RUST > + default n Nit, "n" is the default, this line is not needed. Also, if you want to get really picky, _which_ USB is this for, the "host" apis (you plug a USB device into a Linux maching), or the "gadget" apis (i.e. Linux is running in the device that you plug into a USB host)? Linux supports both :) > + help > + Enables Rust bindings for USB. > diff --git a/drivers/usb/core/Makefile b/drivers/usb/core/Makefile > index 7d338e9c0657..00e116913591 100644 > --- a/drivers/usb/core/Makefile > +++ b/drivers/usb/core/Makefile > @@ -11,6 +11,7 @@ usbcore-y += phy.o port.o > usbcore-$(CONFIG_OF) += of.o > usbcore-$(CONFIG_USB_PCI) += hcd-pci.o > usbcore-$(CONFIG_ACPI) += usb-acpi.o > +usbcore-$(CONFIG_USB_RUST) += libusb.rlib > > ifdef CONFIG_USB_ONBOARD_HUB > usbcore-y += ../misc/onboard_usb_hub_pdevs.o > @@ -18,4 +19,6 @@ endif > > obj-$(CONFIG_USB) += usbcore.o > > +rust-libs := ./usb > + > obj-$(CONFIG_USB_LEDS_TRIGGER_USBPORT) += ledtrig-usbport.o > diff --git a/drivers/usb/core/usb.rs b/drivers/usb/core/usb.rs > new file mode 100644 > index 000000000000..3f7ad02153f5 > --- /dev/null > +++ b/drivers/usb/core/usb.rs > @@ -0,0 +1,13 @@ > +// SPDX-License-Identifier: GPL-2.0 > + > +//! USB devices and drivers. > +//! > +//! C header: [`include/linux/usb.h`](../../../../include/linux/usb.h) > + > +use kernel::bindings; > + > +/// Check if USB is disabled. > +pub fn disabled() -> bool { > + // SAFETY: FFI call. > + unsafe { bindings::usb_disabled() != 0 } > +} > diff --git a/samples/rust/Kconfig b/samples/rust/Kconfig > index b0f74a81c8f9..12116f6fb526 100644 > --- a/samples/rust/Kconfig > +++ b/samples/rust/Kconfig > @@ -30,6 +30,16 @@ config SAMPLE_RUST_PRINT > > If unsure, say N. > > +config SAMPLE_RUST_USB_SIMPLE > + tristate "USB simple device driver" > + help > + This option builds the Rust USB simple driver sample. > + > + To compile this as a module, choose M here: > + the module will be called rust_usb_simple. > + > + If unsure, say N. > + > config SAMPLE_RUST_HOSTPROGS > bool "Host programs" > help > diff --git a/samples/rust/Makefile b/samples/rust/Makefile > index 03086dabbea4..f1ab58a9ecdd 100644 > --- a/samples/rust/Makefile > +++ b/samples/rust/Makefile > @@ -2,5 +2,8 @@ > > obj-$(CONFIG_SAMPLE_RUST_MINIMAL) += rust_minimal.o > obj-$(CONFIG_SAMPLE_RUST_PRINT) += rust_print.o > +obj-$(CONFIG_SAMPLE_RUST_USB_SIMPLE) += rust_usb_simple.o > + > +rust-libs := ../../drivers/usb/core/usb > > subdir-$(CONFIG_SAMPLE_RUST_HOSTPROGS) += hostprogs > diff --git a/samples/rust/rust_usb_simple.rs b/samples/rust/rust_usb_simple.rs > new file mode 100644 > index 000000000000..3523f81d5eb8 > --- /dev/null > +++ b/samples/rust/rust_usb_simple.rs > @@ -0,0 +1,22 @@ > +// SPDX-License-Identifier: GPL-2.0 > + > +//! Rust USB sample. > + > +use kernel::prelude::*; > + > +module! { > + type: UsbSimple, > + name: "rust_usb_simple", > + author: "Martin Rodriguez Reboredo", > + description: "Rust USB sample", > + license: "GPL v2", > +} > + > +struct UsbSimple; "USBSimple" please. > + > +impl kernel::Module for UsbSimple { > + fn init(_module: &'static ThisModule) -> Result<Self> { > + pr_info!("usb enabled: {}", !usb::disabled()); > + Ok(UsbSimple) > + } > +} I know this is just a fake patch to test the bindings logic, so sorry for the noise, just wanted to get terminology right :) thanks, greg k-h ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [RFC PATCH v2 2/2] samples: rust: Add USB sample bindings 2023-10-27 7:15 ` Greg Kroah-Hartman @ 2023-10-27 13:07 ` Martin Rodriguez Reboredo 0 siblings, 0 replies; 8+ messages in thread From: Martin Rodriguez Reboredo @ 2023-10-27 13:07 UTC (permalink / raw) To: Greg Kroah-Hartman Cc: Miguel Ojeda, Alex Gaynor, Wedson Almeida Filho, Boqun Feng, Gary Guo, Björn Roy Baron, Benno Lossin, Andreas Hindborg, Alice Ryhl, linux-kbuild, linux-kernel, linux-usb, rust-for-linux On 10/27/23 04:15, Greg Kroah-Hartman wrote: > On Thu, Oct 26, 2023 at 09:34:51PM -0300, Martin Rodriguez Reboredo wrote: >> [...] >> + >> +config USB_RUST >> + bool "Rust USB bindings" >> + depends on USB && RUST >> + default n > > Nit, "n" is the default, this line is not needed. > > Also, if you want to get really picky, _which_ USB is this for, the > "host" apis (you plug a USB device into a Linux maching), or the > "gadget" apis (i.e. Linux is running in the device that you plug into a > USB host)? Linux supports both :) Nice one! I'll probably target host APIs as of now due to what I have in my hands. >> + help >> + Enables Rust bindings for USB. >> [...] >> +//! Rust USB sample. >> + >> +use kernel::prelude::*; >> + >> +module! { >> + type: UsbSimple, >> + name: "rust_usb_simple", >> + author: "Martin Rodriguez Reboredo", >> + description: "Rust USB sample", >> + license: "GPL v2", >> +} >> + >> +struct UsbSimple; > > "USBSimple" please. > >> + >> +impl kernel::Module for UsbSimple { >> + fn init(_module: &'static ThisModule) -> Result<Self> { >> + pr_info!("usb enabled: {}", !usb::disabled()); >> + Ok(UsbSimple) >> + } >> +} > > I know this is just a fake patch to test the bindings logic, so sorry > for the noise, just wanted to get terminology right :) > > thanks, > > greg k-h No, you are right. Because Rust uses upper camel case for struct names there's the tendency of lowering initialisms, so you can either leave it as `USBSimple` or as `UsbSimple`. When I publish my USB host bindings I'll take your comment into account for sure. ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [RFC PATCH v2 2/2] samples: rust: Add USB sample bindings 2023-10-27 0:34 ` [RFC PATCH v2 2/2] samples: rust: Add USB sample bindings Martin Rodriguez Reboredo 2023-10-27 3:21 ` Martin Rodriguez Reboredo 2023-10-27 7:15 ` Greg Kroah-Hartman @ 2023-10-27 13:08 ` Greg Kroah-Hartman 2 siblings, 0 replies; 8+ messages in thread From: Greg Kroah-Hartman @ 2023-10-27 13:08 UTC (permalink / raw) To: Martin Rodriguez Reboredo Cc: Miguel Ojeda, Alex Gaynor, Wedson Almeida Filho, Boqun Feng, Gary Guo, Björn Roy Baron, Benno Lossin, Andreas Hindborg, Alice Ryhl, linux-kbuild, linux-kernel, linux-usb, rust-for-linux On Thu, Oct 26, 2023 at 09:34:51PM -0300, Martin Rodriguez Reboredo wrote: > This is a demonstration of the capabilities of doing bindings with > subsystems that may or may not be statically linked. > > Signed-off-by: Martin Rodriguez Reboredo <yakoyoku@gmail.com> > --- > drivers/usb/core/Kconfig | 7 +++++++ > drivers/usb/core/Makefile | 3 +++ > drivers/usb/core/usb.rs | 13 +++++++++++++ > samples/rust/Kconfig | 10 ++++++++++ > samples/rust/Makefile | 3 +++ > samples/rust/rust_usb_simple.rs | 22 ++++++++++++++++++++++ > 6 files changed, 58 insertions(+) > create mode 100644 drivers/usb/core/usb.rs > create mode 100644 samples/rust/rust_usb_simple.rs > Hi, This is the friendly patch-bot of Greg Kroah-Hartman. You have sent him a patch that has triggered this response. He used to manually respond to these common problems, but in order to save his sanity (he kept writing the same thing over and over, yet to different people), I was created. Hopefully you will not take offence and will fix the problem in your patch and resubmit it so that it can be accepted into the Linux kernel tree. You are receiving this message because of the following common error(s) as indicated below: - This looks like a new version of a previously submitted patch, but you did not list below the --- line any changes from the previous version. Please read the section entitled "The canonical patch format" in the kernel file, Documentation/process/submitting-patches.rst for what needs to be done here to properly describe this. If you wish to discuss this problem further, or you have questions about how to resolve this issue, please feel free to respond to this email and Greg will reply once he has dug out from the pending patches received from other developers. thanks, greg k-h's patch email bot ^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2023-10-29 3:33 UTC | newest] Thread overview: 8+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2023-10-27 0:34 [RFC PATCH v2 0/2] rust: crates in other kernel directories Martin Rodriguez Reboredo 2023-10-27 0:34 ` [RFC PATCH v2 1/2] kbuild: Build Rust crates as libraries Martin Rodriguez Reboredo 2023-10-29 3:33 ` kernel test robot 2023-10-27 0:34 ` [RFC PATCH v2 2/2] samples: rust: Add USB sample bindings Martin Rodriguez Reboredo 2023-10-27 3:21 ` Martin Rodriguez Reboredo 2023-10-27 7:15 ` Greg Kroah-Hartman 2023-10-27 13:07 ` Martin Rodriguez Reboredo 2023-10-27 13:08 ` Greg Kroah-Hartman
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.