`alloc`, `#[expect]` and "Custom FFI"
Subsystems (20)
Miguel Ojeda
maintainerPATCH 47/60 kbuild: rust: remove the `alloc` crate and `GlobalAlloc`
In reply to Miguel OjedaFrom: Danilo Krummrich <[email protected]>
commit 392e34b6bc22077ef63abf62387ea3e9f39418c1 upstream.
Now that we have our own Allocator, Box and Vec types we can remove Rust's alloc crate and the new_uninit unstable feature.
Also remove Kmalloc's GlobalAlloc implementation -- we can't remove this in a separate patch, since the alloc crate requires a #[global_allocator] to set, that implements GlobalAlloc.
--- rust/Makefile | 43 +++++--------------- rust/exports.c | 1 - rust/kernel/alloc/allocator.rs | 65 +------------------------------ scripts/Makefile.build | 4 +- scripts/generate_rust_analyzer.py | 11 +----- 5 files changed, 16 insertions(+), 108 deletions(-)
rust/Makefile +10 -33
@@ -15,8 +15,8 @@ always-$(CONFIG_RUST) += libmacros.so no-clean-files += libmacros.so always-$(CONFIG_RUST) += bindings/bindings_generated.rs bindings/bindings_helpers_generated.rs -obj-$(CONFIG_RUST) += alloc.o bindings.o kernel.o -always-$(CONFIG_RUST) += exports_alloc_generated.h exports_helpers_generated.h \ +obj-$(CONFIG_RUST) += bindings.o kernel.o +always-$(CONFIG_RUST) += exports_helpers_generated.h \ exports_bindings_generated.h exports_kernel_generated.h always-$(CONFIG_RUST) += uapi/uapi_generated.rs
@@ -53,11 +53,6 @@ endif core-cfgs = \ --cfg no_fp_fmt_parse -alloc-cfgs = \ - --cfg no_global_oom_handling \ - --cfg no_rc \ - --cfg no_sync - quiet_cmd_rustdoc = RUSTDOC $(if $(rustdoc_host),H, ) $< cmd_rustdoc = \ OBJTREE=$(abspath $(objtree)) \
@@ -81,7 +76,7 @@ quiet_cmd_rustdoc = RUSTDOC $(if $(rustdoc_host),H, ) $< # command-like flags to solve the issue. Meanwhile, we use the non-custom case # and then retouch the generated files. rustdoc: rustdoc-core rustdoc-macros rustdoc-compiler_builtins \ - rustdoc-alloc rustdoc-kernel + rustdoc-kernel $(Q)cp $(srctree)/Documentation/images/logo.svg $(rustdoc_output)/static.files/ $(Q)cp $(srctree)/Documentation/images/COPYING-logo $(rustdoc_output)/static.files/ $(Q)find $(rustdoc_output) -name '*.html' -type f -print0 | xargs -0 sed -Ei \
@@ -108,20 +103,11 @@ rustdoc-core: $(RUST_LIB_SRC)/core/src/lib.rs FORCE rustdoc-compiler_builtins: $(src)/compiler_builtins.rs rustdoc-core FORCE +$(call if_changed,rustdoc) -# We need to allow `rustdoc::broken_intra_doc_links` because some -# `no_global_oom_handling` functions refer to non-`no_global_oom_handling` -# functions. Ideally `rustdoc` would have a way to distinguish broken links -# due to things that are "configured out" vs. entirely non-existing ones. -rustdoc-alloc: private rustc_target_flags = $(alloc-cfgs) \ - -Arustdoc::broken_intra_doc_links -rustdoc-alloc: $(RUST_LIB_SRC)/alloc/src/lib.rs rustdoc-core rustdoc-compiler_builtins FORCE - +$(call if_changed,rustdoc) - -rustdoc-kernel: private rustc_target_flags = --extern alloc \ +rustdoc-kernel: private rustc_target_flags = \ --extern build_error --extern macros=$(objtree)/$(obj)/libmacros.so \ --extern bindings --extern uapi rustdoc-kernel: $(src)/kernel/lib.rs rustdoc-core rustdoc-macros \ - rustdoc-compiler_builtins rustdoc-alloc $(obj)/libmacros.so \ + rustdoc-compiler_builtins $(obj)/libmacros.so \ $(obj)/bindings.o FORCE +$(call if_changed,rustdoc)
@@ -165,7 +151,7 @@ quiet_cmd_rustdoc_test_kernel = RUSTDOC TK $< mkdir -p $(objtree)/$(obj)/test/doctests/kernel; \ OBJTREE=$(abspath $(objtree)) \ $(RUSTDOC) --test $(rust_flags) \ - -L$(objtree)/$(obj) --extern alloc --extern kernel \ + -L$(objtree)/$(obj) --extern kernel \ --extern build_error --extern macros \ --extern bindings --extern uapi \ --no-run --crate-name kernel -Zunstable-options \
@@ -201,7 +187,7 @@ rusttest-macros: $(src)/macros/lib.rs FORCE +$(call if_changed,rustc_test) +$(call if_changed,rustdoc_test) -rusttest-kernel: private rustc_target_flags = --extern alloc \ +rusttest-kernel: private rustc_target_flags = \ --extern build_error --extern macros --extern bindings --extern uapi rusttest-kernel: $(src)/kernel/lib.rs \ rusttestlib-build_error rusttestlib-macros rusttestlib-bindings \
@@ -328,9 +314,6 @@ quiet_cmd_exports = EXPORTS $@ $(obj)/exports_core_generated.h: $(obj)/core.o FORCE $(call if_changed,exports) -$(obj)/exports_alloc_generated.h: $(obj)/alloc.o FORCE - $(call if_changed,exports) - # Even though Rust kernel modules should never use the bindings directly, # symbols from the `bindings` crate and the C helpers need to be exported # because Rust generics and inlined functions may not get their code generated
@@ -377,7 +360,7 @@ quiet_cmd_rustc_library = $(if $(skip_clippy),RUSTC,$(RUSTC_OR_CLIPPY_QUIET)) L rust-analyzer: $(Q)$(srctree)/scripts/generate_rust_analyzer.py \ - --cfgs='core=$(core-cfgs)' --cfgs='alloc=$(alloc-cfgs)' \ + --cfgs='core=$(core-cfgs)' \ $(realpath $(srctree)) $(realpath $(objtree)) \ $(rustc_sysroot) $(RUST_LIB_SRC) $(KBUILD_EXTMOD) > \ $(if $(KBUILD_EXTMOD),$(extmod_prefix),$(objtree))/rust-project.json
@@ -415,12 +398,6 @@ $(obj)/compiler_builtins.o: private rustc_objcopy = -w -W '__*' $(obj)/compiler_builtins.o: $(src)/compiler_builtins.rs $(obj)/core.o FORCE +$(call if_changed_rule,rustc_library) -$(obj)/alloc.o: private skip_clippy = 1 -$(obj)/alloc.o: private skip_flags = -Wunreachable_pub -$(obj)/alloc.o: private rustc_target_flags = $(alloc-cfgs) -$(obj)/alloc.o: $(RUST_LIB_SRC)/alloc/src/lib.rs $(obj)/compiler_builtins.o FORCE - +$(call if_changed_rule,rustc_library) - $(obj)/build_error.o: $(src)/build_error.rs $(obj)/compiler_builtins.o FORCE +$(call if_changed_rule,rustc_library)
@@ -435,9 +412,9 @@ $(obj)/uapi.o: $(src)/uapi/lib.rs \ $(obj)/uapi/uapi_generated.rs FORCE +$(call if_changed_rule,rustc_library) -$(obj)/kernel.o: private rustc_target_flags = --extern alloc \ +$(obj)/kernel.o: private rustc_target_flags = \ --extern build_error --extern macros --extern bindings --extern uapi -$(obj)/kernel.o: $(src)/kernel/lib.rs $(obj)/alloc.o $(obj)/build_error.o \ +$(obj)/kernel.o: $(src)/kernel/lib.rs $(obj)/build_error.o \ $(obj)/libmacros.so $(obj)/bindings.o $(obj)/uapi.o FORCE +$(call if_changed_rule,rustc_library)
rust/exports.c +0 -1
@@ -16,7 +16,6 @@#define EXPORT_SYMBOL_RUST_GPL (sym) extern int sym; EXPORT_SYMBOL_GPL(sym)#include "exports_core_generated.h" -#include "exports_alloc_generated.h" #include "exports_helpers_generated.h" #include "exports_bindings_generated.h" #include "exports_kernel_generated.h"
rust/kernel/alloc/allocator.rs +2 -63
86 lines not on this page · raw message
scripts/Makefile.build +2 -2
@@ -248,7 +248,7 @@ $(obj)/%.lst: $(obj)/%.c FORCE # Compile Rust sources (.rs) # --------------------------------------------------------------------------- -rust_allowed_features := arbitrary_self_types,lint_reasons,new_uninit +rust_allowed_features := arbitrary_self_types,lint_reasons # `--out-dir` is required to avoid temporaries being created by `rustc` in the # current working directory, which may be not accessible in the out-of-tree
@@ -258,7 +258,7 @@ rust_common_cmd = \ -Zallow-features=$(rust_allowed_features) \ -Zcrate-attr=no_std \ -Zcrate-attr='feature($(rust_allowed_features))' \ - -Zunstable-options --extern force:alloc --extern kernel \ + -Zunstable-options --extern kernel \ --crate-type rlib -L $(objtree)/rust/ \ --crate-name $(basename $(notdir $@)) \ --sysroot=/dev/null \
scripts/generate_rust_analyzer.py +2 -9
@@ -64,13 +64,6 @@ def generate_crates(srctree, objtree, sysroot_src, external_src, cfgs): [], ) - append_crate( - "alloc", - sysroot_src / "alloc" / "src" / "lib.rs", - ["core", "compiler_builtins"], - cfg=crates_cfgs.get("alloc", []), - ) - append_crate( "macros", srctree / "rust" / "macros" / "lib.rs",
@@ -96,7 +89,7 @@ def generate_crates(srctree, objtree, sysroot_src, external_src, cfgs): append_crate( "kernel", srctree / "rust" / "kernel" / "lib.rs", - ["core", "alloc", "macros", "build_error", "bindings"], + ["core", "macros", "build_error", "bindings"], cfg=cfg, ) crates[-1]["source"] = {
@@ -133,7 +126,7 @@ def generate_crates(srctree, objtree, sysroot_src, external_src, cfgs): append_crate( name, path, - ["core", "alloc", "kernel"], + ["core", "kernel"], cfg=cfg, )
Signature · 1 line
2.48.1
Patch "kbuild: rust: remove the `alloc` crate and `GlobalAlloc`" has been added to the 6.12-stable tree
This is a note to let you know that I've just added the patch titled
kbuild: rust: remove the alloc crate and GlobalAlloc
to the 6.12-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
kbuild-rust-remove-the-alloc-crate-and-globalalloc.patch
and it can be found in the queue-6.12 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
From [email protected] Fri Mar 7 23:52:59 2025
From: Miguel Ojeda <[email protected]>
Date: Fri, 7 Mar 2025 23:49:54 +0100
Subject: kbuild: rust: remove the alloc crate and GlobalAlloc
To: Greg Kroah-Hartman <[email protected]>, Sasha Levin <[email protected]>, [email protected]
Cc: Danilo Krummrich <[email protected]>, Alice Ryhl <[email protected]>, Alyssa Ross <[email protected]>, NoisyCoil <[email protected]>, [email protected], Miguel Ojeda <[email protected]>
Message-ID: <[email protected]>
From: Danilo Krummrich <[email protected]>
commit 392e34b6bc22077ef63abf62387ea3e9f39418c1 upstream.
Now that we have our own Allocator, Box and Vec types we can remove Rust's alloc crate and the new_uninit unstable feature.
Also remove Kmalloc's GlobalAlloc implementation -- we can't remove this in a separate patch, since the alloc crate requires a #[global_allocator] to set, that implements GlobalAlloc.
--- rust/Makefile | 43 +++++-------------------- rust/exports.c | 1 rust/kernel/alloc/allocator.rs | 65 +------------------------------------- scripts/Makefile.build | 4 +- scripts/generate_rust_analyzer.py | 11 +----- 5 files changed, 16 insertions(+), 108 deletions(-)
rust/Makefile +10 -33
@@ -15,8 +15,8 @@ always-$(CONFIG_RUST) += libmacros.so no-clean-files += libmacros.so always-$(CONFIG_RUST) += bindings/bindings_generated.rs bindings/bindings_helpers_generated.rs -obj-$(CONFIG_RUST) += alloc.o bindings.o kernel.o -always-$(CONFIG_RUST) += exports_alloc_generated.h exports_helpers_generated.h \ +obj-$(CONFIG_RUST) += bindings.o kernel.o +always-$(CONFIG_RUST) += exports_helpers_generated.h \ exports_bindings_generated.h exports_kernel_generated.h always-$(CONFIG_RUST) += uapi/uapi_generated.rs
@@ -53,11 +53,6 @@ endif core-cfgs = \ --cfg no_fp_fmt_parse -alloc-cfgs = \ - --cfg no_global_oom_handling \ - --cfg no_rc \ - --cfg no_sync - quiet_cmd_rustdoc = RUSTDOC $(if $(rustdoc_host),H, ) $< cmd_rustdoc = \ OBJTREE=$(abspath $(objtree)) \
@@ -81,7 +76,7 @@ quiet_cmd_rustdoc = RUSTDOC $(if $(rustd # command-like flags to solve the issue. Meanwhile, we use the non-custom case # and then retouch the generated files. rustdoc: rustdoc-core rustdoc-macros rustdoc-compiler_builtins \ - rustdoc-alloc rustdoc-kernel + rustdoc-kernel $(Q)cp $(srctree)/Documentation/images/logo.svg $(rustdoc_output)/static.files/ $(Q)cp $(srctree)/Documentation/images/COPYING-logo $(rustdoc_output)/static.files/ $(Q)find $(rustdoc_output) -name '*.html' -type f -print0 | xargs -0 sed -Ei \
@@ -108,20 +103,11 @@ rustdoc-core: $(RUST_LIB_SRC)/core/src/l rustdoc-compiler_builtins: $(src)/compiler_builtins.rs rustdoc-core FORCE +$(call if_changed,rustdoc) -# We need to allow `rustdoc::broken_intra_doc_links` because some -# `no_global_oom_handling` functions refer to non-`no_global_oom_handling` -# functions. Ideally `rustdoc` would have a way to distinguish broken links -# due to things that are "configured out" vs. entirely non-existing ones. -rustdoc-alloc: private rustc_target_flags = $(alloc-cfgs) \ - -Arustdoc::broken_intra_doc_links -rustdoc-alloc: $(RUST_LIB_SRC)/alloc/src/lib.rs rustdoc-core rustdoc-compiler_builtins FORCE - +$(call if_changed,rustdoc) - -rustdoc-kernel: private rustc_target_flags = --extern alloc \ +rustdoc-kernel: private rustc_target_flags = \ --extern build_error --extern macros=$(objtree)/$(obj)/libmacros.so \ --extern bindings --extern uapi rustdoc-kernel: $(src)/kernel/lib.rs rustdoc-core rustdoc-macros \ - rustdoc-compiler_builtins rustdoc-alloc $(obj)/libmacros.so \ + rustdoc-compiler_builtins $(obj)/libmacros.so \ $(obj)/bindings.o FORCE +$(call if_changed,rustdoc)
@@ -165,7 +151,7 @@ quiet_cmd_rustdoc_test_kernel = RUSTDOC mkdir -p $(objtree)/$(obj)/test/doctests/kernel; \ OBJTREE=$(abspath $(objtree)) \ $(RUSTDOC) --test $(rust_flags) \ - -L$(objtree)/$(obj) --extern alloc --extern kernel \ + -L$(objtree)/$(obj) --extern kernel \ --extern build_error --extern macros \ --extern bindings --extern uapi \ --no-run --crate-name kernel -Zunstable-options \
@@ -201,7 +187,7 @@ rusttest-macros: $(src)/macros/lib.rs FO +$(call if_changed,rustc_test) +$(call if_changed,rustdoc_test) -rusttest-kernel: private rustc_target_flags = --extern alloc \ +rusttest-kernel: private rustc_target_flags = \ --extern build_error --extern macros --extern bindings --extern uapi rusttest-kernel: $(src)/kernel/lib.rs \ rusttestlib-build_error rusttestlib-macros rusttestlib-bindings \
@@ -328,9 +314,6 @@ quiet_cmd_exports = EXPORTS $@ $(obj)/exports_core_generated.h: $(obj)/core.o FORCE $(call if_changed,exports) -$(obj)/exports_alloc_generated.h: $(obj)/alloc.o FORCE - $(call if_changed,exports) - # Even though Rust kernel modules should never use the bindings directly, # symbols from the `bindings` crate and the C helpers need to be exported # because Rust generics and inlined functions may not get their code generated
@@ -377,7 +360,7 @@ quiet_cmd_rustc_library = $(if $(skip_cl rust-analyzer: $(Q)$(srctree)/scripts/generate_rust_analyzer.py \ - --cfgs='core=$(core-cfgs)' --cfgs='alloc=$(alloc-cfgs)' \ + --cfgs='core=$(core-cfgs)' \ $(realpath $(srctree)) $(realpath $(objtree)) \ $(rustc_sysroot) $(RUST_LIB_SRC) $(KBUILD_EXTMOD) > \ $(if $(KBUILD_EXTMOD),$(extmod_prefix),$(objtree))/rust-project.json
@@ -415,12 +398,6 @@ $(obj)/compiler_builtins.o: private rust $(obj)/compiler_builtins.o: $(src)/compiler_builtins.rs $(obj)/core.o FORCE +$(call if_changed_rule,rustc_library) -$(obj)/alloc.o: private skip_clippy = 1 -$(obj)/alloc.o: private skip_flags = -Wunreachable_pub -$(obj)/alloc.o: private rustc_target_flags = $(alloc-cfgs) -$(obj)/alloc.o: $(RUST_LIB_SRC)/alloc/src/lib.rs $(obj)/compiler_builtins.o FORCE - +$(call if_changed_rule,rustc_library) - $(obj)/build_error.o: $(src)/build_error.rs $(obj)/compiler_builtins.o FORCE +$(call if_changed_rule,rustc_library)
@@ -435,9 +412,9 @@ $(obj)/uapi.o: $(src)/uapi/lib.rs \ $(obj)/uapi/uapi_generated.rs FORCE +$(call if_changed_rule,rustc_library) -$(obj)/kernel.o: private rustc_target_flags = --extern alloc \ +$(obj)/kernel.o: private rustc_target_flags = \ --extern build_error --extern macros --extern bindings --extern uapi -$(obj)/kernel.o: $(src)/kernel/lib.rs $(obj)/alloc.o $(obj)/build_error.o \ +$(obj)/kernel.o: $(src)/kernel/lib.rs $(obj)/build_error.o \ $(obj)/libmacros.so $(obj)/bindings.o $(obj)/uapi.o FORCE +$(call if_changed_rule,rustc_library)
rust/exports.c +0 -1
@@ -16,7 +16,6 @@#define EXPORT_SYMBOL_RUST_GPL (sym) extern int sym; EXPORT_SYMBOL_GPL(sym)#include "exports_core_generated.h" -#include "exports_alloc_generated.h" #include "exports_helpers_generated.h" #include "exports_bindings_generated.h" #include "exports_kernel_generated.h"
rust/kernel/alloc/allocator.rs +2 -63
86 lines not on this page · raw message
scripts/Makefile.build +2 -2
@@ -248,7 +248,7 @@ $(obj)/%.lst: $(obj)/%.c FORCE # Compile Rust sources (.rs) # --------------------------------------------------------------------------- -rust_allowed_features := arbitrary_self_types,lint_reasons,new_uninit +rust_allowed_features := arbitrary_self_types,lint_reasons # `--out-dir` is required to avoid temporaries being created by `rustc` in the # current working directory, which may be not accessible in the out-of-tree
@@ -258,7 +258,7 @@ rust_common_cmd = \ -Zallow-features=$(rust_allowed_features) \ -Zcrate-attr=no_std \ -Zcrate-attr='feature($(rust_allowed_features))' \ - -Zunstable-options --extern force:alloc --extern kernel \ + -Zunstable-options --extern kernel \ --crate-type rlib -L $(objtree)/rust/ \ --crate-name $(basename $(notdir $@)) \ --sysroot=/dev/null \
scripts/generate_rust_analyzer.py +2 -9
@@ -65,13 +65,6 @@ def generate_crates(srctree, objtree, sy ) append_crate( - "alloc", - sysroot_src / "alloc" / "src" / "lib.rs", - ["core", "compiler_builtins"], - cfg=crates_cfgs.get("alloc", []), - ) - - append_crate( "macros", srctree / "rust" / "macros" / "lib.rs", [],
@@ -96,7 +89,7 @@ def generate_crates(srctree, objtree, sy append_crate( "kernel", srctree / "rust" / "kernel" / "lib.rs", - ["core", "alloc", "macros", "build_error", "bindings"], + ["core", "macros", "build_error", "bindings"], cfg=cfg, ) crates[-1]["source"] = {
@@ -133,7 +126,7 @@ def generate_crates(srctree, objtree, sy append_crate( name, path, - ["core", "alloc", "kernel"], + ["core", "kernel"], cfg=cfg, )
Patches currently in stable-queue which might be from [email protected] are
queue-6.12/drm-panic-avoid-reimplementing-iterator-find.patch queue-6.12/documentation-rust-add-coding-guidelines-on-lints.patch queue-6.12/rust-provide-proper-code-documentation-titles.patch queue-6.12/rust-alloc-make-allocator-module-public.patch queue-6.12/rust-alloc-remove-vecext-extension.patch queue-6.12/rust-alloc-implement-reallocfunc.patch queue-6.12/rust-alloc-separate-aligned_size-from-krealloc_aligned.patch queue-6.12/rust-enable-clippy-unnecessary_safety_comment-lint.patch queue-6.12/rust-alloc-update-module-comment-of-alloc.rs.patch queue-6.12/rust-kbuild-expand-rusttest-target-for-macros.patch queue-6.12/rust-error-use-core-alloc-layouterror.patch queue-6.12/rust-str-test-replace-alloc-format.patch queue-6.12/loongarch-use-asm_reachable.patch queue-6.12/rust-alloc-implement-allocator-for-kmalloc.patch queue-6.12/rust-alloc-implement-collect-for-intoiter.patch queue-6.12/rust-alloc-introduce-arraylayout.patch queue-6.12/rust-alloc-implement-vmalloc-allocator.patch queue-6.12/documentation-rust-discuss-in-the-guidelines.patch queue-6.12/rust-error-check-for-config-test-in-error-name.patch queue-6.12/rust-enable-clippy-ignored_unit_patterns-lint.patch queue-6.12/rust-enable-clippy-unnecessary_safety_doc-lint.patch queue-6.12/rust-alloc-add-box-to-prelude.patch queue-6.12/kbuild-rust-remove-the-alloc-crate-and-globalalloc.patch queue-6.12/rust-alloc-add-allocator-trait.patch queue-6.12/rust-treewide-switch-to-our-kernel-box-type.patch queue-6.12/rust-introduce-.clippy.toml.patch queue-6.12/rust-alloc-rename-kernelallocator-to-kmalloc.patch queue-6.12/rust-alloc-implement-cmalloc-in-module-allocator_test.patch queue-6.12/drm-panic-allow-verbose-version-check.patch queue-6.12/rust-map-__kernel_size_t-and-friends-also-to-usize-isize.patch queue-6.12/rust-alloc-add-module-allocator_test.patch queue-6.12/rust-replace-clippy-dbg_macro-with-disallowed_macros.patch queue-6.12/rust-alloc-add-__gfp_nowarn-to-flags.patch queue-6.12/rust-enable-clippy-s-check-private-items.patch queue-6.12/rust-error-make-conversion-functions-public.patch queue-6.12/rust-sort-global-rust-flags.patch queue-6.12/rust-alloc-implement-contains-for-flags.patch queue-6.12/rust-init-remove-unneeded.patch queue-6.12/rust-use-custom-ffi-integer-types.patch queue-6.12/rust-sync-remove-unneeded.patch queue-6.12/rust-treewide-switch-to-the-kernel-vec-type.patch queue-6.12/rust-alloc-implement-kvmalloc-allocator.patch queue-6.12/drm-panic-correctly-indent-continuation-of-line-in-list-item.patch queue-6.12/rust-alloc-implement-kernel-vec-type.patch queue-6.12/rust-workqueue-remove-unneeded.patch queue-6.12/rust-error-optimize-error-type-to-use-nonzero.patch queue-6.12/drm-panic-remove-unnecessary-borrow-in-alignment_pattern.patch queue-6.12/rust-alloc-remove-extension-of-std-s-box.patch queue-6.12/rust-block-fix-formatting-in-gendisk-doc.patch queue-6.12/rust-enable-rustdoc-unescaped_backticks-lint.patch queue-6.12/rust-fix-size_t-in-bindgen-prototypes-of-c-builtins.patch queue-6.12/rust-enable-clippy-undocumented_unsafe_blocks-lint.patch queue-6.12/rust-alloc-add-vec-to-prelude.patch queue-6.12/rust-alloc-implement-intoiterator-for-vec.patch queue-6.12/rust-alloc-implement-kernel-box.patch queue-6.12/drm-panic-remove-redundant-field-when-assigning-value.patch queue-6.12/rust-types-avoid-repetition-in-as-from-bytes-impls.patch queue-6.12/rust-start-using-the-attribute.patch queue-6.12/drm-panic-allow-verbose-boolean-for-clarity.patch queue-6.12/maintainers-add-entry-for-the-rust-alloc-module.patch queue-6.12/rust-alloc-fix-arraylayout-allocations.patch queue-6.12/drm-panic-prefer-eliding-lifetimes.patch
Miguel Ojeda
maintainerPATCH 48/60 MAINTAINERS: add entry for the Rust `alloc` module
In reply to Miguel OjedaFrom: Danilo Krummrich <[email protected]>
commit 6ce162a002657910104c7a07fb50017681bc476c upstream.
Add maintainers entry for the Rust alloc module.
Currently, this includes the Allocator API itself, Allocator implementations, such as Kmalloc or Vmalloc, as well as the kernel's implementation of the primary memory allocation data structures, Box and Vec.
--- MAINTAINERS | 7 +++++++ 1 file changed, 7 insertions(+)
MAINTAINERS +7 -0
@@ -20183,6 +20183,13 @@ F: scripts/*rust* F: tools/testing/selftests/rust/ K: \b(?i:rust)\b +RUST [ALLOC] +M: Danilo Krummrich <[email protected]> +L: [email protected] +S: Maintained +F: rust/kernel/alloc.rs +F: rust/kernel/alloc/ + RXRPC SOCKETS (AF_RXRPC) M: David Howells <[email protected]> M: Marc Dionne <[email protected]>
Signature · 1 line
2.48.1
Patch "MAINTAINERS: add entry for the Rust `alloc` module" has been added to the 6.12-stable tree
This is a note to let you know that I've just added the patch titled
MAINTAINERS: add entry for the Rust alloc module
to the 6.12-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
maintainers-add-entry-for-the-rust-alloc-module.patch
and it can be found in the queue-6.12 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
From [email protected] Fri Mar 7 23:52:51 2025
From: Miguel Ojeda <[email protected]>
Date: Fri, 7 Mar 2025 23:49:55 +0100
Subject: MAINTAINERS: add entry for the Rust alloc module
To: Greg Kroah-Hartman <[email protected]>, Sasha Levin <[email protected]>, [email protected]
Cc: Danilo Krummrich <[email protected]>, Alice Ryhl <[email protected]>, Alyssa Ross <[email protected]>, NoisyCoil <[email protected]>, [email protected], Miguel Ojeda <[email protected]>
Message-ID: <[email protected]>
From: Danilo Krummrich <[email protected]>
commit 6ce162a002657910104c7a07fb50017681bc476c upstream.
Add maintainers entry for the Rust alloc module.
Currently, this includes the Allocator API itself, Allocator implementations, such as Kmalloc or Vmalloc, as well as the kernel's implementation of the primary memory allocation data structures, Box and Vec.
--- MAINTAINERS | 7 +++++++ 1 file changed, 7 insertions(+)
MAINTAINERS +7 -0
@@ -20183,6 +20183,13 @@ F: scripts/*rust* F: tools/testing/selftests/rust/ K: \b(?i:rust)\b +RUST [ALLOC] +M: Danilo Krummrich <[email protected]> +L: [email protected] +S: Maintained +F: rust/kernel/alloc.rs +F: rust/kernel/alloc/ + RXRPC SOCKETS (AF_RXRPC) M: David Howells <[email protected]> M: Marc Dionne <[email protected]>
Patches currently in stable-queue which might be from [email protected] are
queue-6.12/drm-panic-avoid-reimplementing-iterator-find.patch queue-6.12/documentation-rust-add-coding-guidelines-on-lints.patch queue-6.12/rust-provide-proper-code-documentation-titles.patch queue-6.12/rust-alloc-make-allocator-module-public.patch queue-6.12/rust-alloc-remove-vecext-extension.patch queue-6.12/rust-alloc-implement-reallocfunc.patch queue-6.12/rust-alloc-separate-aligned_size-from-krealloc_aligned.patch queue-6.12/rust-enable-clippy-unnecessary_safety_comment-lint.patch queue-6.12/rust-alloc-update-module-comment-of-alloc.rs.patch queue-6.12/rust-kbuild-expand-rusttest-target-for-macros.patch queue-6.12/rust-error-use-core-alloc-layouterror.patch queue-6.12/rust-str-test-replace-alloc-format.patch queue-6.12/loongarch-use-asm_reachable.patch queue-6.12/rust-alloc-implement-allocator-for-kmalloc.patch queue-6.12/rust-alloc-implement-collect-for-intoiter.patch queue-6.12/rust-alloc-introduce-arraylayout.patch queue-6.12/rust-alloc-implement-vmalloc-allocator.patch queue-6.12/documentation-rust-discuss-in-the-guidelines.patch queue-6.12/rust-error-check-for-config-test-in-error-name.patch queue-6.12/rust-enable-clippy-ignored_unit_patterns-lint.patch queue-6.12/rust-enable-clippy-unnecessary_safety_doc-lint.patch queue-6.12/rust-alloc-add-box-to-prelude.patch queue-6.12/kbuild-rust-remove-the-alloc-crate-and-globalalloc.patch queue-6.12/rust-alloc-add-allocator-trait.patch queue-6.12/rust-treewide-switch-to-our-kernel-box-type.patch queue-6.12/rust-introduce-.clippy.toml.patch queue-6.12/rust-alloc-rename-kernelallocator-to-kmalloc.patch queue-6.12/rust-alloc-implement-cmalloc-in-module-allocator_test.patch queue-6.12/drm-panic-allow-verbose-version-check.patch queue-6.12/rust-map-__kernel_size_t-and-friends-also-to-usize-isize.patch queue-6.12/rust-alloc-add-module-allocator_test.patch queue-6.12/rust-replace-clippy-dbg_macro-with-disallowed_macros.patch queue-6.12/rust-alloc-add-__gfp_nowarn-to-flags.patch queue-6.12/rust-enable-clippy-s-check-private-items.patch queue-6.12/rust-error-make-conversion-functions-public.patch queue-6.12/rust-sort-global-rust-flags.patch queue-6.12/rust-alloc-implement-contains-for-flags.patch queue-6.12/rust-init-remove-unneeded.patch queue-6.12/rust-use-custom-ffi-integer-types.patch queue-6.12/rust-sync-remove-unneeded.patch queue-6.12/rust-treewide-switch-to-the-kernel-vec-type.patch queue-6.12/rust-alloc-implement-kvmalloc-allocator.patch queue-6.12/drm-panic-correctly-indent-continuation-of-line-in-list-item.patch queue-6.12/rust-alloc-implement-kernel-vec-type.patch queue-6.12/rust-workqueue-remove-unneeded.patch queue-6.12/rust-error-optimize-error-type-to-use-nonzero.patch queue-6.12/drm-panic-remove-unnecessary-borrow-in-alignment_pattern.patch queue-6.12/rust-alloc-remove-extension-of-std-s-box.patch queue-6.12/rust-block-fix-formatting-in-gendisk-doc.patch queue-6.12/rust-enable-rustdoc-unescaped_backticks-lint.patch queue-6.12/rust-fix-size_t-in-bindgen-prototypes-of-c-builtins.patch queue-6.12/rust-enable-clippy-undocumented_unsafe_blocks-lint.patch queue-6.12/rust-alloc-add-vec-to-prelude.patch queue-6.12/rust-alloc-implement-intoiterator-for-vec.patch queue-6.12/rust-alloc-implement-kernel-box.patch queue-6.12/drm-panic-remove-redundant-field-when-assigning-value.patch queue-6.12/rust-types-avoid-repetition-in-as-from-bytes-impls.patch queue-6.12/rust-start-using-the-attribute.patch queue-6.12/drm-panic-allow-verbose-boolean-for-clarity.patch queue-6.12/maintainers-add-entry-for-the-rust-alloc-module.patch queue-6.12/rust-alloc-fix-arraylayout-allocations.patch queue-6.12/drm-panic-prefer-eliding-lifetimes.patch
Miguel Ojeda
maintainerPATCH 49/60 drm/panic: avoid reimplementing Iterator::find
In reply to Miguel OjedaFrom: Thomas Böhler <[email protected]>
commit c408dd81678bb0a957eae96962c913c242e069f7 upstream.
Rust's standard library's std::iter::Iterator trait provides a function find that finds the first element that satisfies a predicate. The function Version::from_segments is doing the same thing but is implementing the same logic itself.
Clippy complains about this in the manual_find lint:
error: manual implementation of `Iterator::find`
--> drivers/gpu/drm/drm_panic_qr.rs:212:9
|
212 | / for v in (1..=40).map(|k| Version(k)) {
213 | | if v.max_data() * 8 >= segments.iter().map(|s| s.total_size_bits(v)).sum() {
214 | | return Some(v);
215 | | }
216 | | }
217 | | None
| |____________^ help: replace with an iterator: `(1..=40).map(|k| Version(k)).find(|&v| v.max_data() * 8 >= segments.iter().map(|s| s.total_size_bits(v)).sum())`
|
= help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#manual_find
= note: `-D clippy::manual-find` implied by `-D warnings`
= help: to override `-D warnings` add `#[allow(clippy::manual_find)]`Use Iterator::find instead to make the intention clearer.
At the same time, clean up the redundant closure that Clippy warns about too:
error: redundant closure
--> drivers/gpu/drm/drm_panic_qr.rs:212:31
|
212 | for v in (1..=40).map(|k| Version(k)) {
| ^^^^^^^^^^^^^^ help: replace the closure with the function itself: Version
|
= help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_closure
= note: -D clippy::redundant-closure implied by -D warnings
= help: to override -D warnings add #[allow(clippy::redundant_closure)]
--- drivers/gpu/drm/drm_panic_qr.rs | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-)
drivers/gpu/drm/drm_panic_qr.rs +3 -6
@@ -209,12 +209,9 @@impl Version {/// Returns the smallest QR version than can hold these segments. fn from_segments (segments: &[&Segment <'_>]) ->Option <Version > { -for vin (1 ..=40 ).map (|k|Version (k)) { -if v.max_data () *8 >= segments.iter ().map (|s| s.total_size_bits (v)).sum () { -return Some (v); - } - } -None + (1 ..=40 ) + .map (Version ) + .find (|&v| v.max_data () *8 >= segments.iter ().map (|s| s.total_size_bits (v)).sum ()) }fn width (&self) ->u8 {
Signature · 1 line
2.48.1
Patch "drm/panic: avoid reimplementing Iterator::find" has been added to the 6.12-stable tree
This is a note to let you know that I've just added the patch titled
drm/panic: avoid reimplementing Iterator::find
to the 6.12-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
drm-panic-avoid-reimplementing-iterator-find.patch
and it can be found in the queue-6.12 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
From [email protected] Fri Mar 7 23:52:51 2025
From: Miguel Ojeda <[email protected]>
Date: Fri, 7 Mar 2025 23:49:56 +0100
Subject: drm/panic: avoid reimplementing Iterator::find
To: Greg Kroah-Hartman <[email protected]>, Sasha Levin <[email protected]>, [email protected]
Cc: Danilo Krummrich <[email protected]>, Alice Ryhl <[email protected]>, Alyssa Ross <[email protected]>, NoisyCoil <[email protected]>, [email protected], Miguel Ojeda <[email protected]>
Message-ID: <[email protected]>
From: Thomas Böhler <[email protected]>
commit c408dd81678bb0a957eae96962c913c242e069f7 upstream.
Rust's standard library's std::iter::Iterator trait provides a function find that finds the first element that satisfies a predicate. The function Version::from_segments is doing the same thing but is implementing the same logic itself.
Clippy complains about this in the manual_find lint:
error: manual implementation of `Iterator::find`
--> drivers/gpu/drm/drm_panic_qr.rs:212:9
|
212 | / for v in (1..=40).map(|k| Version(k)) {
213 | | if v.max_data() * 8 >= segments.iter().map(|s| s.total_size_bits(v)).sum() {
214 | | return Some(v);
215 | | }
216 | | }
217 | | None
| |____________^ help: replace with an iterator: `(1..=40).map(|k| Version(k)).find(|&v| v.max_data() * 8 >= segments.iter().map(|s| s.total_size_bits(v)).sum())`
|
= help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#manual_find
= note: `-D clippy::manual-find` implied by `-D warnings`
= help: to override `-D warnings` add `#[allow(clippy::manual_find)]`Use Iterator::find instead to make the intention clearer.
At the same time, clean up the redundant closure that Clippy warns about too:
error: redundant closure
--> drivers/gpu/drm/drm_panic_qr.rs:212:31
|
212 | for v in (1..=40).map(|k| Version(k)) {
| ^^^^^^^^^^^^^^ help: replace the closure with the function itself: Version
|
= help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_closure
= note: -D clippy::redundant-closure implied by -D warnings
= help: to override -D warnings add #[allow(clippy::redundant_closure)]
--- drivers/gpu/drm/drm_panic_qr.rs | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-)
drivers/gpu/drm/drm_panic_qr.rs +3 -6
@@ -209,12 +209,9 @@ const FORMAT_INFOS_QR_L: [u16; 8] = [impl Version {/// Returns the smallest QR version than can hold these segments. fn from_segments (segments: &[&Segment <'_>]) ->Option <Version > { -for vin (1 ..=40 ).map (|k|Version (k)) { -if v.max_data () *8 >= segments.iter ().map (|s| s.total_size_bits (v)).sum () { -return Some (v); - } - } -None + (1 ..=40 ) + .map (Version ) + .find (|&v| v.max_data () *8 >= segments.iter ().map (|s| s.total_size_bits (v)).sum ()) }fn width (&self) ->u8 {
Patches currently in stable-queue which might be from [email protected] are
queue-6.12/drm-panic-avoid-reimplementing-iterator-find.patch queue-6.12/documentation-rust-add-coding-guidelines-on-lints.patch queue-6.12/rust-provide-proper-code-documentation-titles.patch queue-6.12/rust-alloc-make-allocator-module-public.patch queue-6.12/rust-alloc-remove-vecext-extension.patch queue-6.12/rust-alloc-implement-reallocfunc.patch queue-6.12/rust-alloc-separate-aligned_size-from-krealloc_aligned.patch queue-6.12/rust-enable-clippy-unnecessary_safety_comment-lint.patch queue-6.12/rust-alloc-update-module-comment-of-alloc.rs.patch queue-6.12/rust-kbuild-expand-rusttest-target-for-macros.patch queue-6.12/rust-error-use-core-alloc-layouterror.patch queue-6.12/rust-str-test-replace-alloc-format.patch queue-6.12/loongarch-use-asm_reachable.patch queue-6.12/rust-alloc-implement-allocator-for-kmalloc.patch queue-6.12/rust-alloc-implement-collect-for-intoiter.patch queue-6.12/rust-alloc-introduce-arraylayout.patch queue-6.12/rust-alloc-implement-vmalloc-allocator.patch queue-6.12/documentation-rust-discuss-in-the-guidelines.patch queue-6.12/rust-error-check-for-config-test-in-error-name.patch queue-6.12/rust-enable-clippy-ignored_unit_patterns-lint.patch queue-6.12/rust-enable-clippy-unnecessary_safety_doc-lint.patch queue-6.12/rust-alloc-add-box-to-prelude.patch queue-6.12/kbuild-rust-remove-the-alloc-crate-and-globalalloc.patch queue-6.12/rust-alloc-add-allocator-trait.patch queue-6.12/rust-treewide-switch-to-our-kernel-box-type.patch queue-6.12/rust-introduce-.clippy.toml.patch queue-6.12/rust-alloc-rename-kernelallocator-to-kmalloc.patch queue-6.12/rust-alloc-implement-cmalloc-in-module-allocator_test.patch queue-6.12/drm-panic-allow-verbose-version-check.patch queue-6.12/rust-map-__kernel_size_t-and-friends-also-to-usize-isize.patch queue-6.12/rust-alloc-add-module-allocator_test.patch queue-6.12/rust-replace-clippy-dbg_macro-with-disallowed_macros.patch queue-6.12/rust-alloc-add-__gfp_nowarn-to-flags.patch queue-6.12/rust-enable-clippy-s-check-private-items.patch queue-6.12/rust-error-make-conversion-functions-public.patch queue-6.12/rust-sort-global-rust-flags.patch queue-6.12/rust-alloc-implement-contains-for-flags.patch queue-6.12/rust-init-remove-unneeded.patch queue-6.12/rust-use-custom-ffi-integer-types.patch queue-6.12/rust-sync-remove-unneeded.patch queue-6.12/rust-treewide-switch-to-the-kernel-vec-type.patch queue-6.12/rust-alloc-implement-kvmalloc-allocator.patch queue-6.12/drm-panic-correctly-indent-continuation-of-line-in-list-item.patch queue-6.12/rust-alloc-implement-kernel-vec-type.patch queue-6.12/rust-workqueue-remove-unneeded.patch queue-6.12/rust-error-optimize-error-type-to-use-nonzero.patch queue-6.12/drm-panic-remove-unnecessary-borrow-in-alignment_pattern.patch queue-6.12/rust-alloc-remove-extension-of-std-s-box.patch queue-6.12/rust-block-fix-formatting-in-gendisk-doc.patch queue-6.12/rust-enable-rustdoc-unescaped_backticks-lint.patch queue-6.12/rust-fix-size_t-in-bindgen-prototypes-of-c-builtins.patch queue-6.12/rust-enable-clippy-undocumented_unsafe_blocks-lint.patch queue-6.12/rust-alloc-add-vec-to-prelude.patch queue-6.12/rust-alloc-implement-intoiterator-for-vec.patch queue-6.12/rust-alloc-implement-kernel-box.patch queue-6.12/drm-panic-remove-redundant-field-when-assigning-value.patch queue-6.12/rust-types-avoid-repetition-in-as-from-bytes-impls.patch queue-6.12/rust-start-using-the-attribute.patch queue-6.12/drm-panic-allow-verbose-boolean-for-clarity.patch queue-6.12/maintainers-add-entry-for-the-rust-alloc-module.patch queue-6.12/rust-alloc-fix-arraylayout-allocations.patch queue-6.12/drm-panic-prefer-eliding-lifetimes.patch
Miguel Ojeda
maintainerPATCH 50/60 drm/panic: remove unnecessary borrow in alignment_pattern
In reply to Miguel OjedaFrom: Thomas Böhler <[email protected]>
commit 7b6de57e0b2d1e62becfa3aac063c4c58d2c2c42 upstream.
The function alignment_pattern returns a static reference to a u8 slice. The borrow of the returned element in ALIGNMENT_PATTERNS is already a reference as defined in the array definition above so this borrow is unnecessary and removed by the compiler. Clippy notes this in needless_borrow:
error: this expression creates a reference which is immediately dereferenced by the compiler
--> drivers/gpu/drm/drm_panic_qr.rs:245:9
|
245 | &ALIGNMENT_PATTERNS[self.0 - 1]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: change this to: `ALIGNMENT_PATTERNS[self.0 - 1]`
|
= help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_borrow
= note: `-D clippy::needless-borrow` implied by `-D warnings`
= help: to override `-D warnings` add `#[allow(clippy::needless_borrow)]`Remove the unnecessary borrow.
--- drivers/gpu/drm/drm_panic_qr.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/drm_panic_qr.rs +1 -1
@@ -239,7 +239,7 @@ fn g1_blk_size(&self) -> usize { }fn alignment_pattern (&self) -> &'static [u8 ] { - &ALIGNMENT_PATTERNS [self.0 -1 ] +ALIGNMENT_PATTERNS [self.0 -1 ] }fn poly (&self) -> &'static [u8 ] {
Signature · 1 line
2.48.1
Patch "drm/panic: remove unnecessary borrow in alignment_pattern" has been added to the 6.12-stable tree
This is a note to let you know that I've just added the patch titled
drm/panic: remove unnecessary borrow in alignment_pattern
to the 6.12-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
drm-panic-remove-unnecessary-borrow-in-alignment_pattern.patch
and it can be found in the queue-6.12 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
From [email protected] Fri Mar 7 23:53:05 2025
From: Miguel Ojeda <[email protected]>
Date: Fri, 7 Mar 2025 23:49:57 +0100
Subject: drm/panic: remove unnecessary borrow in alignment_pattern
To: Greg Kroah-Hartman <[email protected]>, Sasha Levin <[email protected]>, [email protected]
Cc: Danilo Krummrich <[email protected]>, Alice Ryhl <[email protected]>, Alyssa Ross <[email protected]>, NoisyCoil <[email protected]>, [email protected], Miguel Ojeda <[email protected]>
Message-ID: <[email protected]>
From: Thomas Böhler <[email protected]>
commit 7b6de57e0b2d1e62becfa3aac063c4c58d2c2c42 upstream.
The function alignment_pattern returns a static reference to a u8 slice. The borrow of the returned element in ALIGNMENT_PATTERNS is already a reference as defined in the array definition above so this borrow is unnecessary and removed by the compiler. Clippy notes this in needless_borrow:
error: this expression creates a reference which is immediately dereferenced by the compiler
--> drivers/gpu/drm/drm_panic_qr.rs:245:9
|
245 | &ALIGNMENT_PATTERNS[self.0 - 1]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: change this to: `ALIGNMENT_PATTERNS[self.0 - 1]`
|
= help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_borrow
= note: `-D clippy::needless-borrow` implied by `-D warnings`
= help: to override `-D warnings` add `#[allow(clippy::needless_borrow)]`Remove the unnecessary borrow.
--- drivers/gpu/drm/drm_panic_qr.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/drm_panic_qr.rs +1 -1
@@ -239,7 +239,7 @@ impl Version { }fn alignment_pattern (&self) -> &'static [u8 ] { - &ALIGNMENT_PATTERNS [self.0 -1 ] +ALIGNMENT_PATTERNS [self.0 -1 ] }fn poly (&self) -> &'static [u8 ] {
Patches currently in stable-queue which might be from [email protected] are
queue-6.12/drm-panic-avoid-reimplementing-iterator-find.patch queue-6.12/documentation-rust-add-coding-guidelines-on-lints.patch queue-6.12/rust-provide-proper-code-documentation-titles.patch queue-6.12/rust-alloc-make-allocator-module-public.patch queue-6.12/rust-alloc-remove-vecext-extension.patch queue-6.12/rust-alloc-implement-reallocfunc.patch queue-6.12/rust-alloc-separate-aligned_size-from-krealloc_aligned.patch queue-6.12/rust-enable-clippy-unnecessary_safety_comment-lint.patch queue-6.12/rust-alloc-update-module-comment-of-alloc.rs.patch queue-6.12/rust-kbuild-expand-rusttest-target-for-macros.patch queue-6.12/rust-error-use-core-alloc-layouterror.patch queue-6.12/rust-str-test-replace-alloc-format.patch queue-6.12/loongarch-use-asm_reachable.patch queue-6.12/rust-alloc-implement-allocator-for-kmalloc.patch queue-6.12/rust-alloc-implement-collect-for-intoiter.patch queue-6.12/rust-alloc-introduce-arraylayout.patch queue-6.12/rust-alloc-implement-vmalloc-allocator.patch queue-6.12/documentation-rust-discuss-in-the-guidelines.patch queue-6.12/rust-error-check-for-config-test-in-error-name.patch queue-6.12/rust-enable-clippy-ignored_unit_patterns-lint.patch queue-6.12/rust-enable-clippy-unnecessary_safety_doc-lint.patch queue-6.12/rust-alloc-add-box-to-prelude.patch queue-6.12/kbuild-rust-remove-the-alloc-crate-and-globalalloc.patch queue-6.12/rust-alloc-add-allocator-trait.patch queue-6.12/rust-treewide-switch-to-our-kernel-box-type.patch queue-6.12/rust-introduce-.clippy.toml.patch queue-6.12/rust-alloc-rename-kernelallocator-to-kmalloc.patch queue-6.12/rust-alloc-implement-cmalloc-in-module-allocator_test.patch queue-6.12/drm-panic-allow-verbose-version-check.patch queue-6.12/rust-map-__kernel_size_t-and-friends-also-to-usize-isize.patch queue-6.12/rust-alloc-add-module-allocator_test.patch queue-6.12/rust-replace-clippy-dbg_macro-with-disallowed_macros.patch queue-6.12/rust-alloc-add-__gfp_nowarn-to-flags.patch queue-6.12/rust-enable-clippy-s-check-private-items.patch queue-6.12/rust-error-make-conversion-functions-public.patch queue-6.12/rust-sort-global-rust-flags.patch queue-6.12/rust-alloc-implement-contains-for-flags.patch queue-6.12/rust-init-remove-unneeded.patch queue-6.12/rust-use-custom-ffi-integer-types.patch queue-6.12/rust-sync-remove-unneeded.patch queue-6.12/rust-treewide-switch-to-the-kernel-vec-type.patch queue-6.12/rust-alloc-implement-kvmalloc-allocator.patch queue-6.12/drm-panic-correctly-indent-continuation-of-line-in-list-item.patch queue-6.12/rust-alloc-implement-kernel-vec-type.patch queue-6.12/rust-workqueue-remove-unneeded.patch queue-6.12/rust-error-optimize-error-type-to-use-nonzero.patch queue-6.12/drm-panic-remove-unnecessary-borrow-in-alignment_pattern.patch queue-6.12/rust-alloc-remove-extension-of-std-s-box.patch queue-6.12/rust-block-fix-formatting-in-gendisk-doc.patch queue-6.12/rust-enable-rustdoc-unescaped_backticks-lint.patch queue-6.12/rust-fix-size_t-in-bindgen-prototypes-of-c-builtins.patch queue-6.12/rust-enable-clippy-undocumented_unsafe_blocks-lint.patch queue-6.12/rust-alloc-add-vec-to-prelude.patch queue-6.12/rust-alloc-implement-intoiterator-for-vec.patch queue-6.12/rust-alloc-implement-kernel-box.patch queue-6.12/drm-panic-remove-redundant-field-when-assigning-value.patch queue-6.12/rust-types-avoid-repetition-in-as-from-bytes-impls.patch queue-6.12/rust-start-using-the-attribute.patch queue-6.12/drm-panic-allow-verbose-boolean-for-clarity.patch queue-6.12/maintainers-add-entry-for-the-rust-alloc-module.patch queue-6.12/rust-alloc-fix-arraylayout-allocations.patch queue-6.12/drm-panic-prefer-eliding-lifetimes.patch
Miguel Ojeda
maintainerPATCH 51/60 drm/panic: prefer eliding lifetimes
In reply to Miguel OjedaFrom: Thomas Böhler <[email protected]>
commit ae75c40117b53ae3d91dfc9d0bf06984a079f044 upstream.
Eliding lifetimes when possible instead of specifying them directly is both shorter and easier to read. Clippy notes this in the needless_lifetimes lint:
error: the following explicit lifetimes could be elided: 'b
--> drivers/gpu/drm/drm_panic_qr.rs:479:16
|
479 | fn new<'a, 'b>(segments: &[&Segment<'b>], data: &'a mut [u8]) -> Option<EncodedMsg<'a>> {
| ^^ ^^
|
= help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_lifetimes
= note: `-D clippy::needless-lifetimes` implied by `-D warnings`
= help: to override `-D warnings` add `#[allow(clippy::needless_lifetimes)]`
help: elide the lifetimes
|
479 - fn new<'a, 'b>(segments: &[&Segment<'b>], data: &'a mut [u8]) -> Option<EncodedMsg<'a>> {
479 + fn new<'a>(segments: &[&Segment<'_>], data: &'a mut [u8]) -> Option<EncodedMsg<'a>> {
|Remove the explicit lifetime annotation in favour of an elided lifetime.
--- drivers/gpu/drm/drm_panic_qr.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/drm_panic_qr.rs +1 -1
@@ -476,7 +476,7 @@ struct EncodedMsg<'a> {/// Data to be put in the QR code, with correct segment encoding, padding, and /// Error Code Correction. impl EncodedMsg <'_> { -fn new <'a, 'b>(segments: &[&Segment <'b>], data: &'amut [u8 ]) ->Option <EncodedMsg <'a>> { +fn new <'a>(segments: &[&Segment <'_>], data: &'amut [u8 ]) ->Option <EncodedMsg <'a>> {let version =Version ::from_segments (segments)?;let ec_size = version.ec_size ();let g1_blocks = version.g1_blocks ();
Signature · 1 line
2.48.1
Patch "drm/panic: prefer eliding lifetimes" has been added to the 6.12-stable tree
This is a note to let you know that I've just added the patch titled
drm/panic: prefer eliding lifetimes
to the 6.12-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
drm-panic-prefer-eliding-lifetimes.patch
and it can be found in the queue-6.12 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
From [email protected] Fri Mar 7 23:52:57 2025
From: Miguel Ojeda <[email protected]>
Date: Fri, 7 Mar 2025 23:49:58 +0100
Subject: drm/panic: prefer eliding lifetimes
To: Greg Kroah-Hartman <[email protected]>, Sasha Levin <[email protected]>, [email protected]
Cc: Danilo Krummrich <[email protected]>, Alice Ryhl <[email protected]>, Alyssa Ross <[email protected]>, NoisyCoil <[email protected]>, [email protected], Miguel Ojeda <[email protected]>
Message-ID: <[email protected]>
From: Thomas Böhler <[email protected]>
commit ae75c40117b53ae3d91dfc9d0bf06984a079f044 upstream.
Eliding lifetimes when possible instead of specifying them directly is both shorter and easier to read. Clippy notes this in the needless_lifetimes lint:
error: the following explicit lifetimes could be elided: 'b
--> drivers/gpu/drm/drm_panic_qr.rs:479:16
|
479 | fn new<'a, 'b>(segments: &[&Segment<'b>], data: &'a mut [u8]) -> Option<EncodedMsg<'a>> {
| ^^ ^^
|
= help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_lifetimes
= note: `-D clippy::needless-lifetimes` implied by `-D warnings`
= help: to override `-D warnings` add `#[allow(clippy::needless_lifetimes)]`
help: elide the lifetimes
|
479 - fn new<'a, 'b>(segments: &[&Segment<'b>], data: &'a mut [u8]) -> Option<EncodedMsg<'a>> {
479 + fn new<'a>(segments: &[&Segment<'_>], data: &'a mut [u8]) -> Option<EncodedMsg<'a>> {
|Remove the explicit lifetime annotation in favour of an elided lifetime.
--- drivers/gpu/drm/drm_panic_qr.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/drm_panic_qr.rs +1 -1
@@ -476,7 +476,7 @@ struct EncodedMsg<'a> {/// Data to be put in the QR code, with correct segment encoding, padding, and /// Error Code Correction. impl EncodedMsg <'_> { -fn new <'a, 'b>(segments: &[&Segment <'b>], data: &'amut [u8 ]) ->Option <EncodedMsg <'a>> { +fn new <'a>(segments: &[&Segment <'_>], data: &'amut [u8 ]) ->Option <EncodedMsg <'a>> {let version =Version ::from_segments (segments)?;let ec_size = version.ec_size ();let g1_blocks = version.g1_blocks ();
Patches currently in stable-queue which might be from [email protected] are
queue-6.12/drm-panic-avoid-reimplementing-iterator-find.patch queue-6.12/documentation-rust-add-coding-guidelines-on-lints.patch queue-6.12/rust-provide-proper-code-documentation-titles.patch queue-6.12/rust-alloc-make-allocator-module-public.patch queue-6.12/rust-alloc-remove-vecext-extension.patch queue-6.12/rust-alloc-implement-reallocfunc.patch queue-6.12/rust-alloc-separate-aligned_size-from-krealloc_aligned.patch queue-6.12/rust-enable-clippy-unnecessary_safety_comment-lint.patch queue-6.12/rust-alloc-update-module-comment-of-alloc.rs.patch queue-6.12/rust-kbuild-expand-rusttest-target-for-macros.patch queue-6.12/rust-error-use-core-alloc-layouterror.patch queue-6.12/rust-str-test-replace-alloc-format.patch queue-6.12/loongarch-use-asm_reachable.patch queue-6.12/rust-alloc-implement-allocator-for-kmalloc.patch queue-6.12/rust-alloc-implement-collect-for-intoiter.patch queue-6.12/rust-alloc-introduce-arraylayout.patch queue-6.12/rust-alloc-implement-vmalloc-allocator.patch queue-6.12/documentation-rust-discuss-in-the-guidelines.patch queue-6.12/rust-error-check-for-config-test-in-error-name.patch queue-6.12/rust-enable-clippy-ignored_unit_patterns-lint.patch queue-6.12/rust-enable-clippy-unnecessary_safety_doc-lint.patch queue-6.12/rust-alloc-add-box-to-prelude.patch queue-6.12/kbuild-rust-remove-the-alloc-crate-and-globalalloc.patch queue-6.12/rust-alloc-add-allocator-trait.patch queue-6.12/rust-treewide-switch-to-our-kernel-box-type.patch queue-6.12/rust-introduce-.clippy.toml.patch queue-6.12/rust-alloc-rename-kernelallocator-to-kmalloc.patch queue-6.12/rust-alloc-implement-cmalloc-in-module-allocator_test.patch queue-6.12/drm-panic-allow-verbose-version-check.patch queue-6.12/rust-map-__kernel_size_t-and-friends-also-to-usize-isize.patch queue-6.12/rust-alloc-add-module-allocator_test.patch queue-6.12/rust-replace-clippy-dbg_macro-with-disallowed_macros.patch queue-6.12/rust-alloc-add-__gfp_nowarn-to-flags.patch queue-6.12/rust-enable-clippy-s-check-private-items.patch queue-6.12/rust-error-make-conversion-functions-public.patch queue-6.12/rust-sort-global-rust-flags.patch queue-6.12/rust-alloc-implement-contains-for-flags.patch queue-6.12/rust-init-remove-unneeded.patch queue-6.12/rust-use-custom-ffi-integer-types.patch queue-6.12/rust-sync-remove-unneeded.patch queue-6.12/rust-treewide-switch-to-the-kernel-vec-type.patch queue-6.12/rust-alloc-implement-kvmalloc-allocator.patch queue-6.12/drm-panic-correctly-indent-continuation-of-line-in-list-item.patch queue-6.12/rust-alloc-implement-kernel-vec-type.patch queue-6.12/rust-workqueue-remove-unneeded.patch queue-6.12/rust-error-optimize-error-type-to-use-nonzero.patch queue-6.12/drm-panic-remove-unnecessary-borrow-in-alignment_pattern.patch queue-6.12/rust-alloc-remove-extension-of-std-s-box.patch queue-6.12/rust-block-fix-formatting-in-gendisk-doc.patch queue-6.12/rust-enable-rustdoc-unescaped_backticks-lint.patch queue-6.12/rust-fix-size_t-in-bindgen-prototypes-of-c-builtins.patch queue-6.12/rust-enable-clippy-undocumented_unsafe_blocks-lint.patch queue-6.12/rust-alloc-add-vec-to-prelude.patch queue-6.12/rust-alloc-implement-intoiterator-for-vec.patch queue-6.12/rust-alloc-implement-kernel-box.patch queue-6.12/drm-panic-remove-redundant-field-when-assigning-value.patch queue-6.12/rust-types-avoid-repetition-in-as-from-bytes-impls.patch queue-6.12/rust-start-using-the-attribute.patch queue-6.12/drm-panic-allow-verbose-boolean-for-clarity.patch queue-6.12/maintainers-add-entry-for-the-rust-alloc-module.patch queue-6.12/rust-alloc-fix-arraylayout-allocations.patch queue-6.12/drm-panic-prefer-eliding-lifetimes.patch
Miguel Ojeda
maintainerPATCH 52/60 drm/panic: remove redundant field when assigning value
In reply to Miguel OjedaFrom: Thomas Böhler <[email protected]>
commit da13129a3f2a75d49469e1d6f7dcefac2d11d205 upstream.
Rust allows initializing fields of a struct without specifying the attribute that is assigned if the variable has the same name. In this instance this is done for all other attributes of the struct except for data. Clippy notes the redundant field name:
error: redundant field names in struct initialization
--> drivers/gpu/drm/drm_panic_qr.rs:495:13
|
495 | data: data,
| ^^^^^^^^^^ help: replace it with: data
|
= help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_field_names
= note: -D clippy::redundant-field-names implied by -D warnings
= help: to override -D warnings add #[allow(clippy::redundant_field_names)]
Remove the redundant data in the assignment to be consistent.
[ Reworded to add Clippy warning like it is done in the rest of the
series. - Miguel ]
--- drivers/gpu/drm/drm_panic_qr.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/drm_panic_qr.rs +1 -1
@@ -489,7 +489,7 @@ fn new<'a>(segments: &[&Segment<'_>], data: &'a mut [u8]) -> Option<EncodedMsg<' data.fill (0 );let mut em =EncodedMsg { - data: data, + data, ec_size, g1_blocks, g2_blocks,
Signature · 1 line
2.48.1
Patch "drm/panic: remove redundant field when assigning value" has been added to the 6.12-stable tree
This is a note to let you know that I've just added the patch titled
drm/panic: remove redundant field when assigning value
to the 6.12-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
drm-panic-remove-redundant-field-when-assigning-value.patch
and it can be found in the queue-6.12 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
From [email protected] Fri Mar 7 23:53:06 2025
From: Miguel Ojeda <[email protected]>
Date: Fri, 7 Mar 2025 23:49:59 +0100
Subject: drm/panic: remove redundant field when assigning value
To: Greg Kroah-Hartman <[email protected]>, Sasha Levin <[email protected]>, [email protected]
Cc: Danilo Krummrich <[email protected]>, Alice Ryhl <[email protected]>, Alyssa Ross <[email protected]>, NoisyCoil <[email protected]>, [email protected], Miguel Ojeda <[email protected]>
Message-ID: <[email protected]>
From: Thomas Böhler <[email protected]>
commit da13129a3f2a75d49469e1d6f7dcefac2d11d205 upstream.
Rust allows initializing fields of a struct without specifying the attribute that is assigned if the variable has the same name. In this instance this is done for all other attributes of the struct except for data. Clippy notes the redundant field name:
error: redundant field names in struct initialization
--> drivers/gpu/drm/drm_panic_qr.rs:495:13
|
495 | data: data,
| ^^^^^^^^^^ help: replace it with: data
|
= help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_field_names
= note: -D clippy::redundant-field-names implied by -D warnings
= help: to override -D warnings add #[allow(clippy::redundant_field_names)]
Remove the redundant data in the assignment to be consistent.
[ Reworded to add Clippy warning like it is done in the rest of the
series. - Miguel ]
--- drivers/gpu/drm/drm_panic_qr.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/drm_panic_qr.rs +1 -1
@@ -489,7 +489,7 @@ impl EncodedMsg<'_> { data.fill (0 );let mut em =EncodedMsg { - data: data, + data, ec_size, g1_blocks, g2_blocks,
Patches currently in stable-queue which might be from [email protected] are
queue-6.12/drm-panic-avoid-reimplementing-iterator-find.patch queue-6.12/documentation-rust-add-coding-guidelines-on-lints.patch queue-6.12/rust-provide-proper-code-documentation-titles.patch queue-6.12/rust-alloc-make-allocator-module-public.patch queue-6.12/rust-alloc-remove-vecext-extension.patch queue-6.12/rust-alloc-implement-reallocfunc.patch queue-6.12/rust-alloc-separate-aligned_size-from-krealloc_aligned.patch queue-6.12/rust-enable-clippy-unnecessary_safety_comment-lint.patch queue-6.12/rust-alloc-update-module-comment-of-alloc.rs.patch queue-6.12/rust-kbuild-expand-rusttest-target-for-macros.patch queue-6.12/rust-error-use-core-alloc-layouterror.patch queue-6.12/rust-str-test-replace-alloc-format.patch queue-6.12/loongarch-use-asm_reachable.patch queue-6.12/rust-alloc-implement-allocator-for-kmalloc.patch queue-6.12/rust-alloc-implement-collect-for-intoiter.patch queue-6.12/rust-alloc-introduce-arraylayout.patch queue-6.12/rust-alloc-implement-vmalloc-allocator.patch queue-6.12/documentation-rust-discuss-in-the-guidelines.patch queue-6.12/rust-error-check-for-config-test-in-error-name.patch queue-6.12/rust-enable-clippy-ignored_unit_patterns-lint.patch queue-6.12/rust-enable-clippy-unnecessary_safety_doc-lint.patch queue-6.12/rust-alloc-add-box-to-prelude.patch queue-6.12/kbuild-rust-remove-the-alloc-crate-and-globalalloc.patch queue-6.12/rust-alloc-add-allocator-trait.patch queue-6.12/rust-treewide-switch-to-our-kernel-box-type.patch queue-6.12/rust-introduce-.clippy.toml.patch queue-6.12/rust-alloc-rename-kernelallocator-to-kmalloc.patch queue-6.12/rust-alloc-implement-cmalloc-in-module-allocator_test.patch queue-6.12/drm-panic-allow-verbose-version-check.patch queue-6.12/rust-map-__kernel_size_t-and-friends-also-to-usize-isize.patch queue-6.12/rust-alloc-add-module-allocator_test.patch queue-6.12/rust-replace-clippy-dbg_macro-with-disallowed_macros.patch queue-6.12/rust-alloc-add-__gfp_nowarn-to-flags.patch queue-6.12/rust-enable-clippy-s-check-private-items.patch queue-6.12/rust-error-make-conversion-functions-public.patch queue-6.12/rust-sort-global-rust-flags.patch queue-6.12/rust-alloc-implement-contains-for-flags.patch queue-6.12/rust-init-remove-unneeded.patch queue-6.12/rust-use-custom-ffi-integer-types.patch queue-6.12/rust-sync-remove-unneeded.patch queue-6.12/rust-treewide-switch-to-the-kernel-vec-type.patch queue-6.12/rust-alloc-implement-kvmalloc-allocator.patch queue-6.12/drm-panic-correctly-indent-continuation-of-line-in-list-item.patch queue-6.12/rust-alloc-implement-kernel-vec-type.patch queue-6.12/rust-workqueue-remove-unneeded.patch queue-6.12/rust-error-optimize-error-type-to-use-nonzero.patch queue-6.12/drm-panic-remove-unnecessary-borrow-in-alignment_pattern.patch queue-6.12/rust-alloc-remove-extension-of-std-s-box.patch queue-6.12/rust-block-fix-formatting-in-gendisk-doc.patch queue-6.12/rust-enable-rustdoc-unescaped_backticks-lint.patch queue-6.12/rust-fix-size_t-in-bindgen-prototypes-of-c-builtins.patch queue-6.12/rust-enable-clippy-undocumented_unsafe_blocks-lint.patch queue-6.12/rust-alloc-add-vec-to-prelude.patch queue-6.12/rust-alloc-implement-intoiterator-for-vec.patch queue-6.12/rust-alloc-implement-kernel-box.patch queue-6.12/drm-panic-remove-redundant-field-when-assigning-value.patch queue-6.12/rust-types-avoid-repetition-in-as-from-bytes-impls.patch queue-6.12/rust-start-using-the-attribute.patch queue-6.12/drm-panic-allow-verbose-boolean-for-clarity.patch queue-6.12/maintainers-add-entry-for-the-rust-alloc-module.patch queue-6.12/rust-alloc-fix-arraylayout-allocations.patch queue-6.12/drm-panic-prefer-eliding-lifetimes.patch
Miguel Ojeda
maintainerPATCH 53/60 drm/panic: correctly indent continuation of line in list item
In reply to Miguel OjedaFrom: Thomas Böhler <[email protected]>
commit 5bb698e6fc514ddd9e23b6649b29a0934d8d8586 upstream.
It is common practice in Rust to indent the next line the same amount of space as the previous one if both belong to the same list item. Clippy checks for this with the lint doc_lazy_continuation.
error: doc list item without indentation
--> drivers/gpu/drm/drm_panic_qr.rs:979:5
|
979 | /// conversion to numeric segments.
| ^
|
= help: if this is supposed to be its own paragraph, add a blank line
= help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#doc_lazy_continuation
= note: -D clippy::doc-lazy-continuation implied by -D warnings
= help: to override -D warnings add #[allow(clippy::doc_lazy_continuation)]
help: indent this line
|
979 | /// conversion to numeric segments.
| ++
Indent the offending line by 2 more spaces to remove this Clippy error.
--- drivers/gpu/drm/drm_panic_qr.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/drm_panic_qr.rs +1 -1
@@ -975,7 +975,7 @@ fn draw_all(&mut self, data: impl Iterator<Item = u8>) {/// * `url_len`: Length of the URL. /// /// * If `url_len` > 0, remove the 2 segments header/length and also count the -/// conversion to numeric segments. +/// conversion to numeric segments. /// * If `url_len` = 0, only removes 3 bytes for 1 binary segment. #[no_mangle] pub extern "C" fn drm_panic_qr_max_data_size (version:u8 , url_len:usize ) ->usize {
Signature · 1 line
2.48.1
Patch "drm/panic: correctly indent continuation of line in list item" has been added to the 6.12-stable tree
This is a note to let you know that I've just added the patch titled
drm/panic: correctly indent continuation of line in list item
to the 6.12-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
drm-panic-correctly-indent-continuation-of-line-in-list-item.patch
and it can be found in the queue-6.12 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
From [email protected] Fri Mar 7 23:53:09 2025
From: Miguel Ojeda <[email protected]>
Date: Fri, 7 Mar 2025 23:50:00 +0100
Subject: drm/panic: correctly indent continuation of line in list item
To: Greg Kroah-Hartman <[email protected]>, Sasha Levin <[email protected]>, [email protected]
Cc: Danilo Krummrich <[email protected]>, Alice Ryhl <[email protected]>, Alyssa Ross <[email protected]>, NoisyCoil <[email protected]>, [email protected], Miguel Ojeda <[email protected]>
Message-ID: <[email protected]>
From: Thomas Böhler <[email protected]>
commit 5bb698e6fc514ddd9e23b6649b29a0934d8d8586 upstream.
It is common practice in Rust to indent the next line the same amount of space as the previous one if both belong to the same list item. Clippy checks for this with the lint doc_lazy_continuation.
error: doc list item without indentation
--> drivers/gpu/drm/drm_panic_qr.rs:979:5
|
979 | /// conversion to numeric segments.
| ^
|
= help: if this is supposed to be its own paragraph, add a blank line
= help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#doc_lazy_continuation
= note: -D clippy::doc-lazy-continuation implied by -D warnings
= help: to override -D warnings add #[allow(clippy::doc_lazy_continuation)]
help: indent this line
|
979 | /// conversion to numeric segments.
| ++
Indent the offending line by 2 more spaces to remove this Clippy error.
--- drivers/gpu/drm/drm_panic_qr.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/drm_panic_qr.rs +1 -1
@@ -975,7 +975,7 @@ pub unsafe extern "C" fn drm_panic_qr_ge/// * `url_len`: Length of the URL. /// /// * If `url_len` > 0, remove the 2 segments header/length and also count the -/// conversion to numeric segments. +/// conversion to numeric segments. /// * If `url_len` = 0, only removes 3 bytes for 1 binary segment. #[no_mangle] pub extern "C" fn drm_panic_qr_max_data_size (version:u8 , url_len:usize ) ->usize {
Patches currently in stable-queue which might be from [email protected] are
queue-6.12/drm-panic-avoid-reimplementing-iterator-find.patch queue-6.12/documentation-rust-add-coding-guidelines-on-lints.patch queue-6.12/rust-provide-proper-code-documentation-titles.patch queue-6.12/rust-alloc-make-allocator-module-public.patch queue-6.12/rust-alloc-remove-vecext-extension.patch queue-6.12/rust-alloc-implement-reallocfunc.patch queue-6.12/rust-alloc-separate-aligned_size-from-krealloc_aligned.patch queue-6.12/rust-enable-clippy-unnecessary_safety_comment-lint.patch queue-6.12/rust-alloc-update-module-comment-of-alloc.rs.patch queue-6.12/rust-kbuild-expand-rusttest-target-for-macros.patch queue-6.12/rust-error-use-core-alloc-layouterror.patch queue-6.12/rust-str-test-replace-alloc-format.patch queue-6.12/loongarch-use-asm_reachable.patch queue-6.12/rust-alloc-implement-allocator-for-kmalloc.patch queue-6.12/rust-alloc-implement-collect-for-intoiter.patch queue-6.12/rust-alloc-introduce-arraylayout.patch queue-6.12/rust-alloc-implement-vmalloc-allocator.patch queue-6.12/documentation-rust-discuss-in-the-guidelines.patch queue-6.12/rust-error-check-for-config-test-in-error-name.patch queue-6.12/rust-enable-clippy-ignored_unit_patterns-lint.patch queue-6.12/rust-enable-clippy-unnecessary_safety_doc-lint.patch queue-6.12/rust-alloc-add-box-to-prelude.patch queue-6.12/kbuild-rust-remove-the-alloc-crate-and-globalalloc.patch queue-6.12/rust-alloc-add-allocator-trait.patch queue-6.12/rust-treewide-switch-to-our-kernel-box-type.patch queue-6.12/rust-introduce-.clippy.toml.patch queue-6.12/rust-alloc-rename-kernelallocator-to-kmalloc.patch queue-6.12/rust-alloc-implement-cmalloc-in-module-allocator_test.patch queue-6.12/drm-panic-allow-verbose-version-check.patch queue-6.12/rust-map-__kernel_size_t-and-friends-also-to-usize-isize.patch queue-6.12/rust-alloc-add-module-allocator_test.patch queue-6.12/rust-replace-clippy-dbg_macro-with-disallowed_macros.patch queue-6.12/rust-alloc-add-__gfp_nowarn-to-flags.patch queue-6.12/rust-enable-clippy-s-check-private-items.patch queue-6.12/rust-error-make-conversion-functions-public.patch queue-6.12/rust-sort-global-rust-flags.patch queue-6.12/rust-alloc-implement-contains-for-flags.patch queue-6.12/rust-init-remove-unneeded.patch queue-6.12/rust-use-custom-ffi-integer-types.patch queue-6.12/rust-sync-remove-unneeded.patch queue-6.12/rust-treewide-switch-to-the-kernel-vec-type.patch queue-6.12/rust-alloc-implement-kvmalloc-allocator.patch queue-6.12/drm-panic-correctly-indent-continuation-of-line-in-list-item.patch queue-6.12/rust-alloc-implement-kernel-vec-type.patch queue-6.12/rust-workqueue-remove-unneeded.patch queue-6.12/rust-error-optimize-error-type-to-use-nonzero.patch queue-6.12/drm-panic-remove-unnecessary-borrow-in-alignment_pattern.patch queue-6.12/rust-alloc-remove-extension-of-std-s-box.patch queue-6.12/rust-block-fix-formatting-in-gendisk-doc.patch queue-6.12/rust-enable-rustdoc-unescaped_backticks-lint.patch queue-6.12/rust-fix-size_t-in-bindgen-prototypes-of-c-builtins.patch queue-6.12/rust-enable-clippy-undocumented_unsafe_blocks-lint.patch queue-6.12/rust-alloc-add-vec-to-prelude.patch queue-6.12/rust-alloc-implement-intoiterator-for-vec.patch queue-6.12/rust-alloc-implement-kernel-box.patch queue-6.12/drm-panic-remove-redundant-field-when-assigning-value.patch queue-6.12/rust-types-avoid-repetition-in-as-from-bytes-impls.patch queue-6.12/rust-start-using-the-attribute.patch queue-6.12/drm-panic-allow-verbose-boolean-for-clarity.patch queue-6.12/maintainers-add-entry-for-the-rust-alloc-module.patch queue-6.12/rust-alloc-fix-arraylayout-allocations.patch queue-6.12/drm-panic-prefer-eliding-lifetimes.patch
Miguel Ojeda
maintainerPATCH 54/60 drm/panic: allow verbose boolean for clarity
In reply to Miguel OjedaFrom: Thomas Böhler <[email protected]>
commit 27aef8a52e4b7f120ce47cd638d9d83065b759d2 upstream.
Clippy complains about a non-minimal boolean expression with nonminimal_bool:
error: this boolean expression can be simplified
--> drivers/gpu/drm/drm_panic_qr.rs:722:9
|
722 | (x < 8 && y < 8) || (x < 8 && y >= end) || (x >= end && y < 8)
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#nonminimal_bool
= note: `-D clippy::nonminimal-bool` implied by `-D warnings`
= help: to override `-D warnings` add `#[allow(clippy::nonminimal_bool)]`
help: try
|
722 | !(x >= 8 || y >= 8 && y < end) || (x >= end && y < 8)
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
722 | (y >= end || y < 8) && x < 8 || (x >= end && y < 8)
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~While this can be useful in a lot of cases, it isn't here because the line expresses clearly what the intention is. Simplifying the expression means losing clarity, so opt-out of this lint for the offending line.
--- drivers/gpu/drm/drm_panic_qr.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
drivers/gpu/drm/drm_panic_qr.rs +4 -1
@@ -719,7 +719,10 @@ fn draw_finders(&mut self) {fn is_finder (&self, x:u8 , y:u8 ) ->bool {let end = self.width -8 ; - (x <8 && y <8 ) || (x <8 && y >= end) || (x >= end && y <8 ) +#[expect(clippy::nonminimal_bool)] + { + (x <8 && y <8 ) || (x <8 && y >= end) || (x >= end && y <8 ) + } }// Alignment pattern: 5x5 squares in a grid.
Signature · 1 line
2.48.1
Patch "drm/panic: allow verbose boolean for clarity" has been added to the 6.12-stable tree
This is a note to let you know that I've just added the patch titled
drm/panic: allow verbose boolean for clarity
to the 6.12-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
drm-panic-allow-verbose-boolean-for-clarity.patch
and it can be found in the queue-6.12 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
From [email protected] Fri Mar 7 23:53:06 2025
From: Miguel Ojeda <[email protected]>
Date: Fri, 7 Mar 2025 23:50:01 +0100
Subject: drm/panic: allow verbose boolean for clarity
To: Greg Kroah-Hartman <[email protected]>, Sasha Levin <[email protected]>, [email protected]
Cc: Danilo Krummrich <[email protected]>, Alice Ryhl <[email protected]>, Alyssa Ross <[email protected]>, NoisyCoil <[email protected]>, [email protected], Miguel Ojeda <[email protected]>
Message-ID: <[email protected]>
From: Thomas Böhler <[email protected]>
commit 27aef8a52e4b7f120ce47cd638d9d83065b759d2 upstream.
Clippy complains about a non-minimal boolean expression with nonminimal_bool:
error: this boolean expression can be simplified
--> drivers/gpu/drm/drm_panic_qr.rs:722:9
|
722 | (x < 8 && y < 8) || (x < 8 && y >= end) || (x >= end && y < 8)
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#nonminimal_bool
= note: `-D clippy::nonminimal-bool` implied by `-D warnings`
= help: to override `-D warnings` add `#[allow(clippy::nonminimal_bool)]`
help: try
|
722 | !(x >= 8 || y >= 8 && y < end) || (x >= end && y < 8)
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
722 | (y >= end || y < 8) && x < 8 || (x >= end && y < 8)
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~While this can be useful in a lot of cases, it isn't here because the line expresses clearly what the intention is. Simplifying the expression means losing clarity, so opt-out of this lint for the offending line.
--- drivers/gpu/drm/drm_panic_qr.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
drivers/gpu/drm/drm_panic_qr.rs +4 -1
@@ -719,7 +719,10 @@ impl QrImage<'_> {fn is_finder (&self, x:u8 , y:u8 ) ->bool {let end = self.width -8 ; - (x <8 && y <8 ) || (x <8 && y >= end) || (x >= end && y <8 ) +#[expect(clippy::nonminimal_bool)] + { + (x <8 && y <8 ) || (x <8 && y >= end) || (x >= end && y <8 ) + } }// Alignment pattern: 5x5 squares in a grid.
Patches currently in stable-queue which might be from [email protected] are
queue-6.12/drm-panic-avoid-reimplementing-iterator-find.patch queue-6.12/documentation-rust-add-coding-guidelines-on-lints.patch queue-6.12/rust-provide-proper-code-documentation-titles.patch queue-6.12/rust-alloc-make-allocator-module-public.patch queue-6.12/rust-alloc-remove-vecext-extension.patch queue-6.12/rust-alloc-implement-reallocfunc.patch queue-6.12/rust-alloc-separate-aligned_size-from-krealloc_aligned.patch queue-6.12/rust-enable-clippy-unnecessary_safety_comment-lint.patch queue-6.12/rust-alloc-update-module-comment-of-alloc.rs.patch queue-6.12/rust-kbuild-expand-rusttest-target-for-macros.patch queue-6.12/rust-error-use-core-alloc-layouterror.patch queue-6.12/rust-str-test-replace-alloc-format.patch queue-6.12/loongarch-use-asm_reachable.patch queue-6.12/rust-alloc-implement-allocator-for-kmalloc.patch queue-6.12/rust-alloc-implement-collect-for-intoiter.patch queue-6.12/rust-alloc-introduce-arraylayout.patch queue-6.12/rust-alloc-implement-vmalloc-allocator.patch queue-6.12/documentation-rust-discuss-in-the-guidelines.patch queue-6.12/rust-error-check-for-config-test-in-error-name.patch queue-6.12/rust-enable-clippy-ignored_unit_patterns-lint.patch queue-6.12/rust-enable-clippy-unnecessary_safety_doc-lint.patch queue-6.12/rust-alloc-add-box-to-prelude.patch queue-6.12/kbuild-rust-remove-the-alloc-crate-and-globalalloc.patch queue-6.12/rust-alloc-add-allocator-trait.patch queue-6.12/rust-treewide-switch-to-our-kernel-box-type.patch queue-6.12/rust-introduce-.clippy.toml.patch queue-6.12/rust-alloc-rename-kernelallocator-to-kmalloc.patch queue-6.12/rust-alloc-implement-cmalloc-in-module-allocator_test.patch queue-6.12/drm-panic-allow-verbose-version-check.patch queue-6.12/rust-map-__kernel_size_t-and-friends-also-to-usize-isize.patch queue-6.12/rust-alloc-add-module-allocator_test.patch queue-6.12/rust-replace-clippy-dbg_macro-with-disallowed_macros.patch queue-6.12/rust-alloc-add-__gfp_nowarn-to-flags.patch queue-6.12/rust-enable-clippy-s-check-private-items.patch queue-6.12/rust-error-make-conversion-functions-public.patch queue-6.12/rust-sort-global-rust-flags.patch queue-6.12/rust-alloc-implement-contains-for-flags.patch queue-6.12/rust-init-remove-unneeded.patch queue-6.12/rust-use-custom-ffi-integer-types.patch queue-6.12/rust-sync-remove-unneeded.patch queue-6.12/rust-treewide-switch-to-the-kernel-vec-type.patch queue-6.12/rust-alloc-implement-kvmalloc-allocator.patch queue-6.12/drm-panic-correctly-indent-continuation-of-line-in-list-item.patch queue-6.12/rust-alloc-implement-kernel-vec-type.patch queue-6.12/rust-workqueue-remove-unneeded.patch queue-6.12/rust-error-optimize-error-type-to-use-nonzero.patch queue-6.12/drm-panic-remove-unnecessary-borrow-in-alignment_pattern.patch queue-6.12/rust-alloc-remove-extension-of-std-s-box.patch queue-6.12/rust-block-fix-formatting-in-gendisk-doc.patch queue-6.12/rust-enable-rustdoc-unescaped_backticks-lint.patch queue-6.12/rust-fix-size_t-in-bindgen-prototypes-of-c-builtins.patch queue-6.12/rust-enable-clippy-undocumented_unsafe_blocks-lint.patch queue-6.12/rust-alloc-add-vec-to-prelude.patch queue-6.12/rust-alloc-implement-intoiterator-for-vec.patch queue-6.12/rust-alloc-implement-kernel-box.patch queue-6.12/drm-panic-remove-redundant-field-when-assigning-value.patch queue-6.12/rust-types-avoid-repetition-in-as-from-bytes-impls.patch queue-6.12/rust-start-using-the-attribute.patch queue-6.12/drm-panic-allow-verbose-boolean-for-clarity.patch queue-6.12/maintainers-add-entry-for-the-rust-alloc-module.patch queue-6.12/rust-alloc-fix-arraylayout-allocations.patch queue-6.12/drm-panic-prefer-eliding-lifetimes.patch
Miguel Ojeda
maintainerPATCH 55/60 drm/panic: allow verbose version check
In reply to Miguel OjedaFrom: Thomas Böhler <[email protected]>
commit 06b919e3fedf4798a1f0f60e0b67caa192f724a7 upstream.
Clippy warns about a reimplementation of RangeInclusive::contains:
error: manual `!RangeInclusive::contains` implementation
--> drivers/gpu/drm/drm_panic_qr.rs:986:8
|
986 | if version < 1 || version > 40 {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use: `!(1..=40).contains(&version)`
|
= help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#manual_range_contains
= note: `-D clippy::manual-range-contains` implied by `-D warnings`
= help: to override `-D warnings` add `#[allow(clippy::manual_range_contains)]`Ignore this and keep the current implementation as that makes it easier to read.
--- drivers/gpu/drm/drm_panic_qr.rs | 1 + 1 file changed, 1 insertion(+)
drivers/gpu/drm/drm_panic_qr.rs +1 -0
@@ -982,6 +982,7 @@ fn draw_all(&mut self, data: impl Iterator<Item = u8>) {/// * If `url_len` = 0, only removes 3 bytes for 1 binary segment. #[no_mangle] pub extern "C" fn drm_panic_qr_max_data_size (version:u8 , url_len:usize ) ->usize { +#[expect(clippy::manual_range_contains)] if version <1 || version >40 {return 0 ; }
Signature · 1 line
2.48.1
Patch "drm/panic: allow verbose version check" has been added to the 6.12-stable tree
This is a note to let you know that I've just added the patch titled
drm/panic: allow verbose version check
to the 6.12-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
drm-panic-allow-verbose-version-check.patch
and it can be found in the queue-6.12 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
From [email protected] Fri Mar 7 23:53:09 2025
From: Miguel Ojeda <[email protected]>
Date: Fri, 7 Mar 2025 23:50:02 +0100
Subject: drm/panic: allow verbose version check
To: Greg Kroah-Hartman <[email protected]>, Sasha Levin <[email protected]>, [email protected]
Cc: Danilo Krummrich <[email protected]>, Alice Ryhl <[email protected]>, Alyssa Ross <[email protected]>, NoisyCoil <[email protected]>, [email protected], Miguel Ojeda <[email protected]>
Message-ID: <[email protected]>
From: Thomas Böhler <[email protected]>
commit 06b919e3fedf4798a1f0f60e0b67caa192f724a7 upstream.
Clippy warns about a reimplementation of RangeInclusive::contains:
error: manual `!RangeInclusive::contains` implementation
--> drivers/gpu/drm/drm_panic_qr.rs:986:8
|
986 | if version < 1 || version > 40 {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use: `!(1..=40).contains(&version)`
|
= help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#manual_range_contains
= note: `-D clippy::manual-range-contains` implied by `-D warnings`
= help: to override `-D warnings` add `#[allow(clippy::manual_range_contains)]`Ignore this and keep the current implementation as that makes it easier to read.
--- drivers/gpu/drm/drm_panic_qr.rs | 1 + 1 file changed, 1 insertion(+)
drivers/gpu/drm/drm_panic_qr.rs +1 -0
@@ -982,6 +982,7 @@ pub unsafe extern "C" fn drm_panic_qr_ge/// * If `url_len` = 0, only removes 3 bytes for 1 binary segment. #[no_mangle] pub extern "C" fn drm_panic_qr_max_data_size (version:u8 , url_len:usize ) ->usize { +#[expect(clippy::manual_range_contains)] if version <1 || version >40 {return 0 ; }
Patches currently in stable-queue which might be from [email protected] are
queue-6.12/drm-panic-avoid-reimplementing-iterator-find.patch queue-6.12/documentation-rust-add-coding-guidelines-on-lints.patch queue-6.12/rust-provide-proper-code-documentation-titles.patch queue-6.12/rust-alloc-make-allocator-module-public.patch queue-6.12/rust-alloc-remove-vecext-extension.patch queue-6.12/rust-alloc-implement-reallocfunc.patch queue-6.12/rust-alloc-separate-aligned_size-from-krealloc_aligned.patch queue-6.12/rust-enable-clippy-unnecessary_safety_comment-lint.patch queue-6.12/rust-alloc-update-module-comment-of-alloc.rs.patch queue-6.12/rust-kbuild-expand-rusttest-target-for-macros.patch queue-6.12/rust-error-use-core-alloc-layouterror.patch queue-6.12/rust-str-test-replace-alloc-format.patch queue-6.12/loongarch-use-asm_reachable.patch queue-6.12/rust-alloc-implement-allocator-for-kmalloc.patch queue-6.12/rust-alloc-implement-collect-for-intoiter.patch queue-6.12/rust-alloc-introduce-arraylayout.patch queue-6.12/rust-alloc-implement-vmalloc-allocator.patch queue-6.12/documentation-rust-discuss-in-the-guidelines.patch queue-6.12/rust-error-check-for-config-test-in-error-name.patch queue-6.12/rust-enable-clippy-ignored_unit_patterns-lint.patch queue-6.12/rust-enable-clippy-unnecessary_safety_doc-lint.patch queue-6.12/rust-alloc-add-box-to-prelude.patch queue-6.12/kbuild-rust-remove-the-alloc-crate-and-globalalloc.patch queue-6.12/rust-alloc-add-allocator-trait.patch queue-6.12/rust-treewide-switch-to-our-kernel-box-type.patch queue-6.12/rust-introduce-.clippy.toml.patch queue-6.12/rust-alloc-rename-kernelallocator-to-kmalloc.patch queue-6.12/rust-alloc-implement-cmalloc-in-module-allocator_test.patch queue-6.12/drm-panic-allow-verbose-version-check.patch queue-6.12/rust-map-__kernel_size_t-and-friends-also-to-usize-isize.patch queue-6.12/rust-alloc-add-module-allocator_test.patch queue-6.12/rust-replace-clippy-dbg_macro-with-disallowed_macros.patch queue-6.12/rust-alloc-add-__gfp_nowarn-to-flags.patch queue-6.12/rust-enable-clippy-s-check-private-items.patch queue-6.12/rust-error-make-conversion-functions-public.patch queue-6.12/rust-sort-global-rust-flags.patch queue-6.12/rust-alloc-implement-contains-for-flags.patch queue-6.12/rust-init-remove-unneeded.patch queue-6.12/rust-use-custom-ffi-integer-types.patch queue-6.12/rust-sync-remove-unneeded.patch queue-6.12/rust-treewide-switch-to-the-kernel-vec-type.patch queue-6.12/rust-alloc-implement-kvmalloc-allocator.patch queue-6.12/drm-panic-correctly-indent-continuation-of-line-in-list-item.patch queue-6.12/rust-alloc-implement-kernel-vec-type.patch queue-6.12/rust-workqueue-remove-unneeded.patch queue-6.12/rust-error-optimize-error-type-to-use-nonzero.patch queue-6.12/drm-panic-remove-unnecessary-borrow-in-alignment_pattern.patch queue-6.12/rust-alloc-remove-extension-of-std-s-box.patch queue-6.12/rust-block-fix-formatting-in-gendisk-doc.patch queue-6.12/rust-enable-rustdoc-unescaped_backticks-lint.patch queue-6.12/rust-fix-size_t-in-bindgen-prototypes-of-c-builtins.patch queue-6.12/rust-enable-clippy-undocumented_unsafe_blocks-lint.patch queue-6.12/rust-alloc-add-vec-to-prelude.patch queue-6.12/rust-alloc-implement-intoiterator-for-vec.patch queue-6.12/rust-alloc-implement-kernel-box.patch queue-6.12/drm-panic-remove-redundant-field-when-assigning-value.patch queue-6.12/rust-types-avoid-repetition-in-as-from-bytes-impls.patch queue-6.12/rust-start-using-the-attribute.patch queue-6.12/drm-panic-allow-verbose-boolean-for-clarity.patch queue-6.12/maintainers-add-entry-for-the-rust-alloc-module.patch queue-6.12/rust-alloc-fix-arraylayout-allocations.patch queue-6.12/drm-panic-prefer-eliding-lifetimes.patch
Miguel Ojeda
maintainerPATCH 56/60 rust: kbuild: expand rusttest target for macros
In reply to Miguel OjedaFrom: "Ethan D. Twardy" <[email protected]>
commit b2c261fa8629dff2bd1143fa790797a773ace102 upstream.
Previously, the rusttest target for the macros crate did not specify the dependencies necessary to run the rustdoc tests. These tests rely on the kernel crate, so add the dependencies.
[ Rebased (alloc is gone nowadays, sysroot handling is simpler) and
simplified (reused rustdoc_test rule instead of adding a new one, no need for rustdoc-compiler_builtins, removed unneeded macros explicit path). Made vtable example fail (avoiding to increase the complexity in the rusttest target). Removed unstable -Zproc-macro-backtrace option. Reworded accordingly. - Miguel ]
--- rust/Makefile | 17 +++++++++++++---- rust/macros/lib.rs | 2 +- 2 files changed, 14 insertions(+), 5 deletions(-)
rust/Makefile +13 -4
@@ -129,6 +129,14 @@ rusttestlib-macros: private rustc_test_library_proc = yes rusttestlib-macros: $(src)/macros/lib.rs FORCE +$(call if_changed,rustc_test_library) +rusttestlib-kernel: private rustc_target_flags = \ + --extern build_error --extern macros \ + --extern bindings --extern uapi +rusttestlib-kernel: $(src)/kernel/lib.rs \ + rusttestlib-bindings rusttestlib-uapi rusttestlib-build_error \ + $(obj)/libmacros.so $(obj)/bindings.o FORCE + +$(call if_changed,rustc_test_library) + rusttestlib-bindings: $(src)/bindings/lib.rs FORCE +$(call if_changed,rustc_test_library)
@@ -181,19 +189,20 @@ quiet_cmd_rustc_test = RUSTC T $< rusttest: rusttest-macros rusttest-kernel -rusttest-macros: private rustc_target_flags = --extern proc_macro +rusttest-macros: private rustc_target_flags = --extern proc_macro \ + --extern macros --extern kernel rusttest-macros: private rustdoc_test_target_flags = --crate-type proc-macro -rusttest-macros: $(src)/macros/lib.rs FORCE +rusttest-macros: $(src)/macros/lib.rs \ + rusttestlib-macros rusttestlib-kernel FORCE +$(call if_changed,rustc_test) +$(call if_changed,rustdoc_test) rusttest-kernel: private rustc_target_flags = \ --extern build_error --extern macros --extern bindings --extern uapi -rusttest-kernel: $(src)/kernel/lib.rs \ +rusttest-kernel: $(src)/kernel/lib.rs rusttestlib-kernel \ rusttestlib-build_error rusttestlib-macros rusttestlib-bindings \ rusttestlib-uapi FORCE +$(call if_changed,rustc_test) - +$(call if_changed,rustc_test_library) ifdef CONFIG_CC_IS_CLANG bindgen_c_flags = $(c_flags)
rust/macros/lib.rs +1 -1
@@ -132,7 +132,7 @@ pub fn module(ts: TokenStream) -> TokenStream {/// calls to this function at compile time: /// /// ```compile_fail -/// # use kernel::error::VTABLE_DEFAULT_ERROR; +/// # // Intentionally missing `use`s to simplify `rusttest`. /// kernel::build_error(VTABLE_DEFAULT_ERROR) /// ``` ///
Signature · 1 line
2.48.1
Patch "rust: kbuild: expand rusttest target for macros" has been added to the 6.12-stable tree
This is a note to let you know that I've just added the patch titled
rust: kbuild: expand rusttest target for macros
to the 6.12-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
rust-kbuild-expand-rusttest-target-for-macros.patch
and it can be found in the queue-6.12 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
From [email protected] Fri Mar 7 23:53:11 2025
From: Miguel Ojeda <[email protected]>
Date: Fri, 7 Mar 2025 23:50:03 +0100
Subject: rust: kbuild: expand rusttest target for macros
To: Greg Kroah-Hartman <[email protected]>, Sasha Levin <[email protected]>, [email protected]
Cc: Danilo Krummrich <[email protected]>, Alice Ryhl <[email protected]>, Alyssa Ross <[email protected]>, NoisyCoil <[email protected]>, [email protected], Miguel Ojeda <[email protected]>
Message-ID: <[email protected]>
From: "Ethan D. Twardy" <[email protected]>
commit b2c261fa8629dff2bd1143fa790797a773ace102 upstream.
Previously, the rusttest target for the macros crate did not specify the dependencies necessary to run the rustdoc tests. These tests rely on the kernel crate, so add the dependencies.
[ Rebased (alloc is gone nowadays, sysroot handling is simpler) and
simplified (reused rustdoc_test rule instead of adding a new one, no need for rustdoc-compiler_builtins, removed unneeded macros explicit path). Made vtable example fail (avoiding to increase the complexity in the rusttest target). Removed unstable -Zproc-macro-backtrace option. Reworded accordingly. - Miguel ]
--- rust/Makefile | 17 +++++++++++++---- rust/macros/lib.rs | 2 +- 2 files changed, 14 insertions(+), 5 deletions(-)
rust/Makefile +13 -4
@@ -129,6 +129,14 @@ rusttestlib-macros: private rustc_test_l rusttestlib-macros: $(src)/macros/lib.rs FORCE +$(call if_changed,rustc_test_library) +rusttestlib-kernel: private rustc_target_flags = \ + --extern build_error --extern macros \ + --extern bindings --extern uapi +rusttestlib-kernel: $(src)/kernel/lib.rs \ + rusttestlib-bindings rusttestlib-uapi rusttestlib-build_error \ + $(obj)/libmacros.so $(obj)/bindings.o FORCE + +$(call if_changed,rustc_test_library) + rusttestlib-bindings: $(src)/bindings/lib.rs FORCE +$(call if_changed,rustc_test_library)
@@ -181,19 +189,20 @@ quiet_cmd_rustc_test = RUSTC T $< rusttest: rusttest-macros rusttest-kernel -rusttest-macros: private rustc_target_flags = --extern proc_macro +rusttest-macros: private rustc_target_flags = --extern proc_macro \ + --extern macros --extern kernel rusttest-macros: private rustdoc_test_target_flags = --crate-type proc-macro -rusttest-macros: $(src)/macros/lib.rs FORCE +rusttest-macros: $(src)/macros/lib.rs \ + rusttestlib-macros rusttestlib-kernel FORCE +$(call if_changed,rustc_test) +$(call if_changed,rustdoc_test) rusttest-kernel: private rustc_target_flags = \ --extern build_error --extern macros --extern bindings --extern uapi -rusttest-kernel: $(src)/kernel/lib.rs \ +rusttest-kernel: $(src)/kernel/lib.rs rusttestlib-kernel \ rusttestlib-build_error rusttestlib-macros rusttestlib-bindings \ rusttestlib-uapi FORCE +$(call if_changed,rustc_test) - +$(call if_changed,rustc_test_library) ifdef CONFIG_CC_IS_CLANG bindgen_c_flags = $(c_flags)
rust/macros/lib.rs +1 -1
@@ -132,7 +132,7 @@ pub fn module(ts: TokenStream) -> TokenS/// calls to this function at compile time: /// /// ```compile_fail -/// # use kernel::error::VTABLE_DEFAULT_ERROR; +/// # // Intentionally missing `use`s to simplify `rusttest`. /// kernel::build_error(VTABLE_DEFAULT_ERROR) /// ``` ///
Patches currently in stable-queue which might be from [email protected] are
queue-6.12/drm-panic-avoid-reimplementing-iterator-find.patch queue-6.12/documentation-rust-add-coding-guidelines-on-lints.patch queue-6.12/rust-provide-proper-code-documentation-titles.patch queue-6.12/rust-alloc-make-allocator-module-public.patch queue-6.12/rust-alloc-remove-vecext-extension.patch queue-6.12/rust-alloc-implement-reallocfunc.patch queue-6.12/rust-alloc-separate-aligned_size-from-krealloc_aligned.patch queue-6.12/rust-enable-clippy-unnecessary_safety_comment-lint.patch queue-6.12/rust-alloc-update-module-comment-of-alloc.rs.patch queue-6.12/rust-kbuild-expand-rusttest-target-for-macros.patch queue-6.12/rust-error-use-core-alloc-layouterror.patch queue-6.12/rust-str-test-replace-alloc-format.patch queue-6.12/loongarch-use-asm_reachable.patch queue-6.12/rust-alloc-implement-allocator-for-kmalloc.patch queue-6.12/rust-alloc-implement-collect-for-intoiter.patch queue-6.12/rust-alloc-introduce-arraylayout.patch queue-6.12/rust-alloc-implement-vmalloc-allocator.patch queue-6.12/documentation-rust-discuss-in-the-guidelines.patch queue-6.12/rust-error-check-for-config-test-in-error-name.patch queue-6.12/rust-enable-clippy-ignored_unit_patterns-lint.patch queue-6.12/rust-enable-clippy-unnecessary_safety_doc-lint.patch queue-6.12/rust-alloc-add-box-to-prelude.patch queue-6.12/kbuild-rust-remove-the-alloc-crate-and-globalalloc.patch queue-6.12/rust-alloc-add-allocator-trait.patch queue-6.12/rust-treewide-switch-to-our-kernel-box-type.patch queue-6.12/rust-introduce-.clippy.toml.patch queue-6.12/rust-alloc-rename-kernelallocator-to-kmalloc.patch queue-6.12/rust-alloc-implement-cmalloc-in-module-allocator_test.patch queue-6.12/drm-panic-allow-verbose-version-check.patch queue-6.12/rust-map-__kernel_size_t-and-friends-also-to-usize-isize.patch queue-6.12/rust-alloc-add-module-allocator_test.patch queue-6.12/rust-replace-clippy-dbg_macro-with-disallowed_macros.patch queue-6.12/rust-alloc-add-__gfp_nowarn-to-flags.patch queue-6.12/rust-enable-clippy-s-check-private-items.patch queue-6.12/rust-error-make-conversion-functions-public.patch queue-6.12/rust-sort-global-rust-flags.patch queue-6.12/rust-alloc-implement-contains-for-flags.patch queue-6.12/rust-init-remove-unneeded.patch queue-6.12/rust-use-custom-ffi-integer-types.patch queue-6.12/rust-sync-remove-unneeded.patch queue-6.12/rust-treewide-switch-to-the-kernel-vec-type.patch queue-6.12/rust-alloc-implement-kvmalloc-allocator.patch queue-6.12/drm-panic-correctly-indent-continuation-of-line-in-list-item.patch queue-6.12/rust-alloc-implement-kernel-vec-type.patch queue-6.12/rust-workqueue-remove-unneeded.patch queue-6.12/rust-error-optimize-error-type-to-use-nonzero.patch queue-6.12/drm-panic-remove-unnecessary-borrow-in-alignment_pattern.patch queue-6.12/rust-alloc-remove-extension-of-std-s-box.patch queue-6.12/rust-block-fix-formatting-in-gendisk-doc.patch queue-6.12/rust-enable-rustdoc-unescaped_backticks-lint.patch queue-6.12/rust-fix-size_t-in-bindgen-prototypes-of-c-builtins.patch queue-6.12/rust-enable-clippy-undocumented_unsafe_blocks-lint.patch queue-6.12/rust-alloc-add-vec-to-prelude.patch queue-6.12/rust-alloc-implement-intoiterator-for-vec.patch queue-6.12/rust-alloc-implement-kernel-box.patch queue-6.12/drm-panic-remove-redundant-field-when-assigning-value.patch queue-6.12/rust-types-avoid-repetition-in-as-from-bytes-impls.patch queue-6.12/rust-start-using-the-attribute.patch queue-6.12/drm-panic-allow-verbose-boolean-for-clarity.patch queue-6.12/maintainers-add-entry-for-the-rust-alloc-module.patch queue-6.12/rust-alloc-fix-arraylayout-allocations.patch queue-6.12/drm-panic-prefer-eliding-lifetimes.patch
Miguel Ojeda
maintainerPATCH 57/60 rust: fix size_t in bindgen prototypes of C builtins
In reply to Miguel OjedaFrom: Gary Guo <[email protected]>
commit 75c1fd41a671a0843b89d1526411a837a7163fa2 upstream.
Without -fno-builtin, for functions like memcpy/memmove (and many others), bindgen seems to be using the clang-provided prototype. This prototype is ABI-wise compatible, but the issue is that it does not have the same information as the source code w.r.t. typedefs.
For example, bindgen generates the following:
extern "C" {
pub fn strlen(s: *const core::ffi::c_char) -> core::ffi::c_ulong;
}note that the return type is c_ulong (i.e. unsigned long), despite the size_t-is-usize behavior (this is default, and we have not opted out from it using --no-size_t-is-usize).
Similarly, memchr's size argument should be of type __kernel_size_t, but bindgen generates c_ulong directly.
We want to ensure any size_t is translated to Rust usize so that we can avoid having them be different type on 32-bit and 64-bit architectures, and hence would require a lot of excessive type casts when calling FFI functions.
I found that this bindgen behavior (which probably is caused by libclang) can be disabled by -fno-builtin. Using the flag for compiled code can result in less optimisation because compiler cannot assume about their properties anymore, but this should not affect bindgen.
[ Trevor asked: "I wonder how reliable this behavior is. Maybe bindgen
could do a better job controlling this, is there an open issue?".
Gary replied: ..."apparently this is indeed the suggested approach in
https://github.com/rust-lang/rust-bindgen/issues/1770". - Miguel ]
--- rust/Makefile | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
rust/Makefile +5 -1
@@ -264,7 +264,11 @@ else bindgen_c_flags_lto = $(bindgen_c_flags) endif -bindgen_c_flags_final = $(bindgen_c_flags_lto) -D__BINDGEN__ +# `-fno-builtin` is passed to avoid `bindgen` from using `clang` builtin +# prototypes for functions like `memcpy` -- if this flag is not passed, +# `bindgen`-generated prototypes use `c_ulong` or `c_uint` depending on +# architecture instead of generating `usize`. +bindgen_c_flags_final = $(bindgen_c_flags_lto) -fno-builtin -D__BINDGEN__ # Each `bindgen` release may upgrade the list of Rust target versions. By # default, the highest stable release in their list is used. Thus we need to set
Signature · 1 line
2.48.1
Patch "rust: fix size_t in bindgen prototypes of C builtins" has been added to the 6.12-stable tree
This is a note to let you know that I've just added the patch titled
rust: fix size_t in bindgen prototypes of C builtins
to the 6.12-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
rust-fix-size_t-in-bindgen-prototypes-of-c-builtins.patch
and it can be found in the queue-6.12 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
From [email protected] Fri Mar 7 23:53:18 2025
From: Miguel Ojeda <[email protected]>
Date: Fri, 7 Mar 2025 23:50:04 +0100
Subject: rust: fix size_t in bindgen prototypes of C builtins
To: Greg Kroah-Hartman <[email protected]>, Sasha Levin <[email protected]>, [email protected]
Cc: Danilo Krummrich <[email protected]>, Alice Ryhl <[email protected]>, Alyssa Ross <[email protected]>, NoisyCoil <[email protected]>, [email protected], Miguel Ojeda <[email protected]>
Message-ID: <[email protected]>
From: Gary Guo <[email protected]>
commit 75c1fd41a671a0843b89d1526411a837a7163fa2 upstream.
Without -fno-builtin, for functions like memcpy/memmove (and many others), bindgen seems to be using the clang-provided prototype. This prototype is ABI-wise compatible, but the issue is that it does not have the same information as the source code w.r.t. typedefs.
For example, bindgen generates the following:
extern "C" {
pub fn strlen(s: *const core::ffi::c_char) -> core::ffi::c_ulong;
}note that the return type is c_ulong (i.e. unsigned long), despite the size_t-is-usize behavior (this is default, and we have not opted out from it using --no-size_t-is-usize).
Similarly, memchr's size argument should be of type __kernel_size_t, but bindgen generates c_ulong directly.
We want to ensure any size_t is translated to Rust usize so that we can avoid having them be different type on 32-bit and 64-bit architectures, and hence would require a lot of excessive type casts when calling FFI functions.
I found that this bindgen behavior (which probably is caused by libclang) can be disabled by -fno-builtin. Using the flag for compiled code can result in less optimisation because compiler cannot assume about their properties anymore, but this should not affect bindgen.
[ Trevor asked: "I wonder how reliable this behavior is. Maybe bindgen
could do a better job controlling this, is there an open issue?".
Gary replied: ..."apparently this is indeed the suggested approach in
https://github.com/rust-lang/rust-bindgen/issues/1770". - Miguel ]
--- rust/Makefile | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
rust/Makefile +5 -1
@@ -264,7 +264,11 @@ else bindgen_c_flags_lto = $(bindgen_c_flags) endif -bindgen_c_flags_final = $(bindgen_c_flags_lto) -D__BINDGEN__ +# `-fno-builtin` is passed to avoid `bindgen` from using `clang` builtin +# prototypes for functions like `memcpy` -- if this flag is not passed, +# `bindgen`-generated prototypes use `c_ulong` or `c_uint` depending on +# architecture instead of generating `usize`. +bindgen_c_flags_final = $(bindgen_c_flags_lto) -fno-builtin -D__BINDGEN__ # Each `bindgen` release may upgrade the list of Rust target versions. By # default, the highest stable release in their list is used. Thus we need to set
Patches currently in stable-queue which might be from [email protected] are
queue-6.12/drm-panic-avoid-reimplementing-iterator-find.patch queue-6.12/documentation-rust-add-coding-guidelines-on-lints.patch queue-6.12/rust-provide-proper-code-documentation-titles.patch queue-6.12/rust-alloc-make-allocator-module-public.patch queue-6.12/rust-alloc-remove-vecext-extension.patch queue-6.12/rust-alloc-implement-reallocfunc.patch queue-6.12/rust-alloc-separate-aligned_size-from-krealloc_aligned.patch queue-6.12/rust-enable-clippy-unnecessary_safety_comment-lint.patch queue-6.12/rust-alloc-update-module-comment-of-alloc.rs.patch queue-6.12/rust-kbuild-expand-rusttest-target-for-macros.patch queue-6.12/rust-error-use-core-alloc-layouterror.patch queue-6.12/rust-str-test-replace-alloc-format.patch queue-6.12/loongarch-use-asm_reachable.patch queue-6.12/rust-alloc-implement-allocator-for-kmalloc.patch queue-6.12/rust-alloc-implement-collect-for-intoiter.patch queue-6.12/rust-alloc-introduce-arraylayout.patch queue-6.12/rust-alloc-implement-vmalloc-allocator.patch queue-6.12/documentation-rust-discuss-in-the-guidelines.patch queue-6.12/rust-error-check-for-config-test-in-error-name.patch queue-6.12/rust-enable-clippy-ignored_unit_patterns-lint.patch queue-6.12/rust-enable-clippy-unnecessary_safety_doc-lint.patch queue-6.12/rust-alloc-add-box-to-prelude.patch queue-6.12/kbuild-rust-remove-the-alloc-crate-and-globalalloc.patch queue-6.12/rust-alloc-add-allocator-trait.patch queue-6.12/rust-treewide-switch-to-our-kernel-box-type.patch queue-6.12/rust-introduce-.clippy.toml.patch queue-6.12/rust-alloc-rename-kernelallocator-to-kmalloc.patch queue-6.12/rust-alloc-implement-cmalloc-in-module-allocator_test.patch queue-6.12/drm-panic-allow-verbose-version-check.patch queue-6.12/rust-map-__kernel_size_t-and-friends-also-to-usize-isize.patch queue-6.12/rust-alloc-add-module-allocator_test.patch queue-6.12/rust-replace-clippy-dbg_macro-with-disallowed_macros.patch queue-6.12/rust-alloc-add-__gfp_nowarn-to-flags.patch queue-6.12/rust-enable-clippy-s-check-private-items.patch queue-6.12/rust-error-make-conversion-functions-public.patch queue-6.12/rust-sort-global-rust-flags.patch queue-6.12/rust-alloc-implement-contains-for-flags.patch queue-6.12/rust-init-remove-unneeded.patch queue-6.12/rust-use-custom-ffi-integer-types.patch queue-6.12/rust-sync-remove-unneeded.patch queue-6.12/rust-treewide-switch-to-the-kernel-vec-type.patch queue-6.12/rust-alloc-implement-kvmalloc-allocator.patch queue-6.12/drm-panic-correctly-indent-continuation-of-line-in-list-item.patch queue-6.12/rust-alloc-implement-kernel-vec-type.patch queue-6.12/rust-workqueue-remove-unneeded.patch queue-6.12/rust-error-optimize-error-type-to-use-nonzero.patch queue-6.12/drm-panic-remove-unnecessary-borrow-in-alignment_pattern.patch queue-6.12/rust-alloc-remove-extension-of-std-s-box.patch queue-6.12/rust-block-fix-formatting-in-gendisk-doc.patch queue-6.12/rust-enable-rustdoc-unescaped_backticks-lint.patch queue-6.12/rust-fix-size_t-in-bindgen-prototypes-of-c-builtins.patch queue-6.12/rust-enable-clippy-undocumented_unsafe_blocks-lint.patch queue-6.12/rust-alloc-add-vec-to-prelude.patch queue-6.12/rust-alloc-implement-intoiterator-for-vec.patch queue-6.12/rust-alloc-implement-kernel-box.patch queue-6.12/drm-panic-remove-redundant-field-when-assigning-value.patch queue-6.12/rust-types-avoid-repetition-in-as-from-bytes-impls.patch queue-6.12/rust-start-using-the-attribute.patch queue-6.12/drm-panic-allow-verbose-boolean-for-clarity.patch queue-6.12/maintainers-add-entry-for-the-rust-alloc-module.patch queue-6.12/rust-alloc-fix-arraylayout-allocations.patch queue-6.12/drm-panic-prefer-eliding-lifetimes.patch
Miguel Ojeda
maintainerPATCH 58/60 rust: map `__kernel_size_t` and friends also to usize/isize
In reply to Miguel OjedaFrom: Gary Guo <[email protected]>
commit 2fd6f55c048d0c863ffbc8590b1bd2edb5ff13e5 upstream.
Currently bindgen has special logic to recognise size_t and ssize_t and map them to Rust usize and isize. Similarly, ptrdiff_t is mapped to isize.
However this falls short for __kernel_size_t, __kernel_ssize_t and __kernel_ptrdiff_t. To ensure that they are mapped to usize/isize rather than 32/64 integers depending on platform, blocklist them in bindgen parameters and manually provide their definition.
--- rust/bindgen_parameters | 5 +++++ rust/bindings/lib.rs | 5 +++++ rust/uapi/lib.rs | 5 +++++ 3 files changed, 15 insertions(+)
rust/bindgen_parameters +5 -0
@@ -1,5 +1,10 @@ # SPDX-License-Identifier: GPL-2.0 +# We want to map these types to `isize`/`usize` manually, instead of +# define them as `int`/`long` depending on platform bitwidth. +--blocklist-type __kernel_s?size_t +--blocklist-type __kernel_ptrdiff_t + --opaque-type xregs_state --opaque-type desc_struct --opaque-type arch_lbr_state
rust/bindings/lib.rs +5 -0
@@ -27,6 +27,11 @@#[allow(dead_code)] #[allow(clippy::undocumented_unsafe_blocks)] mod bindings_raw { +// Manual definition for blocklisted types. +type __kernel_size_t =usize ; +type __kernel_ssize_t =isize ; +type __kernel_ptrdiff_t =isize ; +// Use glob import here to expose all helpers. // Symbols defined within the module will take precedence to the glob import. pub use super ::bindings_helper::*;
rust/uapi/lib.rs +5 -0
@@ -25,4 +25,9 @@ unsafe_op_in_unsafe_fn )] +// Manual definition of blocklisted types. +type __kernel_size_t =usize ; +type __kernel_ssize_t =isize ; +type __kernel_ptrdiff_t =isize ; +include! (concat! (env! ("OBJTREE" ),"/rust/uapi/uapi_generated.rs" ));
Signature · 1 line
2.48.1
Patch "rust: map `__kernel_size_t` and friends also to usize/isize" has been added to the 6.12-stable tree
This is a note to let you know that I've just added the patch titled
rust: map __kernel_size_t and friends also to usize/isize
to the 6.12-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
rust-map-__kernel_size_t-and-friends-also-to-usize-isize.patch
and it can be found in the queue-6.12 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
From [email protected] Fri Mar 7 23:53:16 2025
From: Miguel Ojeda <[email protected]>
Date: Fri, 7 Mar 2025 23:50:05 +0100
Subject: rust: map __kernel_size_t and friends also to usize/isize
To: Greg Kroah-Hartman <[email protected]>, Sasha Levin <[email protected]>, [email protected]
Cc: Danilo Krummrich <[email protected]>, Alice Ryhl <[email protected]>, Alyssa Ross <[email protected]>, NoisyCoil <[email protected]>, [email protected], Miguel Ojeda <[email protected]>
Message-ID: <[email protected]>
From: Gary Guo <[email protected]>
commit 2fd6f55c048d0c863ffbc8590b1bd2edb5ff13e5 upstream.
Currently bindgen has special logic to recognise size_t and ssize_t and map them to Rust usize and isize. Similarly, ptrdiff_t is mapped to isize.
However this falls short for __kernel_size_t, __kernel_ssize_t and __kernel_ptrdiff_t. To ensure that they are mapped to usize/isize rather than 32/64 integers depending on platform, blocklist them in bindgen parameters and manually provide their definition.
--- rust/bindgen_parameters | 5 +++++ rust/bindings/lib.rs | 5 +++++ rust/uapi/lib.rs | 5 +++++ 3 files changed, 15 insertions(+)
rust/bindgen_parameters +5 -0
@@ -1,5 +1,10 @@ # SPDX-License-Identifier: GPL-2.0 +# We want to map these types to `isize`/`usize` manually, instead of +# define them as `int`/`long` depending on platform bitwidth. +--blocklist-type __kernel_s?size_t +--blocklist-type __kernel_ptrdiff_t + --opaque-type xregs_state --opaque-type desc_struct --opaque-type arch_lbr_state
rust/bindings/lib.rs +5 -0
@@ -27,6 +27,11 @@#[allow(dead_code)] #[allow(clippy::undocumented_unsafe_blocks)] mod bindings_raw { +// Manual definition for blocklisted types. +type __kernel_size_t =usize ; +type __kernel_ssize_t =isize ; +type __kernel_ptrdiff_t =isize ; +// Use glob import here to expose all helpers. // Symbols defined within the module will take precedence to the glob import. pub use super ::bindings_helper::*;
rust/uapi/lib.rs +5 -0
@@ -25,4 +25,9 @@ unsafe_op_in_unsafe_fn )] +// Manual definition of blocklisted types. +type __kernel_size_t =usize ; +type __kernel_ssize_t =isize ; +type __kernel_ptrdiff_t =isize ; +include! (concat! (env! ("OBJTREE" ),"/rust/uapi/uapi_generated.rs" ));
Patches currently in stable-queue which might be from [email protected] are
queue-6.12/drm-panic-avoid-reimplementing-iterator-find.patch queue-6.12/documentation-rust-add-coding-guidelines-on-lints.patch queue-6.12/rust-provide-proper-code-documentation-titles.patch queue-6.12/rust-alloc-make-allocator-module-public.patch queue-6.12/rust-alloc-remove-vecext-extension.patch queue-6.12/rust-alloc-implement-reallocfunc.patch queue-6.12/rust-alloc-separate-aligned_size-from-krealloc_aligned.patch queue-6.12/rust-enable-clippy-unnecessary_safety_comment-lint.patch queue-6.12/rust-alloc-update-module-comment-of-alloc.rs.patch queue-6.12/rust-kbuild-expand-rusttest-target-for-macros.patch queue-6.12/rust-error-use-core-alloc-layouterror.patch queue-6.12/rust-str-test-replace-alloc-format.patch queue-6.12/loongarch-use-asm_reachable.patch queue-6.12/rust-alloc-implement-allocator-for-kmalloc.patch queue-6.12/rust-alloc-implement-collect-for-intoiter.patch queue-6.12/rust-alloc-introduce-arraylayout.patch queue-6.12/rust-alloc-implement-vmalloc-allocator.patch queue-6.12/documentation-rust-discuss-in-the-guidelines.patch queue-6.12/rust-error-check-for-config-test-in-error-name.patch queue-6.12/rust-enable-clippy-ignored_unit_patterns-lint.patch queue-6.12/rust-enable-clippy-unnecessary_safety_doc-lint.patch queue-6.12/rust-alloc-add-box-to-prelude.patch queue-6.12/kbuild-rust-remove-the-alloc-crate-and-globalalloc.patch queue-6.12/rust-alloc-add-allocator-trait.patch queue-6.12/rust-treewide-switch-to-our-kernel-box-type.patch queue-6.12/rust-introduce-.clippy.toml.patch queue-6.12/rust-alloc-rename-kernelallocator-to-kmalloc.patch queue-6.12/rust-alloc-implement-cmalloc-in-module-allocator_test.patch queue-6.12/drm-panic-allow-verbose-version-check.patch queue-6.12/rust-map-__kernel_size_t-and-friends-also-to-usize-isize.patch queue-6.12/rust-alloc-add-module-allocator_test.patch queue-6.12/rust-replace-clippy-dbg_macro-with-disallowed_macros.patch queue-6.12/rust-alloc-add-__gfp_nowarn-to-flags.patch queue-6.12/rust-enable-clippy-s-check-private-items.patch queue-6.12/rust-error-make-conversion-functions-public.patch queue-6.12/rust-sort-global-rust-flags.patch queue-6.12/rust-alloc-implement-contains-for-flags.patch queue-6.12/rust-init-remove-unneeded.patch queue-6.12/rust-use-custom-ffi-integer-types.patch queue-6.12/rust-sync-remove-unneeded.patch queue-6.12/rust-treewide-switch-to-the-kernel-vec-type.patch queue-6.12/rust-alloc-implement-kvmalloc-allocator.patch queue-6.12/drm-panic-correctly-indent-continuation-of-line-in-list-item.patch queue-6.12/rust-alloc-implement-kernel-vec-type.patch queue-6.12/rust-workqueue-remove-unneeded.patch queue-6.12/rust-error-optimize-error-type-to-use-nonzero.patch queue-6.12/drm-panic-remove-unnecessary-borrow-in-alignment_pattern.patch queue-6.12/rust-alloc-remove-extension-of-std-s-box.patch queue-6.12/rust-block-fix-formatting-in-gendisk-doc.patch queue-6.12/rust-enable-rustdoc-unescaped_backticks-lint.patch queue-6.12/rust-fix-size_t-in-bindgen-prototypes-of-c-builtins.patch queue-6.12/rust-enable-clippy-undocumented_unsafe_blocks-lint.patch queue-6.12/rust-alloc-add-vec-to-prelude.patch queue-6.12/rust-alloc-implement-intoiterator-for-vec.patch queue-6.12/rust-alloc-implement-kernel-box.patch queue-6.12/drm-panic-remove-redundant-field-when-assigning-value.patch queue-6.12/rust-types-avoid-repetition-in-as-from-bytes-impls.patch queue-6.12/rust-start-using-the-attribute.patch queue-6.12/drm-panic-allow-verbose-boolean-for-clarity.patch queue-6.12/maintainers-add-entry-for-the-rust-alloc-module.patch queue-6.12/rust-alloc-fix-arraylayout-allocations.patch queue-6.12/drm-panic-prefer-eliding-lifetimes.patch
Miguel Ojeda
maintainerPATCH 59/60 rust: use custom FFI integer types
In reply to Miguel OjedaFrom: Gary Guo <[email protected]>
commit d072acda4862f095ec9056979b654cc06a22cc68 upstream.
Currently FFI integer types are defined in libcore. This commit creates the ffi crate and asks bindgen to use that crate for FFI integer types instead of core::ffi.
This commit is preparatory and no type changes are made in this commit yet.
[ Added rustdoc, rusttest and KUnit tests support. Rebased on top of
rust-next (e.g. migrated more core::ffi cases). Reworded crate docs slightly and formatted. - Miguel ]
--- rust/Makefile | 39 +++++++++++++++++++---------- rust/ffi.rs | 13 ++++++++++ rust/kernel/alloc/allocator.rs | 2 +- rust/kernel/alloc/allocator_test.rs | 4 +-- rust/kernel/alloc/kbox.rs | 12 ++++----- rust/kernel/block/mq/operations.rs | 18 ++++++------- rust/kernel/block/mq/raw_writer.rs | 2 +- rust/kernel/block/mq/tag_set.rs | 2 +- rust/kernel/error.rs | 20 +++++++-------- rust/kernel/init.rs | 2 +- rust/kernel/lib.rs | 2 ++ rust/kernel/net/phy.rs | 16 ++++++------ rust/kernel/str.rs | 4 +-- rust/kernel/sync/arc.rs | 6 ++--- rust/kernel/sync/condvar.rs | 2 +- rust/kernel/sync/lock.rs | 2 +- rust/kernel/sync/lock/mutex.rs | 2 +- rust/kernel/sync/lock/spinlock.rs | 2 +- rust/kernel/task.rs | 8 ++---- rust/kernel/time.rs | 4 +-- rust/kernel/types.rs | 14 +++++------ rust/kernel/uaccess.rs | 6 ++--- rust/macros/module.rs | 8 +++--- 23 files changed, 107 insertions(+), 83 deletions(-) create mode 100644 rust/ffi.rs
rust/Makefile +26 -13
@@ -3,7 +3,7 @@ # Where to place rustdoc generated documentation rustdoc_output := $(objtree)/Documentation/output/rust/rustdoc -obj-$(CONFIG_RUST) += core.o compiler_builtins.o +obj-$(CONFIG_RUST) += core.o compiler_builtins.o ffi.o always-$(CONFIG_RUST) += exports_core_generated.h # Missing prototypes are expected in the helpers since these are exported
@@ -103,10 +103,13 @@ rustdoc-core: $(RUST_LIB_SRC)/core/src/lib.rs FORCE rustdoc-compiler_builtins: $(src)/compiler_builtins.rs rustdoc-core FORCE +$(call if_changed,rustdoc) -rustdoc-kernel: private rustc_target_flags = \ +rustdoc-ffi: $(src)/ffi.rs rustdoc-core FORCE + +$(call if_changed,rustdoc) + +rustdoc-kernel: private rustc_target_flags = --extern ffi \ --extern build_error --extern macros=$(objtree)/$(obj)/libmacros.so \ --extern bindings --extern uapi -rustdoc-kernel: $(src)/kernel/lib.rs rustdoc-core rustdoc-macros \ +rustdoc-kernel: $(src)/kernel/lib.rs rustdoc-core rustdoc-ffi rustdoc-macros \ rustdoc-compiler_builtins $(obj)/libmacros.so \ $(obj)/bindings.o FORCE +$(call if_changed,rustdoc)
@@ -124,12 +127,15 @@ quiet_cmd_rustc_test_library = RUSTC TL $< rusttestlib-build_error: $(src)/build_error.rs FORCE +$(call if_changed,rustc_test_library) +rusttestlib-ffi: $(src)/ffi.rs FORCE + +$(call if_changed,rustc_test_library) + rusttestlib-macros: private rustc_target_flags = --extern proc_macro rusttestlib-macros: private rustc_test_library_proc = yes rusttestlib-macros: $(src)/macros/lib.rs FORCE +$(call if_changed,rustc_test_library) -rusttestlib-kernel: private rustc_target_flags = \ +rusttestlib-kernel: private rustc_target_flags = --extern ffi \ --extern build_error --extern macros \ --extern bindings --extern uapi rusttestlib-kernel: $(src)/kernel/lib.rs \
@@ -137,10 +143,12 @@ rusttestlib-kernel: $(src)/kernel/lib.rs \ $(obj)/libmacros.so $(obj)/bindings.o FORCE +$(call if_changed,rustc_test_library) -rusttestlib-bindings: $(src)/bindings/lib.rs FORCE +rusttestlib-bindings: private rustc_target_flags = --extern ffi +rusttestlib-bindings: $(src)/bindings/lib.rs rusttestlib-ffi FORCE +$(call if_changed,rustc_test_library) -rusttestlib-uapi: $(src)/uapi/lib.rs FORCE +rusttestlib-uapi: private rustc_target_flags = --extern ffi +rusttestlib-uapi: $(src)/uapi/lib.rs rusttestlib-ffi FORCE +$(call if_changed,rustc_test_library) quiet_cmd_rustdoc_test = RUSTDOC T $<
@@ -159,7 +167,7 @@ quiet_cmd_rustdoc_test_kernel = RUSTDOC TK $< mkdir -p $(objtree)/$(obj)/test/doctests/kernel; \ OBJTREE=$(abspath $(objtree)) \ $(RUSTDOC) --test $(rust_flags) \ - -L$(objtree)/$(obj) --extern kernel \ + -L$(objtree)/$(obj) --extern ffi --extern kernel \ --extern build_error --extern macros \ --extern bindings --extern uapi \ --no-run --crate-name kernel -Zunstable-options \
@@ -197,9 +205,9 @@ rusttest-macros: $(src)/macros/lib.rs \ +$(call if_changed,rustc_test) +$(call if_changed,rustdoc_test) -rusttest-kernel: private rustc_target_flags = \ +rusttest-kernel: private rustc_target_flags = --extern ffi \ --extern build_error --extern macros --extern bindings --extern uapi -rusttest-kernel: $(src)/kernel/lib.rs rusttestlib-kernel \ +rusttest-kernel: $(src)/kernel/lib.rs rusttestlib-ffi rusttestlib-kernel \ rusttestlib-build_error rusttestlib-macros rusttestlib-bindings \ rusttestlib-uapi FORCE +$(call if_changed,rustc_test)
@@ -286,7 +294,7 @@ bindgen_c_flags_final = $(bindgen_c_flags_lto) -fno-builtin -D__BINDGEN__ quiet_cmd_bindgen = BINDGEN $@ cmd_bindgen = \ $(BINDGEN) $< $(bindgen_target_flags) --rust-target 1.68 \ - --use-core --with-derive-default --ctypes-prefix core::ffi --no-layout-tests \ + --use-core --with-derive-default --ctypes-prefix ffi --no-layout-tests \ --no-debug '.*' --enable-function-attribute-detection \ -o $@ -- $(bindgen_c_flags_final) -DMODULE \ $(bindgen_target_cflags) $(bindgen_target_extra)
@@ -414,18 +422,23 @@ $(obj)/compiler_builtins.o: $(src)/compiler_builtins.rs $(obj)/core.o FORCE $(obj)/build_error.o: $(src)/build_error.rs $(obj)/compiler_builtins.o FORCE +$(call if_changed_rule,rustc_library) +$(obj)/ffi.o: $(src)/ffi.rs $(obj)/compiler_builtins.o FORCE + +$(call if_changed_rule,rustc_library) + +$(obj)/bindings.o: private rustc_target_flags = --extern ffi $(obj)/bindings.o: $(src)/bindings/lib.rs \ - $(obj)/compiler_builtins.o \ + $(obj)/ffi.o \ $(obj)/bindings/bindings_generated.rs \ $(obj)/bindings/bindings_helpers_generated.rs FORCE +$(call if_changed_rule,rustc_library) +$(obj)/uapi.o: private rustc_target_flags = --extern ffi $(obj)/uapi.o: $(src)/uapi/lib.rs \ - $(obj)/compiler_builtins.o \ + $(obj)/ffi.o \ $(obj)/uapi/uapi_generated.rs FORCE +$(call if_changed_rule,rustc_library) -$(obj)/kernel.o: private rustc_target_flags = \ +$(obj)/kernel.o: private rustc_target_flags = --extern ffi \ --extern build_error --extern macros --extern bindings --extern uapi $(obj)/kernel.o: $(src)/kernel/lib.rs $(obj)/build_error.o \ $(obj)/libmacros.so $(obj)/bindings.o $(obj)/uapi.o FORCE
rust/ffi.rs new file +13 -0
@@ -0,0 +1,13 @@ +// SPDX-License-Identifier: GPL-2.0 + +//! Foreign function interface (FFI) types. +//! +//! This crate provides mapping from C primitive types to Rust ones. +//! +//! The Rust [`core`] crate provides [`core::ffi`], which maps integer types to the platform default +//! C ABI. The kernel does not use [`core::ffi`], so it can customise the mapping that deviates from +//! the platform default. + +#![no_std] + +pub use core::ffi::*;
rust/kernel/alloc/allocator.rs +1 -1
@@ -58,7 +58,7 @@ fn aligned_size(new_layout: Layout) -> usize {/// /// One of the following: `krealloc`, `vrealloc`, `kvrealloc`. struct ReallocFunc ( -unsafe extern "C" fn (*const core::ffi::c_void ,usize ,u32 ) -> *mut core::ffi::c_void , +unsafe extern "C" fn (*const crate ::ffi::c_void ,usize ,u32 ) -> *mut crate ::ffi::c_void , );impl ReallocFunc {
rust/kernel/alloc/allocator_test.rs +2 -2
@@ -24,10 +24,10 @@extern "C" {#[link_name = "aligned_alloc" ] -fn libc_aligned_alloc (align:usize , size:usize ) -> *mut core::ffi::c_void ; +fn libc_aligned_alloc (align:usize , size:usize ) -> *mut crate ::ffi::c_void ;#[link_name = "free" ] -fn libc_free (ptr: *mut core::ffi::c_void ); +fn libc_free (ptr: *mut crate ::ffi::c_void ); }// SAFETY:
rust/kernel/alloc/kbox.rs +6 -6
@@ -355,17 +355,17 @@ impl<T: 'static, A> ForeignOwnable for Box<T, A> {type Borrowed <'a> = &'aT ; -fn into_foreign (self) -> *const core::ffi::c_void { +fn into_foreign (self) -> *const crate ::ffi::c_void {Box ::into_raw (self)as _ } -unsafe fn from_foreign (ptr: *const core::ffi::c_void ) ->Self { +unsafe fn from_foreign (ptr: *const crate ::ffi::c_void ) ->Self {// SAFETY: The safety requirements of this function ensure that `ptr` comes from a previous // call to `Self::into_foreign`. unsafe {Box ::from_raw (ptras _ ) } } -unsafe fn borrow <'a>(ptr: *const core::ffi::c_void ) -> &'aT { +unsafe fn borrow <'a>(ptr: *const crate ::ffi::c_void ) -> &'aT {// SAFETY: The safety requirements of this method ensure that the object remains alive and // immutable for the duration of 'a. unsafe { &*ptr.cast () }
@@ -378,18 +378,18 @@ impl<T: 'static, A> ForeignOwnable for Pin<Box<T, A>> {type Borrowed <'a> =Pin <&'aT >; -fn into_foreign (self) -> *const core::ffi::c_void { +fn into_foreign (self) -> *const crate ::ffi::c_void {// SAFETY: We are still treating the box as pinned. Box ::into_raw (unsafe {Pin ::into_inner_unchecked (self) })as _ } -unsafe fn from_foreign (ptr: *const core::ffi::c_void ) ->Self { +unsafe fn from_foreign (ptr: *const crate ::ffi::c_void ) ->Self {// SAFETY: The safety requirements of this function ensure that `ptr` comes from a previous // call to `Self::into_foreign`. unsafe {Pin ::new_unchecked (Box ::from_raw (ptras _ )) } } -unsafe fn borrow <'a>(ptr: *const core::ffi::c_void ) ->Pin <&'aT > { +unsafe fn borrow <'a>(ptr: *const crate ::ffi::c_void ) ->Pin <&'aT > {// SAFETY: The safety requirements for this function ensure that the object is still alive, // so it is safe to dereference the raw pointer. // The safety requirements of `from_foreign` also ensure that the object remains alive for
rust/kernel/block/mq/operations.rs +9 -9
@@ -131,7 +131,7 @@ impl<T: Operations> OperationsVTable<T> {unsafe extern "C" fn poll_callback ( _hctx: *mut bindings::blk_mq_hw_ctx , _iob: *mut bindings::io_comp_batch , - ) -> core::ffi::c_int { + ) ->crate ::ffi::c_int {T ::poll ().into () }
@@ -145,9 +145,9 @@ impl<T: Operations> OperationsVTable<T> {/// for the same context. unsafe extern "C" fn init_hctx_callback ( _hctx: *mut bindings::blk_mq_hw_ctx , - _tagset_data: *mut core::ffi::c_void , - _hctx_idx: core::ffi::c_uint , - ) -> core::ffi::c_int { + _tagset_data: *mut crate ::ffi::c_void , + _hctx_idx:crate ::ffi::c_uint , + ) ->crate ::ffi::c_int {from_result (||Ok (0 )) }
@@ -159,7 +159,7 @@ impl<T: Operations> OperationsVTable<T> {/// This function may only be called by blk-mq C infrastructure. unsafe extern "C" fn exit_hctx_callback ( _hctx: *mut bindings::blk_mq_hw_ctx , - _hctx_idx: core::ffi::c_uint , + _hctx_idx:crate ::ffi::c_uint , ) { }
@@ -176,9 +176,9 @@ impl<T: Operations> OperationsVTable<T> {unsafe extern "C" fn init_request_callback ( _set: *mut bindings::blk_mq_tag_set , rq: *mut bindings::request , - _hctx_idx: core::ffi::c_uint , - _numa_node: core::ffi::c_uint , - ) -> core::ffi::c_int { + _hctx_idx:crate ::ffi::c_uint , + _numa_node:crate ::ffi::c_uint , + ) ->crate ::ffi::c_int {from_result (|| {// SAFETY: By the safety requirements of this function, `rq` points // to a valid allocation.
@@ -203,7 +203,7 @@ impl<T: Operations> OperationsVTable<T> {unsafe extern "C" fn exit_request_callback ( _set: *mut bindings::blk_mq_tag_set , rq: *mut bindings::request , - _hctx_idx: core::ffi::c_uint , + _hctx_idx:crate ::ffi::c_uint , ) {// SAFETY: The tagset invariants guarantee that all requests are allocated with extra memory // for the request data.
rust/kernel/block/mq/raw_writer.rs +1 -1
@@ -25,7 +25,7 @@ fn new(buffer: &'a mut [u8]) -> Result<RawWriter<'a>> { }pub (crate )fn from_array <const N :usize >( - a: &'amut [core::ffi::c_char ;N ], + a: &'amut [crate ::ffi::c_char ;N ], ) ->Result <RawWriter <'a>> { Self::new(// SAFETY: the buffer of `a` is valid for read and write as `u8` for
rust/kernel/block/mq/tag_set.rs +1 -1
@@ -53,7 +53,7 @@ pub fn new( queue_depth: num_tags, cmd_size, flags: bindings::BLK_MQ_F_SHOULD_MERGE, - driver_data: core::ptr::null_mut::<core::ffi::c_void>(), + driver_data: core::ptr::null_mut::<crate::ffi::c_void>(), nr_maps: num_maps, ..tag_set }
rust/kernel/error.rs +10 -10
@@ -100,7 +100,7 @@ impl Error {/// /// It is a bug to pass an out-of-range `errno`. `EINVAL` would /// be returned in such a case. -pub fn from_errno (errno: core::ffi::c_int ) ->Error { +pub fn from_errno (errno:crate ::ffi::c_int ) ->Error {if errno < -(bindings::MAX_ERRNO as i32 ) || errno >=0 {// TODO: Make it a `WARN_ONCE` once available. crate ::pr_warn!(
@@ -119,7 +119,7 @@ pub fn from_errno(errno: core::ffi::c_int) -> Error {/// Creates an [`Error`] from a kernel error code. /// /// Returns [`None`] if `errno` is out-of-range. -const fn try_from_errno (errno: core::ffi::c_int ) ->Option <Error > { +const fn try_from_errno (errno:crate ::ffi::c_int ) ->Option <Error > {if errno < -(bindings::MAX_ERRNO as i32 ) || errno >=0 {return None ; }
@@ -133,7 +133,7 @@ const fn try_from_errno(errno: core::ffi::c_int) -> Option<Error> {/// # Safety /// /// `errno` must be within error code range (i.e. `>= -MAX_ERRNO && < 0`). -const unsafe fn from_errno_unchecked (errno: core::ffi::c_int ) ->Error { +const unsafe fn from_errno_unchecked (errno:crate ::ffi::c_int ) ->Error {// INVARIANT: The contract ensures the type invariant // will hold. // SAFETY: The caller guarantees `errno` is non-zero.
@@ -141,7 +141,7 @@ const fn try_from_errno(errno: core::ffi::c_int) -> Option<Error> { }/// Returns the kernel error code. -pub fn to_errno (self) -> core::ffi::c_int { +pub fn to_errno (self) ->crate ::ffi::c_int { self.0 .get () }
@@ -259,7 +259,7 @@ fn from(e: core::convert::Infallible) -> Error {/// Converts an integer as returned by a C kernel function to an error if it's negative, and /// `Ok(())` otherwise. -pub fn to_result (err: core::ffi::c_int ) ->Result { +pub fn to_result (err:crate ::ffi::c_int ) ->Result {if err <0 {Err (Error ::from_errno (err)) }else {
@@ -282,15 +282,15 @@ pub fn to_result(err: core::ffi::c_int) -> Result {/// fn devm_platform_ioremap_resource( /// pdev: &mut PlatformDevice, /// index: u32, -/// ) -> Result<*mut core::ffi::c_void> { +/// ) -> Result<*mut kernel::ffi::c_void> { /// // SAFETY: `pdev` points to a valid platform device. There are no safety requirements /// // on `index`. /// from_err_ptr(unsafe { bindings::devm_platform_ioremap_resource(pdev.to_ptr(), index) }) /// } /// ``` pub fn from_err_ptr <T >(ptr: *mut T ) ->Result <*mut T > { -// CAST: Casting a pointer to `*const core::ffi::c_void` is always valid. -let const_ptr: *const core::ffi::c_void = ptr.cast (); +// CAST: Casting a pointer to `*const crate::ffi::c_void` is always valid. +let const_ptr: *const crate ::ffi::c_void = ptr.cast ();// SAFETY: The FFI function does not deref the pointer. if unsafe { bindings::IS_ERR (const_ptr) } {// SAFETY: The FFI function does not deref the pointer.
@@ -306,7 +306,7 @@ pub fn from_err_ptr<T>(ptr: *mut T) -> Result<*mut T> {// // SAFETY: `IS_ERR()` ensures `err` is a // negative value greater-or-equal to `-bindings::MAX_ERRNO`. -return Err (unsafe {Error ::from_errno_unchecked (erras core::ffi::c_int ) }); +return Err (unsafe {Error ::from_errno_unchecked (erras crate ::ffi::c_int ) }); }Ok (ptr) }
@@ -326,7 +326,7 @@ pub fn from_err_ptr<T>(ptr: *mut T) -> Result<*mut T> {/// # use kernel::bindings; /// unsafe extern "C" fn probe_callback( /// pdev: *mut bindings::platform_device, -/// ) -> core::ffi::c_int { +/// ) -> kernel::ffi::c_int { /// from_result(|| { /// let ptr = devm_alloc(pdev)?; /// bindings::platform_set_drvdata(pdev, ptr);
rust/kernel/init.rs +1 -1
@@ -133,7 +133,7 @@//! # } //! # // `Error::from_errno` is `pub(crate)` in the `kernel` crate, thus provide a workaround. //! # trait FromErrno { -//! # fn from_errno(errno: core::ffi::c_int) -> Error { +//! # fn from_errno(errno: kernel::ffi::c_int) -> Error { //! # // Dummy error that can be constructed outside the `kernel` crate. //! # Error::from(core::fmt::Error) //! # }
rust/kernel/lib.rs +2 -0
@@ -27,6 +27,8 @@// Allow proc-macros to refer to `::kernel` inside the `kernel` crate (this crate). extern crate selfas kernel; +pub use ffi; +pub mod alloc;#[cfg( CONFIG_BLOCK )] pub mod block;
rust/kernel/net/phy.rs +8 -8
@@ -314,7 +314,7 @@ impl<T: Driver> Adapter<T> {/// `phydev` must be passed by the corresponding callback in `phy_driver`. unsafe extern "C" fn soft_reset_callback ( phydev: *mut bindings::phy_device , - ) -> core::ffi::c_int { + ) ->crate ::ffi::c_int {from_result (|| {// SAFETY: This callback is called only in contexts // where we hold `phy_device->lock`, so the accessors on
@@ -328,7 +328,7 @@ impl<T: Driver> Adapter<T> {/// # Safety /// /// `phydev` must be passed by the corresponding callback in `phy_driver`. -unsafe extern "C" fn probe_callback (phydev: *mut bindings::phy_device ) -> core::ffi::c_int { +unsafe extern "C" fn probe_callback (phydev: *mut bindings::phy_device ) ->crate ::ffi::c_int {from_result (|| {// SAFETY: This callback is called only in contexts // where we can exclusively access `phy_device` because
@@ -345,7 +345,7 @@ impl<T: Driver> Adapter<T> {/// `phydev` must be passed by the corresponding callback in `phy_driver`. unsafe extern "C" fn get_features_callback ( phydev: *mut bindings::phy_device , - ) -> core::ffi::c_int { + ) ->crate ::ffi::c_int {from_result (|| {// SAFETY: This callback is called only in contexts // where we hold `phy_device->lock`, so the accessors on
@@ -359,7 +359,7 @@ impl<T: Driver> Adapter<T> {/// # Safety /// /// `phydev` must be passed by the corresponding callback in `phy_driver`. -unsafe extern "C" fn suspend_callback (phydev: *mut bindings::phy_device ) -> core::ffi::c_int { +unsafe extern "C" fn suspend_callback (phydev: *mut bindings::phy_device ) ->crate ::ffi::c_int {from_result (|| {// SAFETY: The C core code ensures that the accessors on // `Device` are okay to call even though `phy_device->lock`
@@ -373,7 +373,7 @@ impl<T: Driver> Adapter<T> {/// # Safety /// /// `phydev` must be passed by the corresponding callback in `phy_driver`. -unsafe extern "C" fn resume_callback (phydev: *mut bindings::phy_device ) -> core::ffi::c_int { +unsafe extern "C" fn resume_callback (phydev: *mut bindings::phy_device ) ->crate ::ffi::c_int {from_result (|| {// SAFETY: The C core code ensures that the accessors on // `Device` are okay to call even though `phy_device->lock`
@@ -389,7 +389,7 @@ impl<T: Driver> Adapter<T> {/// `phydev` must be passed by the corresponding callback in `phy_driver`. unsafe extern "C" fn config_aneg_callback ( phydev: *mut bindings::phy_device , - ) -> core::ffi::c_int { + ) ->crate ::ffi::c_int {from_result (|| {// SAFETY: This callback is called only in contexts // where we hold `phy_device->lock`, so the accessors on
@@ -405,7 +405,7 @@ impl<T: Driver> Adapter<T> {/// `phydev` must be passed by the corresponding callback in `phy_driver`. unsafe extern "C" fn read_status_callback ( phydev: *mut bindings::phy_device , - ) -> core::ffi::c_int { + ) ->crate ::ffi::c_int {from_result (|| {// SAFETY: This callback is called only in contexts // where we hold `phy_device->lock`, so the accessors on
@@ -421,7 +421,7 @@ impl<T: Driver> Adapter<T> {/// `phydev` must be passed by the corresponding callback in `phy_driver`. unsafe extern "C" fn match_phy_device_callback ( phydev: *mut bindings::phy_device , - ) -> core::ffi::c_int { + ) ->crate ::ffi::c_int {// SAFETY: This callback is called only in contexts // where we hold `phy_device->lock`, so the accessors on // `Device` are okay to call.
rust/kernel/str.rs +2 -2
@@ -184,7 +184,7 @@ pub const fn is_empty(&self) -> bool {/// last at least `'a`. When `CStr` is alive, the memory pointed by `ptr` /// must not be mutated. #[inline] -pub unsafe fn from_char_ptr <'a>(ptr: *const core::ffi::c_char ) -> &'aSelf { +pub unsafe fn from_char_ptr <'a>(ptr: *const crate ::ffi::c_char ) -> &'aSelf {// SAFETY: The safety precondition guarantees `ptr` is a valid pointer // to a `NUL`-terminated C string. let len =unsafe { bindings::strlen (ptr) } +1 ;
@@ -247,7 +247,7 @@ pub unsafe fn from_bytes_with_nul_unchecked_mut(bytes: &mut [u8]) -> &mut CStr {/// Returns a C pointer to the string. #[inline] -pub const fn as_char_ptr (&self) -> *const core::ffi::c_char { +pub const fn as_char_ptr (&self) -> *const crate ::ffi::c_char { self.0 .as_ptr ()as _ }
rust/kernel/sync/arc.rs +3 -3
@@ -332,11 +332,11 @@ pub fn into_unique_or_drop(self) -> Option<Pin<UniqueArc<T>>> {impl <T : 'static>ForeignOwnable for Arc <T > {type Borrowed <'a> =ArcBorrow <'a,T >; -fn into_foreign (self) -> *const core::ffi::c_void { +fn into_foreign (self) -> *const crate ::ffi::c_void {ManuallyDrop ::new (self).ptr.as_ptr ()as _ } -unsafe fn borrow <'a>(ptr: *const core::ffi::c_void ) ->ArcBorrow <'a,T > { +unsafe fn borrow <'a>(ptr: *const crate ::ffi::c_void ) ->ArcBorrow <'a,T > {// By the safety requirement of this function, we know that `ptr` came from // a previous call to `Arc::into_foreign`. let inner =NonNull ::new (ptras *mut ArcInner <T >).unwrap ();
@@ -346,7 +346,7 @@ unsafe fn borrow<'a>(ptr: *const core::ffi::c_void) -> ArcBorrow<'a, T> {unsafe {ArcBorrow ::new (inner) } } -unsafe fn from_foreign (ptr: *const core::ffi::c_void ) ->Self { +unsafe fn from_foreign (ptr: *const crate ::ffi::c_void ) ->Self {// SAFETY: By the safety requirement of this function, we know that `ptr` came from // a previous call to `Arc::into_foreign`, which guarantees that `ptr` is valid and // holds a reference count increment that is transferrable to us.
rust/kernel/sync/condvar.rs +1 -1
@@ -7,6 +7,7 @@use super ::{lock::Backend , lock::Guard ,LockClassKey };use crate ::{ + ffi::{c_int, c_long}, init::PinInit , pin_init, str::CStr ,
@@ -14,7 +15,6 @@ time::Jiffies, types::Opaque, }; -use core::ffi::{c_int, c_long};use core::marker::PhantomPinned ;use core::ptr;use macros::pin_data;
rust/kernel/sync/lock.rs +1 -1
@@ -46,7 +46,7 @@ pub unsafe trait Backend {/// remain valid for read indefinitely. unsafe fn init ( ptr: *mut Self ::State , - name: *const core::ffi::c_char , + name: *const crate ::ffi::c_char , key: *mut bindings::lock_class_key , );
rust/kernel/sync/lock/mutex.rs +1 -1
@@ -96,7 +96,7 @@ unsafe impl super::Backend for MutexBackend {unsafe fn init ( ptr: *mut Self ::State , - name: *const core::ffi::c_char , + name: *const crate ::ffi::c_char , key: *mut bindings::lock_class_key , ) {// SAFETY: The safety requirements ensure that `ptr` is valid for writes, and `name` and
rust/kernel/sync/lock/spinlock.rs +1 -1
@@ -95,7 +95,7 @@ unsafe impl super::Backend for SpinLockBackend {unsafe fn init ( ptr: *mut Self ::State , - name: *const core::ffi::c_char , + name: *const crate ::ffi::c_char , key: *mut bindings::lock_class_key , ) {// SAFETY: The safety requirements ensure that `ptr` is valid for writes, and `name` and
rust/kernel/task.rs +2 -6
@@ -4,13 +4,9 @@//! //! C header: [`include/linux/sched.h`](srctree/include/linux/sched.h). +use crate ::ffi::{c_int, c_long, c_uint};use crate ::types::Opaque ; -use core::{ - ffi::{c_int, c_long, c_uint}, - marker::PhantomData , - ops::Deref , - ptr, -}; +use core::{marker::PhantomData , ops::Deref , ptr};/// A sentinel value used for infinite timeouts. pub const MAX_SCHEDULE_TIMEOUT :c_long = c_long::MAX ;
rust/kernel/time.rs +2 -2
@@ -12,10 +12,10 @@pub const NSEC_PER_MSEC :i64 = bindings::NSEC_PER_MSEC as i64 ;/// The time unit of Linux kernel. One jiffy equals (1/HZ) second. -pub type Jiffies = core::ffi::c_ulong ; +pub type Jiffies =crate ::ffi::c_ulong ;/// The millisecond time unit. -pub type Msecs = core::ffi::c_uint ; +pub type Msecs =crate ::ffi::c_uint ;/// Converts milliseconds to jiffies. #[inline]
rust/kernel/types.rs +7 -7
@@ -29,7 +29,7 @@ pub trait ForeignOwnable: Sized {/// For example, it might be invalid, dangling or pointing to uninitialized memory. Using it in /// any way except for [`ForeignOwnable::from_foreign`], [`ForeignOwnable::borrow`], /// [`ForeignOwnable::try_from_foreign`] can result in undefined behavior. -fn into_foreign (self) -> *const core::ffi::c_void ; +fn into_foreign (self) -> *const crate ::ffi::c_void ;/// Borrows a foreign-owned object. ///
@@ -37,7 +37,7 @@ pub trait ForeignOwnable: Sized {/// /// `ptr` must have been returned by a previous call to [`ForeignOwnable::into_foreign`] for /// which a previous matching [`ForeignOwnable::from_foreign`] hasn't been called yet. -unsafe fn borrow <'a>(ptr: *const core::ffi::c_void ) ->Self ::Borrowed <'a>; +unsafe fn borrow <'a>(ptr: *const crate ::ffi::c_void ) ->Self ::Borrowed <'a>;/// Converts a foreign-owned object back to a Rust-owned one. ///
@@ -47,7 +47,7 @@ pub trait ForeignOwnable: Sized {/// which a previous matching [`ForeignOwnable::from_foreign`] hasn't been called yet. /// Additionally, all instances (if any) of values returned by [`ForeignOwnable::borrow`] for /// this object must have been dropped. -unsafe fn from_foreign (ptr: *const core::ffi::c_void ) ->Self ; +unsafe fn from_foreign (ptr: *const crate ::ffi::c_void ) ->Self ;/// Tries to convert a foreign-owned object back to a Rust-owned one. ///
@@ -58,7 +58,7 @@ pub trait ForeignOwnable: Sized {/// /// `ptr` must either be null or satisfy the safety requirements for /// [`ForeignOwnable::from_foreign`]. -unsafe fn try_from_foreign (ptr: *const core::ffi::c_void ) ->Option <Self > { +unsafe fn try_from_foreign (ptr: *const crate ::ffi::c_void ) ->Option <Self > {if ptr.is_null () {None }else {
@@ -72,13 +72,13 @@ unsafe fn try_from_foreign(ptr: *const core::ffi::c_void) -> Option<Self> {impl ForeignOwnable for () {type Borrowed <'a> = (); -fn into_foreign (self) -> *const core::ffi::c_void { +fn into_foreign (self) -> *const crate ::ffi::c_void { core::ptr::NonNull ::dangling ().as_ptr () } -unsafe fn borrow <'a>(_: *const core::ffi::c_void ) ->Self ::Borrowed <'a> {} +unsafe fn borrow <'a>(_: *const crate ::ffi::c_void ) ->Self ::Borrowed <'a> {} -unsafe fn from_foreign (_: *const core::ffi::c_void ) ->Self {} +unsafe fn from_foreign (_: *const crate ::ffi::c_void ) ->Self {} }/// Runs a cleanup function/closure when dropped.
rust/kernel/uaccess.rs +3 -3
@@ -8,10 +8,10 @@ alloc::Flags, bindings, error::Result, + ffi::{c_ulong, c_void}, prelude::*, types::{AsBytes, FromBytes}, }; -use core::ffi::{c_ulong, c_void};use core::mem::{size_of,MaybeUninit };/// The type used for userspace addresses.
@@ -45,7 +45,7 @@/// every byte in the region. /// /// ```no_run -/// use core::ffi::c_void; +/// use kernel::ffi::c_void; /// use kernel::error::Result; /// use kernel::uaccess::{UserPtr, UserSlice}; ///
@@ -67,7 +67,7 @@/// Example illustrating a TOCTOU (time-of-check to time-of-use) bug. /// /// ```no_run -/// use core::ffi::c_void; +/// use kernel::ffi::c_void; /// use kernel::error::{code::EINVAL, Result}; /// use kernel::uaccess::{UserPtr, UserSlice}; ///
rust/macros/module.rs +4 -4
@@ -253,7 +253,7 @@ mod __module_init {{#[doc(hidden)] #[no_mangle] #[link_section = \".init.text\"] - pub unsafe extern \"C\" fn init_module() -> core::ffi::c_int {{ + pub unsafe extern \"C\" fn init_module() -> kernel::ffi::c_int {{ // SAFETY: This function is inaccessible to the outside due to the double // module wrapping it. It is called exactly once by the C side via its // unique name.
@@ -292,7 +292,7 @@ mod __module_init {{#[doc(hidden)] #[link_section = \"{initcall_section}\"] #[used] - pub static __{name}_initcall: extern \"C\" fn() -> core::ffi::c_int = __{name}_init; + pub static __{name}_initcall: extern \"C\" fn() -> kernel::ffi::c_int = __{name}_init; #[cfg(not(MODULE))] #[cfg(CONFIG_HAVE_ARCH_PREL32_RELOCATIONS)]
@@ -307,7 +307,7 @@ mod __module_init {{#[cfg(not( MODULE ))] #[doc(hidden)] #[no_mangle] - pub extern \"C\" fn __{name}_init() -> core::ffi::c_int {{ + pub extern \"C\" fn __{name}_init() -> kernel::ffi::c_int {{ // SAFETY: This function is inaccessible to the outside due to the double // module wrapping it. It is called exactly once by the C side via its // placement above in the initcall section.
@@ -330,7 +330,7 @@ mod __module_init {{/// # Safety /// /// This function must only be called once. -unsafe fn __init () -> core::ffi::c_int {{ +unsafe fn __init () -> kernel::ffi::c_int {{ match <{type_} as kernel::Module>::init(&super::super::THIS_MODULE) {{Ok (m) => {{// SAFETY: No data race, since `__MOD` can only be accessed by this
Signature · 1 line
2.48.1
Patch "rust: use custom FFI integer types" has been added to the 6.12-stable tree
This is a note to let you know that I've just added the patch titled
rust: use custom FFI integer types
to the 6.12-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
rust-use-custom-ffi-integer-types.patch
and it can be found in the queue-6.12 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
From [email protected] Fri Mar 7 23:53:20 2025
From: Miguel Ojeda <[email protected]>
Date: Fri, 7 Mar 2025 23:50:06 +0100
Subject: rust: use custom FFI integer types
To: Greg Kroah-Hartman <[email protected]>, Sasha Levin <[email protected]>, [email protected]
Cc: Danilo Krummrich <[email protected]>, Alice Ryhl <[email protected]>, Alyssa Ross <[email protected]>, NoisyCoil <[email protected]>, [email protected], Miguel Ojeda <[email protected]>
Message-ID: <[email protected]>
From: Gary Guo <[email protected]>
commit d072acda4862f095ec9056979b654cc06a22cc68 upstream.
Currently FFI integer types are defined in libcore. This commit creates the ffi crate and asks bindgen to use that crate for FFI integer types instead of core::ffi.
This commit is preparatory and no type changes are made in this commit yet.
[ Added rustdoc, rusttest and KUnit tests support. Rebased on top of
rust-next (e.g. migrated more core::ffi cases). Reworded crate docs slightly and formatted. - Miguel ]
--- rust/Makefile | 39 ++++++++++++++++++++++++------------ rust/ffi.rs | 13 ++++++++++++ rust/kernel/alloc/allocator.rs | 2 - rust/kernel/alloc/allocator_test.rs | 4 +-- rust/kernel/alloc/kbox.rs | 12 +++++------ rust/kernel/block/mq/operations.rs | 18 ++++++++-------- rust/kernel/block/mq/raw_writer.rs | 2 - rust/kernel/block/mq/tag_set.rs | 2 - rust/kernel/error.rs | 20 +++++++++--------- rust/kernel/init.rs | 2 - rust/kernel/lib.rs | 2 + rust/kernel/net/phy.rs | 16 +++++++------- rust/kernel/str.rs | 4 +-- rust/kernel/sync/arc.rs | 6 ++--- rust/kernel/sync/condvar.rs | 2 - rust/kernel/sync/lock.rs | 2 - rust/kernel/sync/lock/mutex.rs | 2 - rust/kernel/sync/lock/spinlock.rs | 2 - rust/kernel/task.rs | 8 +------ rust/kernel/time.rs | 4 +-- rust/kernel/types.rs | 14 ++++++------ rust/kernel/uaccess.rs | 6 ++--- rust/macros/module.rs | 8 +++---- 23 files changed, 107 insertions(+), 83 deletions(-) create mode 100644 rust/ffi.rs
rust/Makefile +26 -13
@@ -3,7 +3,7 @@ # Where to place rustdoc generated documentation rustdoc_output := $(objtree)/Documentation/output/rust/rustdoc -obj-$(CONFIG_RUST) += core.o compiler_builtins.o +obj-$(CONFIG_RUST) += core.o compiler_builtins.o ffi.o always-$(CONFIG_RUST) += exports_core_generated.h # Missing prototypes are expected in the helpers since these are exported
@@ -103,10 +103,13 @@ rustdoc-core: $(RUST_LIB_SRC)/core/src/l rustdoc-compiler_builtins: $(src)/compiler_builtins.rs rustdoc-core FORCE +$(call if_changed,rustdoc) -rustdoc-kernel: private rustc_target_flags = \ +rustdoc-ffi: $(src)/ffi.rs rustdoc-core FORCE + +$(call if_changed,rustdoc) + +rustdoc-kernel: private rustc_target_flags = --extern ffi \ --extern build_error --extern macros=$(objtree)/$(obj)/libmacros.so \ --extern bindings --extern uapi -rustdoc-kernel: $(src)/kernel/lib.rs rustdoc-core rustdoc-macros \ +rustdoc-kernel: $(src)/kernel/lib.rs rustdoc-core rustdoc-ffi rustdoc-macros \ rustdoc-compiler_builtins $(obj)/libmacros.so \ $(obj)/bindings.o FORCE +$(call if_changed,rustdoc)
@@ -124,12 +127,15 @@ quiet_cmd_rustc_test_library = RUSTC TL rusttestlib-build_error: $(src)/build_error.rs FORCE +$(call if_changed,rustc_test_library) +rusttestlib-ffi: $(src)/ffi.rs FORCE + +$(call if_changed,rustc_test_library) + rusttestlib-macros: private rustc_target_flags = --extern proc_macro rusttestlib-macros: private rustc_test_library_proc = yes rusttestlib-macros: $(src)/macros/lib.rs FORCE +$(call if_changed,rustc_test_library) -rusttestlib-kernel: private rustc_target_flags = \ +rusttestlib-kernel: private rustc_target_flags = --extern ffi \ --extern build_error --extern macros \ --extern bindings --extern uapi rusttestlib-kernel: $(src)/kernel/lib.rs \
@@ -137,10 +143,12 @@ rusttestlib-kernel: $(src)/kernel/lib.rs $(obj)/libmacros.so $(obj)/bindings.o FORCE +$(call if_changed,rustc_test_library) -rusttestlib-bindings: $(src)/bindings/lib.rs FORCE +rusttestlib-bindings: private rustc_target_flags = --extern ffi +rusttestlib-bindings: $(src)/bindings/lib.rs rusttestlib-ffi FORCE +$(call if_changed,rustc_test_library) -rusttestlib-uapi: $(src)/uapi/lib.rs FORCE +rusttestlib-uapi: private rustc_target_flags = --extern ffi +rusttestlib-uapi: $(src)/uapi/lib.rs rusttestlib-ffi FORCE +$(call if_changed,rustc_test_library) quiet_cmd_rustdoc_test = RUSTDOC T $<
@@ -159,7 +167,7 @@ quiet_cmd_rustdoc_test_kernel = RUSTDOC mkdir -p $(objtree)/$(obj)/test/doctests/kernel; \ OBJTREE=$(abspath $(objtree)) \ $(RUSTDOC) --test $(rust_flags) \ - -L$(objtree)/$(obj) --extern kernel \ + -L$(objtree)/$(obj) --extern ffi --extern kernel \ --extern build_error --extern macros \ --extern bindings --extern uapi \ --no-run --crate-name kernel -Zunstable-options \
@@ -197,9 +205,9 @@ rusttest-macros: $(src)/macros/lib.rs \ +$(call if_changed,rustc_test) +$(call if_changed,rustdoc_test) -rusttest-kernel: private rustc_target_flags = \ +rusttest-kernel: private rustc_target_flags = --extern ffi \ --extern build_error --extern macros --extern bindings --extern uapi -rusttest-kernel: $(src)/kernel/lib.rs rusttestlib-kernel \ +rusttest-kernel: $(src)/kernel/lib.rs rusttestlib-ffi rusttestlib-kernel \ rusttestlib-build_error rusttestlib-macros rusttestlib-bindings \ rusttestlib-uapi FORCE +$(call if_changed,rustc_test)
@@ -286,7 +294,7 @@ bindgen_c_flags_final = $(bindgen_c_flag quiet_cmd_bindgen = BINDGEN $@ cmd_bindgen = \ $(BINDGEN) $< $(bindgen_target_flags) --rust-target 1.68 \ - --use-core --with-derive-default --ctypes-prefix core::ffi --no-layout-tests \ + --use-core --with-derive-default --ctypes-prefix ffi --no-layout-tests \ --no-debug '.*' --enable-function-attribute-detection \ -o $@ -- $(bindgen_c_flags_final) -DMODULE \ $(bindgen_target_cflags) $(bindgen_target_extra)
@@ -414,18 +422,23 @@ $(obj)/compiler_builtins.o: $(src)/compi $(obj)/build_error.o: $(src)/build_error.rs $(obj)/compiler_builtins.o FORCE +$(call if_changed_rule,rustc_library) +$(obj)/ffi.o: $(src)/ffi.rs $(obj)/compiler_builtins.o FORCE + +$(call if_changed_rule,rustc_library) + +$(obj)/bindings.o: private rustc_target_flags = --extern ffi $(obj)/bindings.o: $(src)/bindings/lib.rs \ - $(obj)/compiler_builtins.o \ + $(obj)/ffi.o \ $(obj)/bindings/bindings_generated.rs \ $(obj)/bindings/bindings_helpers_generated.rs FORCE +$(call if_changed_rule,rustc_library) +$(obj)/uapi.o: private rustc_target_flags = --extern ffi $(obj)/uapi.o: $(src)/uapi/lib.rs \ - $(obj)/compiler_builtins.o \ + $(obj)/ffi.o \ $(obj)/uapi/uapi_generated.rs FORCE +$(call if_changed_rule,rustc_library) -$(obj)/kernel.o: private rustc_target_flags = \ +$(obj)/kernel.o: private rustc_target_flags = --extern ffi \ --extern build_error --extern macros --extern bindings --extern uapi $(obj)/kernel.o: $(src)/kernel/lib.rs $(obj)/build_error.o \ $(obj)/libmacros.so $(obj)/bindings.o $(obj)/uapi.o FORCE
rust/ffi.rs new file +13 -0
@@ -0,0 +1,13 @@ +// SPDX-License-Identifier: GPL-2.0 + +//! Foreign function interface (FFI) types. +//! +//! This crate provides mapping from C primitive types to Rust ones. +//! +//! The Rust [`core`] crate provides [`core::ffi`], which maps integer types to the platform default +//! C ABI. The kernel does not use [`core::ffi`], so it can customise the mapping that deviates from +//! the platform default. + +#![no_std] + +pub use core::ffi::*;
rust/kernel/alloc/allocator.rs +1 -1
@@ -58,7 +58,7 @@ fn aligned_size(new_layout: Layout) -> u/// /// One of the following: `krealloc`, `vrealloc`, `kvrealloc`. struct ReallocFunc ( -unsafe extern "C" fn (*const core::ffi::c_void ,usize ,u32 ) -> *mut core::ffi::c_void , +unsafe extern "C" fn (*const crate ::ffi::c_void ,usize ,u32 ) -> *mut crate ::ffi::c_void , );impl ReallocFunc {
rust/kernel/alloc/allocator_test.rs +2 -2
@@ -24,10 +24,10 @@ pub type KVmalloc = Kmalloc;extern "C" {#[link_name = "aligned_alloc" ] -fn libc_aligned_alloc (align:usize , size:usize ) -> *mut core::ffi::c_void ; +fn libc_aligned_alloc (align:usize , size:usize ) -> *mut crate ::ffi::c_void ;#[link_name = "free" ] -fn libc_free (ptr: *mut core::ffi::c_void ); +fn libc_free (ptr: *mut crate ::ffi::c_void ); }// SAFETY:
rust/kernel/alloc/kbox.rs +6 -6
@@ -355,17 +355,17 @@ where {type Borrowed <'a> = &'aT ; -fn into_foreign (self) -> *const core::ffi::c_void { +fn into_foreign (self) -> *const crate ::ffi::c_void {Box ::into_raw (self)as _ } -unsafe fn from_foreign (ptr: *const core::ffi::c_void ) ->Self { +unsafe fn from_foreign (ptr: *const crate ::ffi::c_void ) ->Self {// SAFETY: The safety requirements of this function ensure that `ptr` comes from a previous // call to `Self::into_foreign`. unsafe {Box ::from_raw (ptras _ ) } } -unsafe fn borrow <'a>(ptr: *const core::ffi::c_void ) -> &'aT { +unsafe fn borrow <'a>(ptr: *const crate ::ffi::c_void ) -> &'aT {// SAFETY: The safety requirements of this method ensure that the object remains alive and // immutable for the duration of 'a. unsafe { &*ptr.cast () }
@@ -378,18 +378,18 @@ where {type Borrowed <'a> =Pin <&'aT >; -fn into_foreign (self) -> *const core::ffi::c_void { +fn into_foreign (self) -> *const crate ::ffi::c_void {// SAFETY: We are still treating the box as pinned. Box ::into_raw (unsafe {Pin ::into_inner_unchecked (self) })as _ } -unsafe fn from_foreign (ptr: *const core::ffi::c_void ) ->Self { +unsafe fn from_foreign (ptr: *const crate ::ffi::c_void ) ->Self {// SAFETY: The safety requirements of this function ensure that `ptr` comes from a previous // call to `Self::into_foreign`. unsafe {Pin ::new_unchecked (Box ::from_raw (ptras _ )) } } -unsafe fn borrow <'a>(ptr: *const core::ffi::c_void ) ->Pin <&'aT > { +unsafe fn borrow <'a>(ptr: *const crate ::ffi::c_void ) ->Pin <&'aT > {// SAFETY: The safety requirements for this function ensure that the object is still alive, // so it is safe to dereference the raw pointer. // The safety requirements of `from_foreign` also ensure that the object remains alive for
rust/kernel/block/mq/operations.rs +9 -9
@@ -131,7 +131,7 @@ impl<T: Operations> OperationsVTable<T>unsafe extern "C" fn poll_callback ( _hctx: *mut bindings::blk_mq_hw_ctx , _iob: *mut bindings::io_comp_batch , - ) -> core::ffi::c_int { + ) ->crate ::ffi::c_int {T ::poll ().into () }
@@ -145,9 +145,9 @@ impl<T: Operations> OperationsVTable<T>/// for the same context. unsafe extern "C" fn init_hctx_callback ( _hctx: *mut bindings::blk_mq_hw_ctx , - _tagset_data: *mut core::ffi::c_void , - _hctx_idx: core::ffi::c_uint , - ) -> core::ffi::c_int { + _tagset_data: *mut crate ::ffi::c_void , + _hctx_idx:crate ::ffi::c_uint , + ) ->crate ::ffi::c_int {from_result (||Ok (0 )) }
@@ -159,7 +159,7 @@ impl<T: Operations> OperationsVTable<T>/// This function may only be called by blk-mq C infrastructure. unsafe extern "C" fn exit_hctx_callback ( _hctx: *mut bindings::blk_mq_hw_ctx , - _hctx_idx: core::ffi::c_uint , + _hctx_idx:crate ::ffi::c_uint , ) { }
@@ -176,9 +176,9 @@ impl<T: Operations> OperationsVTable<T>unsafe extern "C" fn init_request_callback ( _set: *mut bindings::blk_mq_tag_set , rq: *mut bindings::request , - _hctx_idx: core::ffi::c_uint , - _numa_node: core::ffi::c_uint , - ) -> core::ffi::c_int { + _hctx_idx:crate ::ffi::c_uint , + _numa_node:crate ::ffi::c_uint , + ) ->crate ::ffi::c_int {from_result (|| {// SAFETY: By the safety requirements of this function, `rq` points // to a valid allocation.
@@ -203,7 +203,7 @@ impl<T: Operations> OperationsVTable<T>unsafe extern "C" fn exit_request_callback ( _set: *mut bindings::blk_mq_tag_set , rq: *mut bindings::request , - _hctx_idx: core::ffi::c_uint , + _hctx_idx:crate ::ffi::c_uint , ) {// SAFETY: The tagset invariants guarantee that all requests are allocated with extra memory // for the request data.
rust/kernel/block/mq/raw_writer.rs +1 -1
@@ -25,7 +25,7 @@ impl<'a> RawWriter<'a> { }pub (crate )fn from_array <const N :usize >( - a: &'amut [core::ffi::c_char ;N ], + a: &'amut [crate ::ffi::c_char ;N ], ) ->Result <RawWriter <'a>> { Self::new(// SAFETY: the buffer of `a` is valid for read and write as `u8` for
rust/kernel/block/mq/tag_set.rs +1 -1
@@ -53,7 +53,7 @@ impl<T: Operations> TagSet<T> { queue_depth: num_tags, cmd_size, flags: bindings::BLK_MQ_F_SHOULD_MERGE, - driver_data: core::ptr::null_mut::<core::ffi::c_void>(), + driver_data: core::ptr::null_mut::<crate::ffi::c_void>(), nr_maps: num_maps, ..tag_set }
rust/kernel/error.rs +10 -10
@@ -100,7 +100,7 @@ impl Error {/// /// It is a bug to pass an out-of-range `errno`. `EINVAL` would /// be returned in such a case. -pub fn from_errno (errno: core::ffi::c_int ) ->Error { +pub fn from_errno (errno:crate ::ffi::c_int ) ->Error {if errno < -(bindings::MAX_ERRNO as i32 ) || errno >=0 {// TODO: Make it a `WARN_ONCE` once available. crate ::pr_warn!(
@@ -119,7 +119,7 @@ impl Error {/// Creates an [`Error`] from a kernel error code. /// /// Returns [`None`] if `errno` is out-of-range. -const fn try_from_errno (errno: core::ffi::c_int ) ->Option <Error > { +const fn try_from_errno (errno:crate ::ffi::c_int ) ->Option <Error > {if errno < -(bindings::MAX_ERRNO as i32 ) || errno >=0 {return None ; }
@@ -133,7 +133,7 @@ impl Error {/// # Safety /// /// `errno` must be within error code range (i.e. `>= -MAX_ERRNO && < 0`). -const unsafe fn from_errno_unchecked (errno: core::ffi::c_int ) ->Error { +const unsafe fn from_errno_unchecked (errno:crate ::ffi::c_int ) ->Error {// INVARIANT: The contract ensures the type invariant // will hold. // SAFETY: The caller guarantees `errno` is non-zero.
@@ -141,7 +141,7 @@ impl Error { }/// Returns the kernel error code. -pub fn to_errno (self) -> core::ffi::c_int { +pub fn to_errno (self) ->crate ::ffi::c_int { self.0 .get () }
@@ -259,7 +259,7 @@ pub type Result<T = (), E = Error> = cor/// Converts an integer as returned by a C kernel function to an error if it's negative, and /// `Ok(())` otherwise. -pub fn to_result (err: core::ffi::c_int ) ->Result { +pub fn to_result (err:crate ::ffi::c_int ) ->Result {if err <0 {Err (Error ::from_errno (err)) }else {
@@ -282,15 +282,15 @@ pub fn to_result(err: core::ffi::c_int)/// fn devm_platform_ioremap_resource( /// pdev: &mut PlatformDevice, /// index: u32, -/// ) -> Result<*mut core::ffi::c_void> { +/// ) -> Result<*mut kernel::ffi::c_void> { /// // SAFETY: `pdev` points to a valid platform device. There are no safety requirements /// // on `index`. /// from_err_ptr(unsafe { bindings::devm_platform_ioremap_resource(pdev.to_ptr(), index) }) /// } /// ``` pub fn from_err_ptr <T >(ptr: *mut T ) ->Result <*mut T > { -// CAST: Casting a pointer to `*const core::ffi::c_void` is always valid. -let const_ptr: *const core::ffi::c_void = ptr.cast (); +// CAST: Casting a pointer to `*const crate::ffi::c_void` is always valid. +let const_ptr: *const crate ::ffi::c_void = ptr.cast ();// SAFETY: The FFI function does not deref the pointer. if unsafe { bindings::IS_ERR (const_ptr) } {// SAFETY: The FFI function does not deref the pointer.
@@ -306,7 +306,7 @@ pub fn from_err_ptr<T>(ptr: *mut T) -> R// // SAFETY: `IS_ERR()` ensures `err` is a // negative value greater-or-equal to `-bindings::MAX_ERRNO`. -return Err (unsafe {Error ::from_errno_unchecked (erras core::ffi::c_int ) }); +return Err (unsafe {Error ::from_errno_unchecked (erras crate ::ffi::c_int ) }); }Ok (ptr) }
@@ -326,7 +326,7 @@ pub fn from_err_ptr<T>(ptr: *mut T) -> R/// # use kernel::bindings; /// unsafe extern "C" fn probe_callback( /// pdev: *mut bindings::platform_device, -/// ) -> core::ffi::c_int { +/// ) -> kernel::ffi::c_int { /// from_result(|| { /// let ptr = devm_alloc(pdev)?; /// bindings::platform_set_drvdata(pdev, ptr);
rust/kernel/init.rs +1 -1
@@ -133,7 +133,7 @@//! # } //! # // `Error::from_errno` is `pub(crate)` in the `kernel` crate, thus provide a workaround. //! # trait FromErrno { -//! # fn from_errno(errno: core::ffi::c_int) -> Error { +//! # fn from_errno(errno: kernel::ffi::c_int) -> Error { //! # // Dummy error that can be constructed outside the `kernel` crate. //! # Error::from(core::fmt::Error) //! # }
rust/kernel/lib.rs +2 -0
@@ -27,6 +27,8 @@ compile_error!("Missing kernel configura// Allow proc-macros to refer to `::kernel` inside the `kernel` crate (this crate). extern crate selfas kernel; +pub use ffi; +pub mod alloc;#[cfg( CONFIG_BLOCK )] pub mod block;
rust/kernel/net/phy.rs +8 -8
@@ -314,7 +314,7 @@ impl<T: Driver> Adapter<T> {/// `phydev` must be passed by the corresponding callback in `phy_driver`. unsafe extern "C" fn soft_reset_callback ( phydev: *mut bindings::phy_device , - ) -> core::ffi::c_int { + ) ->crate ::ffi::c_int {from_result (|| {// SAFETY: This callback is called only in contexts // where we hold `phy_device->lock`, so the accessors on
@@ -328,7 +328,7 @@ impl<T: Driver> Adapter<T> {/// # Safety /// /// `phydev` must be passed by the corresponding callback in `phy_driver`. -unsafe extern "C" fn probe_callback (phydev: *mut bindings::phy_device ) -> core::ffi::c_int { +unsafe extern "C" fn probe_callback (phydev: *mut bindings::phy_device ) ->crate ::ffi::c_int {from_result (|| {// SAFETY: This callback is called only in contexts // where we can exclusively access `phy_device` because
@@ -345,7 +345,7 @@ impl<T: Driver> Adapter<T> {/// `phydev` must be passed by the corresponding callback in `phy_driver`. unsafe extern "C" fn get_features_callback ( phydev: *mut bindings::phy_device , - ) -> core::ffi::c_int { + ) ->crate ::ffi::c_int {from_result (|| {// SAFETY: This callback is called only in contexts // where we hold `phy_device->lock`, so the accessors on
@@ -359,7 +359,7 @@ impl<T: Driver> Adapter<T> {/// # Safety /// /// `phydev` must be passed by the corresponding callback in `phy_driver`. -unsafe extern "C" fn suspend_callback (phydev: *mut bindings::phy_device ) -> core::ffi::c_int { +unsafe extern "C" fn suspend_callback (phydev: *mut bindings::phy_device ) ->crate ::ffi::c_int {from_result (|| {// SAFETY: The C core code ensures that the accessors on // `Device` are okay to call even though `phy_device->lock`
@@ -373,7 +373,7 @@ impl<T: Driver> Adapter<T> {/// # Safety /// /// `phydev` must be passed by the corresponding callback in `phy_driver`. -unsafe extern "C" fn resume_callback (phydev: *mut bindings::phy_device ) -> core::ffi::c_int { +unsafe extern "C" fn resume_callback (phydev: *mut bindings::phy_device ) ->crate ::ffi::c_int {from_result (|| {// SAFETY: The C core code ensures that the accessors on // `Device` are okay to call even though `phy_device->lock`
@@ -389,7 +389,7 @@ impl<T: Driver> Adapter<T> {/// `phydev` must be passed by the corresponding callback in `phy_driver`. unsafe extern "C" fn config_aneg_callback ( phydev: *mut bindings::phy_device , - ) -> core::ffi::c_int { + ) ->crate ::ffi::c_int {from_result (|| {// SAFETY: This callback is called only in contexts // where we hold `phy_device->lock`, so the accessors on
@@ -405,7 +405,7 @@ impl<T: Driver> Adapter<T> {/// `phydev` must be passed by the corresponding callback in `phy_driver`. unsafe extern "C" fn read_status_callback ( phydev: *mut bindings::phy_device , - ) -> core::ffi::c_int { + ) ->crate ::ffi::c_int {from_result (|| {// SAFETY: This callback is called only in contexts // where we hold `phy_device->lock`, so the accessors on
@@ -421,7 +421,7 @@ impl<T: Driver> Adapter<T> {/// `phydev` must be passed by the corresponding callback in `phy_driver`. unsafe extern "C" fn match_phy_device_callback ( phydev: *mut bindings::phy_device , - ) -> core::ffi::c_int { + ) ->crate ::ffi::c_int {// SAFETY: This callback is called only in contexts // where we hold `phy_device->lock`, so the accessors on // `Device` are okay to call.
rust/kernel/str.rs +2 -2
@@ -184,7 +184,7 @@ impl CStr {/// last at least `'a`. When `CStr` is alive, the memory pointed by `ptr` /// must not be mutated. #[inline] -pub unsafe fn from_char_ptr <'a>(ptr: *const core::ffi::c_char ) -> &'aSelf { +pub unsafe fn from_char_ptr <'a>(ptr: *const crate ::ffi::c_char ) -> &'aSelf {// SAFETY: The safety precondition guarantees `ptr` is a valid pointer // to a `NUL`-terminated C string. let len =unsafe { bindings::strlen (ptr) } +1 ;
@@ -247,7 +247,7 @@ impl CStr {/// Returns a C pointer to the string. #[inline] -pub const fn as_char_ptr (&self) -> *const core::ffi::c_char { +pub const fn as_char_ptr (&self) -> *const crate ::ffi::c_char { self.0 .as_ptr ()as _ }
rust/kernel/sync/arc.rs +3 -3
@@ -332,11 +332,11 @@ impl<T: ?Sized> Arc<T> {impl <T : 'static>ForeignOwnable for Arc <T > {type Borrowed <'a> =ArcBorrow <'a,T >; -fn into_foreign (self) -> *const core::ffi::c_void { +fn into_foreign (self) -> *const crate ::ffi::c_void {ManuallyDrop ::new (self).ptr.as_ptr ()as _ } -unsafe fn borrow <'a>(ptr: *const core::ffi::c_void ) ->ArcBorrow <'a,T > { +unsafe fn borrow <'a>(ptr: *const crate ::ffi::c_void ) ->ArcBorrow <'a,T > {// By the safety requirement of this function, we know that `ptr` came from // a previous call to `Arc::into_foreign`. let inner =NonNull ::new (ptras *mut ArcInner <T >).unwrap ();
@@ -346,7 +346,7 @@ impl<T: 'static> ForeignOwnable for Arc<unsafe {ArcBorrow ::new (inner) } } -unsafe fn from_foreign (ptr: *const core::ffi::c_void ) ->Self { +unsafe fn from_foreign (ptr: *const crate ::ffi::c_void ) ->Self {// SAFETY: By the safety requirement of this function, we know that `ptr` came from // a previous call to `Arc::into_foreign`, which guarantees that `ptr` is valid and // holds a reference count increment that is transferrable to us.
rust/kernel/sync/condvar.rs +1 -1
@@ -7,6 +7,7 @@use super ::{lock::Backend , lock::Guard ,LockClassKey };use crate ::{ + ffi::{c_int, c_long}, init::PinInit , pin_init, str::CStr ,
@@ -14,7 +15,6 @@ use crate::{ time::Jiffies, types::Opaque, }; -use core::ffi::{c_int, c_long};use core::marker::PhantomPinned ;use core::ptr;use macros::pin_data;
rust/kernel/sync/lock.rs +1 -1
@@ -46,7 +46,7 @@ pub unsafe trait Backend {/// remain valid for read indefinitely. unsafe fn init ( ptr: *mut Self ::State , - name: *const core::ffi::c_char , + name: *const crate ::ffi::c_char , key: *mut bindings::lock_class_key , );
rust/kernel/sync/lock/mutex.rs +1 -1
@@ -96,7 +96,7 @@ unsafe impl super::Backend for MutexBackunsafe fn init ( ptr: *mut Self ::State , - name: *const core::ffi::c_char , + name: *const crate ::ffi::c_char , key: *mut bindings::lock_class_key , ) {// SAFETY: The safety requirements ensure that `ptr` is valid for writes, and `name` and
rust/kernel/sync/lock/spinlock.rs +1 -1
@@ -95,7 +95,7 @@ unsafe impl super::Backend for SpinLockBunsafe fn init ( ptr: *mut Self ::State , - name: *const core::ffi::c_char , + name: *const crate ::ffi::c_char , key: *mut bindings::lock_class_key , ) {// SAFETY: The safety requirements ensure that `ptr` is valid for writes, and `name` and
rust/kernel/task.rs +2 -6
@@ -4,13 +4,9 @@//! //! C header: [`include/linux/sched.h`](srctree/include/linux/sched.h). +use crate ::ffi::{c_int, c_long, c_uint};use crate ::types::Opaque ; -use core::{ - ffi::{c_int, c_long, c_uint}, - marker::PhantomData , - ops::Deref , - ptr, -}; +use core::{marker::PhantomData , ops::Deref , ptr};/// A sentinel value used for infinite timeouts. pub const MAX_SCHEDULE_TIMEOUT :c_long = c_long::MAX ;
rust/kernel/time.rs +2 -2
@@ -12,10 +12,10 @@pub const NSEC_PER_MSEC :i64 = bindings::NSEC_PER_MSEC as i64 ;/// The time unit of Linux kernel. One jiffy equals (1/HZ) second. -pub type Jiffies = core::ffi::c_ulong ; +pub type Jiffies =crate ::ffi::c_ulong ;/// The millisecond time unit. -pub type Msecs = core::ffi::c_uint ; +pub type Msecs =crate ::ffi::c_uint ;/// Converts milliseconds to jiffies. #[inline]
rust/kernel/types.rs +7 -7
@@ -29,7 +29,7 @@ pub trait ForeignOwnable: Sized {/// For example, it might be invalid, dangling or pointing to uninitialized memory. Using it in /// any way except for [`ForeignOwnable::from_foreign`], [`ForeignOwnable::borrow`], /// [`ForeignOwnable::try_from_foreign`] can result in undefined behavior. -fn into_foreign (self) -> *const core::ffi::c_void ; +fn into_foreign (self) -> *const crate ::ffi::c_void ;/// Borrows a foreign-owned object. ///
@@ -37,7 +37,7 @@ pub trait ForeignOwnable: Sized {/// /// `ptr` must have been returned by a previous call to [`ForeignOwnable::into_foreign`] for /// which a previous matching [`ForeignOwnable::from_foreign`] hasn't been called yet. -unsafe fn borrow <'a>(ptr: *const core::ffi::c_void ) ->Self ::Borrowed <'a>; +unsafe fn borrow <'a>(ptr: *const crate ::ffi::c_void ) ->Self ::Borrowed <'a>;/// Converts a foreign-owned object back to a Rust-owned one. ///
@@ -47,7 +47,7 @@ pub trait ForeignOwnable: Sized {/// which a previous matching [`ForeignOwnable::from_foreign`] hasn't been called yet. /// Additionally, all instances (if any) of values returned by [`ForeignOwnable::borrow`] for /// this object must have been dropped. -unsafe fn from_foreign (ptr: *const core::ffi::c_void ) ->Self ; +unsafe fn from_foreign (ptr: *const crate ::ffi::c_void ) ->Self ;/// Tries to convert a foreign-owned object back to a Rust-owned one. ///
@@ -58,7 +58,7 @@ pub trait ForeignOwnable: Sized {/// /// `ptr` must either be null or satisfy the safety requirements for /// [`ForeignOwnable::from_foreign`]. -unsafe fn try_from_foreign (ptr: *const core::ffi::c_void ) ->Option <Self > { +unsafe fn try_from_foreign (ptr: *const crate ::ffi::c_void ) ->Option <Self > {if ptr.is_null () {None }else {
@@ -72,13 +72,13 @@ pub trait ForeignOwnable: Sized {impl ForeignOwnable for () {type Borrowed <'a> = (); -fn into_foreign (self) -> *const core::ffi::c_void { +fn into_foreign (self) -> *const crate ::ffi::c_void { core::ptr::NonNull ::dangling ().as_ptr () } -unsafe fn borrow <'a>(_: *const core::ffi::c_void ) ->Self ::Borrowed <'a> {} +unsafe fn borrow <'a>(_: *const crate ::ffi::c_void ) ->Self ::Borrowed <'a> {} -unsafe fn from_foreign (_: *const core::ffi::c_void ) ->Self {} +unsafe fn from_foreign (_: *const crate ::ffi::c_void ) ->Self {} }/// Runs a cleanup function/closure when dropped.
rust/kernel/uaccess.rs +3 -3
@@ -8,10 +8,10 @@ use crate::{ alloc::Flags, bindings, error::Result, + ffi::{c_ulong, c_void}, prelude::*, types::{AsBytes, FromBytes}, }; -use core::ffi::{c_ulong, c_void};use core::mem::{size_of,MaybeUninit };/// The type used for userspace addresses.
@@ -45,7 +45,7 @@ pub type UserPtr = usize;/// every byte in the region. /// /// ```no_run -/// use core::ffi::c_void; +/// use kernel::ffi::c_void; /// use kernel::error::Result; /// use kernel::uaccess::{UserPtr, UserSlice}; ///
@@ -67,7 +67,7 @@ pub type UserPtr = usize;/// Example illustrating a TOCTOU (time-of-check to time-of-use) bug. /// /// ```no_run -/// use core::ffi::c_void; +/// use kernel::ffi::c_void; /// use kernel::error::{code::EINVAL, Result}; /// use kernel::uaccess::{UserPtr, UserSlice}; ///
rust/macros/module.rs +4 -4
@@ -253,7 +253,7 @@ pub(crate) fn module(ts: TokenStream) ->#[doc(hidden)] #[no_mangle] #[link_section = \".init.text\"] - pub unsafe extern \"C\" fn init_module() -> core::ffi::c_int {{ + pub unsafe extern \"C\" fn init_module() -> kernel::ffi::c_int {{ // SAFETY: This function is inaccessible to the outside due to the double // module wrapping it. It is called exactly once by the C side via its // unique name.
@@ -292,7 +292,7 @@ pub(crate) fn module(ts: TokenStream) ->#[doc(hidden)] #[link_section = \"{initcall_section}\"] #[used] - pub static __{name}_initcall: extern \"C\" fn() -> core::ffi::c_int = __{name}_init; + pub static __{name}_initcall: extern \"C\" fn() -> kernel::ffi::c_int = __{name}_init; #[cfg(not(MODULE))] #[cfg(CONFIG_HAVE_ARCH_PREL32_RELOCATIONS)]
@@ -307,7 +307,7 @@ pub(crate) fn module(ts: TokenStream) ->#[cfg(not( MODULE ))] #[doc(hidden)] #[no_mangle] - pub extern \"C\" fn __{name}_init() -> core::ffi::c_int {{ + pub extern \"C\" fn __{name}_init() -> kernel::ffi::c_int {{ // SAFETY: This function is inaccessible to the outside due to the double // module wrapping it. It is called exactly once by the C side via its // placement above in the initcall section.
@@ -330,7 +330,7 @@ pub(crate) fn module(ts: TokenStream) ->/// # Safety /// /// This function must only be called once. -unsafe fn __init () -> core::ffi::c_int {{ +unsafe fn __init () -> kernel::ffi::c_int {{ match <{type_} as kernel::Module>::init(&super::super::THIS_MODULE) {{Ok (m) => {{// SAFETY: No data race, since `__MOD` can only be accessed by this
Patches currently in stable-queue which might be from [email protected] are
queue-6.12/drm-panic-avoid-reimplementing-iterator-find.patch queue-6.12/documentation-rust-add-coding-guidelines-on-lints.patch queue-6.12/rust-provide-proper-code-documentation-titles.patch queue-6.12/rust-alloc-make-allocator-module-public.patch queue-6.12/rust-alloc-remove-vecext-extension.patch queue-6.12/rust-alloc-implement-reallocfunc.patch queue-6.12/rust-alloc-separate-aligned_size-from-krealloc_aligned.patch queue-6.12/rust-enable-clippy-unnecessary_safety_comment-lint.patch queue-6.12/rust-alloc-update-module-comment-of-alloc.rs.patch queue-6.12/rust-kbuild-expand-rusttest-target-for-macros.patch queue-6.12/rust-error-use-core-alloc-layouterror.patch queue-6.12/rust-str-test-replace-alloc-format.patch queue-6.12/loongarch-use-asm_reachable.patch queue-6.12/rust-alloc-implement-allocator-for-kmalloc.patch queue-6.12/rust-alloc-implement-collect-for-intoiter.patch queue-6.12/rust-alloc-introduce-arraylayout.patch queue-6.12/rust-alloc-implement-vmalloc-allocator.patch queue-6.12/documentation-rust-discuss-in-the-guidelines.patch queue-6.12/rust-error-check-for-config-test-in-error-name.patch queue-6.12/rust-enable-clippy-ignored_unit_patterns-lint.patch queue-6.12/rust-enable-clippy-unnecessary_safety_doc-lint.patch queue-6.12/rust-alloc-add-box-to-prelude.patch queue-6.12/kbuild-rust-remove-the-alloc-crate-and-globalalloc.patch queue-6.12/rust-alloc-add-allocator-trait.patch queue-6.12/rust-treewide-switch-to-our-kernel-box-type.patch queue-6.12/rust-introduce-.clippy.toml.patch queue-6.12/rust-alloc-rename-kernelallocator-to-kmalloc.patch queue-6.12/rust-alloc-implement-cmalloc-in-module-allocator_test.patch queue-6.12/drm-panic-allow-verbose-version-check.patch queue-6.12/rust-map-__kernel_size_t-and-friends-also-to-usize-isize.patch queue-6.12/rust-alloc-add-module-allocator_test.patch queue-6.12/rust-replace-clippy-dbg_macro-with-disallowed_macros.patch queue-6.12/rust-alloc-add-__gfp_nowarn-to-flags.patch queue-6.12/rust-enable-clippy-s-check-private-items.patch queue-6.12/rust-error-make-conversion-functions-public.patch queue-6.12/rust-sort-global-rust-flags.patch queue-6.12/rust-alloc-implement-contains-for-flags.patch queue-6.12/rust-init-remove-unneeded.patch queue-6.12/rust-use-custom-ffi-integer-types.patch queue-6.12/rust-sync-remove-unneeded.patch queue-6.12/rust-treewide-switch-to-the-kernel-vec-type.patch queue-6.12/rust-alloc-implement-kvmalloc-allocator.patch queue-6.12/drm-panic-correctly-indent-continuation-of-line-in-list-item.patch queue-6.12/rust-alloc-implement-kernel-vec-type.patch queue-6.12/rust-workqueue-remove-unneeded.patch queue-6.12/rust-error-optimize-error-type-to-use-nonzero.patch queue-6.12/drm-panic-remove-unnecessary-borrow-in-alignment_pattern.patch queue-6.12/rust-alloc-remove-extension-of-std-s-box.patch queue-6.12/rust-block-fix-formatting-in-gendisk-doc.patch queue-6.12/rust-enable-rustdoc-unescaped_backticks-lint.patch queue-6.12/rust-fix-size_t-in-bindgen-prototypes-of-c-builtins.patch queue-6.12/rust-enable-clippy-undocumented_unsafe_blocks-lint.patch queue-6.12/rust-alloc-add-vec-to-prelude.patch queue-6.12/rust-alloc-implement-intoiterator-for-vec.patch queue-6.12/rust-alloc-implement-kernel-box.patch queue-6.12/drm-panic-remove-redundant-field-when-assigning-value.patch queue-6.12/rust-types-avoid-repetition-in-as-from-bytes-impls.patch queue-6.12/rust-start-using-the-attribute.patch queue-6.12/drm-panic-allow-verbose-boolean-for-clarity.patch queue-6.12/maintainers-add-entry-for-the-rust-alloc-module.patch queue-6.12/rust-alloc-fix-arraylayout-allocations.patch queue-6.12/drm-panic-prefer-eliding-lifetimes.patch
Miguel Ojeda
maintainerPATCH 60/60 rust: alloc: Fix `ArrayLayout` allocations
In reply to Miguel OjedaFrom: Asahi Lina <[email protected]>
commit b7ed2b6f4e8d7f64649795e76ee9db67300de8eb upstream.
We were accidentally allocating a layout for the *square* of the object size due to a variable shadowing mishap.
Fixes memory bloat and page allocation failures in drm/asahi.
--- rust/kernel/alloc/layout.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
rust/kernel/alloc/layout.rs +1 -1
@@ -45,7 +45,7 @@ pub const fn empty() -> Self {/// When `len * size_of::<T>()` overflows or when `len * size_of::<T>() > isize::MAX`. pub const fn new (len:usize ) ->Result <Self ,LayoutError > {match len.checked_mul (core::mem::size_of ::<T >()) { -Some (len)if len <=ISIZE_MAX => { +Some (size)if size <=ISIZE_MAX => {// INVARIANT: We checked above that `len * size_of::<T>() <= isize::MAX`. Ok (Self { len,
Signature · 1 line
2.48.1
Patch "rust: alloc: Fix `ArrayLayout` allocations" has been added to the 6.12-stable tree
This is a note to let you know that I've just added the patch titled
rust: alloc: Fix ArrayLayout allocations
to the 6.12-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
rust-alloc-fix-arraylayout-allocations.patch
and it can be found in the queue-6.12 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
From [email protected] Fri Mar 7 23:53:26 2025
From: Miguel Ojeda <[email protected]>
Date: Fri, 7 Mar 2025 23:50:07 +0100
Subject: rust: alloc: Fix ArrayLayout allocations
To: Greg Kroah-Hartman <[email protected]>, Sasha Levin <[email protected]>, [email protected]
Cc: Danilo Krummrich <[email protected]>, Alice Ryhl <[email protected]>, Alyssa Ross <[email protected]>, NoisyCoil <[email protected]>, [email protected], Miguel Ojeda <[email protected]>
Message-ID: <[email protected]>
From: Asahi Lina <[email protected]>
commit b7ed2b6f4e8d7f64649795e76ee9db67300de8eb upstream.
We were accidentally allocating a layout for the *square* of the object size due to a variable shadowing mishap.
Fixes memory bloat and page allocation failures in drm/asahi.
--- rust/kernel/alloc/layout.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
rust/kernel/alloc/layout.rs +1 -1
@@ -45,7 +45,7 @@ impl<T> ArrayLayout<T> {/// When `len * size_of::<T>()` overflows or when `len * size_of::<T>() > isize::MAX`. pub const fn new (len:usize ) ->Result <Self ,LayoutError > {match len.checked_mul (core::mem::size_of ::<T >()) { -Some (len)if len <=ISIZE_MAX => { +Some (size)if size <=ISIZE_MAX => {// INVARIANT: We checked above that `len * size_of::<T>() <= isize::MAX`. Ok (Self { len,
Patches currently in stable-queue which might be from [email protected] are
queue-6.12/drm-panic-avoid-reimplementing-iterator-find.patch queue-6.12/documentation-rust-add-coding-guidelines-on-lints.patch queue-6.12/rust-provide-proper-code-documentation-titles.patch queue-6.12/rust-alloc-make-allocator-module-public.patch queue-6.12/rust-alloc-remove-vecext-extension.patch queue-6.12/rust-alloc-implement-reallocfunc.patch queue-6.12/rust-alloc-separate-aligned_size-from-krealloc_aligned.patch queue-6.12/rust-enable-clippy-unnecessary_safety_comment-lint.patch queue-6.12/rust-alloc-update-module-comment-of-alloc.rs.patch queue-6.12/rust-kbuild-expand-rusttest-target-for-macros.patch queue-6.12/rust-error-use-core-alloc-layouterror.patch queue-6.12/rust-str-test-replace-alloc-format.patch queue-6.12/loongarch-use-asm_reachable.patch queue-6.12/rust-alloc-implement-allocator-for-kmalloc.patch queue-6.12/rust-alloc-implement-collect-for-intoiter.patch queue-6.12/rust-alloc-introduce-arraylayout.patch queue-6.12/rust-alloc-implement-vmalloc-allocator.patch queue-6.12/documentation-rust-discuss-in-the-guidelines.patch queue-6.12/rust-error-check-for-config-test-in-error-name.patch queue-6.12/rust-enable-clippy-ignored_unit_patterns-lint.patch queue-6.12/rust-enable-clippy-unnecessary_safety_doc-lint.patch queue-6.12/rust-alloc-add-box-to-prelude.patch queue-6.12/kbuild-rust-remove-the-alloc-crate-and-globalalloc.patch queue-6.12/rust-alloc-add-allocator-trait.patch queue-6.12/rust-treewide-switch-to-our-kernel-box-type.patch queue-6.12/rust-introduce-.clippy.toml.patch queue-6.12/rust-alloc-rename-kernelallocator-to-kmalloc.patch queue-6.12/rust-alloc-implement-cmalloc-in-module-allocator_test.patch queue-6.12/drm-panic-allow-verbose-version-check.patch queue-6.12/rust-map-__kernel_size_t-and-friends-also-to-usize-isize.patch queue-6.12/rust-alloc-add-module-allocator_test.patch queue-6.12/rust-replace-clippy-dbg_macro-with-disallowed_macros.patch queue-6.12/rust-alloc-add-__gfp_nowarn-to-flags.patch queue-6.12/rust-enable-clippy-s-check-private-items.patch queue-6.12/rust-error-make-conversion-functions-public.patch queue-6.12/rust-sort-global-rust-flags.patch queue-6.12/rust-alloc-implement-contains-for-flags.patch queue-6.12/rust-init-remove-unneeded.patch queue-6.12/rust-use-custom-ffi-integer-types.patch queue-6.12/rust-sync-remove-unneeded.patch queue-6.12/rust-treewide-switch-to-the-kernel-vec-type.patch queue-6.12/rust-alloc-implement-kvmalloc-allocator.patch queue-6.12/drm-panic-correctly-indent-continuation-of-line-in-list-item.patch queue-6.12/rust-alloc-implement-kernel-vec-type.patch queue-6.12/rust-workqueue-remove-unneeded.patch queue-6.12/rust-error-optimize-error-type-to-use-nonzero.patch queue-6.12/drm-panic-remove-unnecessary-borrow-in-alignment_pattern.patch queue-6.12/rust-alloc-remove-extension-of-std-s-box.patch queue-6.12/rust-block-fix-formatting-in-gendisk-doc.patch queue-6.12/rust-enable-rustdoc-unescaped_backticks-lint.patch queue-6.12/rust-fix-size_t-in-bindgen-prototypes-of-c-builtins.patch queue-6.12/rust-enable-clippy-undocumented_unsafe_blocks-lint.patch queue-6.12/rust-alloc-add-vec-to-prelude.patch queue-6.12/rust-alloc-implement-intoiterator-for-vec.patch queue-6.12/rust-alloc-implement-kernel-box.patch queue-6.12/drm-panic-remove-redundant-field-when-assigning-value.patch queue-6.12/rust-types-avoid-repetition-in-as-from-bytes-impls.patch queue-6.12/rust-start-using-the-attribute.patch queue-6.12/drm-panic-allow-verbose-boolean-for-clarity.patch queue-6.12/maintainers-add-entry-for-the-rust-alloc-module.patch queue-6.12/rust-alloc-fix-arraylayout-allocations.patch queue-6.12/drm-panic-prefer-eliding-lifetimes.patch
Greg Kroah-Hartman
maintainerQuoted 35 lines · Miguel Ojeda
Hi Greg, Sasha,
Please consider this series for 6.12.y. It should apply cleanly on top of v6.12.18.
These are the patches to backport the
allocseries for Rust, which will be useful for Rust Android Binder and others. It also means that, with this applied, we will not rely on the standard libraryalloc(and the unstablecfgoption we used) anymore in any stable kernel that supports several Rust versions, so e.g. upstream Rust could consider removing thatcfgif they needed.The entire series of cherry-picks apply almost cleanly (only 2 trivial conflicts) -- to achieve that, I included the
#[expect]support, which will make future backports that use that feature easier anyway. That series also enabled some Clippy warnings. We could reduce the series, but the end result is warning-free and Clippy is opt-in anyway. Out-of-tree code could, of course, see some warnings if they use it.I also included a bunch of Clippy warnings cleanups for the DRM QR Code to have this series clean up to Rust 1.85.0 (the latest stable), but I could send them separately if needed.
Finally, I included the "Custom FFI" series backport, which in turn solves the arm64 + Rust 1.85.0 +
CONFIG_RUST_FW_LOADER_ABSTRACTIONS=yissue. It will also make future patches easier to backport, since we will have the sameffi::types.I tested that the entire series builds between every commit for
x86_64LLVM=1with the latest stable and minimum supported Rust compiler versions. I also ran my usual stable kernel tests on the end result; that is, boot-tested in QEMU for several architectures etc. In v6.12.18 for loongarch there is an unrelated error that was not there in v6.12.17 when I did a previous test run -- reported separately.
Quoted 2 lines
Things could still break, so extra tests on the next -rc from users in Cc here would be welcome -- thanks!
All queued up now, thanks!
greg k-h
Hi, I think this is missing one final change, specifically 27c7518e, or rather, the only line of it that applies:
pub unsafe extern "C" fn drm_panic_qr_generate(
- url: *const i8,
+ url: *const kernel::ffi::c_char,
Without it, the build fails on Rust 1.85 / aarch64.
Quoted 192 lines · Miguel Ojeda
Hi Greg, Sasha,
Please consider this series for 6.12.y. It should apply cleanly on top of v6.12.18.
These are the patches to backport the
allocseries for Rust, which will be useful for Rust Android Binder and others. It also means that, with this applied, we will not rely on the standard libraryalloc(and the unstablecfgoption we used) anymore in any stable kernel that supports several Rust versions, so e.g. upstream Rust could consider removing thatcfgif they needed.The entire series of cherry-picks apply almost cleanly (only 2 trivial conflicts) -- to achieve that, I included the
#[expect]support, which will make future backports that use that feature easier anyway. That series also enabled some Clippy warnings. We could reduce the series, but the end result is warning-free and Clippy is opt-in anyway. Out-of-tree code could, of course, see some warnings if they use it.I also included a bunch of Clippy warnings cleanups for the DRM QR Code to have this series clean up to Rust 1.85.0 (the latest stable), but I could send them separately if needed.
Finally, I included the "Custom FFI" series backport, which in turn solves the arm64 + Rust 1.85.0 +
CONFIG_RUST_FW_LOADER_ABSTRACTIONS=yissue. It will also make future patches easier to backport, since we will have the sameffi::types.I tested that the entire series builds between every commit for
x86_64LLVM=1with the latest stable and minimum supported Rust compiler versions. I also ran my usual stable kernel tests on the end result; that is, boot-tested in QEMU for several architectures etc. In v6.12.18 for loongarch there is an unrelated error that was not there in v6.12.17 when I did a previous test run -- reported separately.Things could still break, so extra tests on the next -rc from users in Cc here would be welcome -- thanks!
Cheers,
MiguelAsahi Lina (1):
rust: alloc: FixArrayLayoutallocationsBenno Lossin (1):
rust: alloc: introduceArrayLayoutDanilo Krummrich (28):
rust: alloc: addAllocatortrait
rust: alloc: separatealigned_sizefromkrealloc_aligned
rust: alloc: renameKernelAllocatortoKmalloc
rust: alloc: implementReallocFunc
rust: alloc: makeallocatormodule public
rust: alloc: implementAllocatorforKmalloc
rust: alloc: add moduleallocator_test
rust: alloc: implementVmallocallocator
rust: alloc: implementKVmallocallocator
rust: alloc: add__GFP_NOWARNtoFlags
rust: alloc: implement kernelBox
rust: treewide: switch to our kernelBoxtype
rust: alloc: remove extension of std'sBox
rust: alloc: addBoxto prelude
rust: alloc: implement kernelVectype
rust: alloc: implementIntoIteratorforVec
rust: alloc: implementcollectforIntoIter
rust: treewide: switch to the kernelVectype
rust: alloc: removeVecExtextension
rust: alloc: addVecto prelude
rust: error: usecore::alloc::LayoutError
rust: error: check for configtestinError::name
rust: alloc: implementcontainsforFlags
rust: alloc: implementCmallocin moduleallocator_test
rust: str: test: replacealloc::format
rust: alloc: update module comment ofalloc.rs
kbuild: rust: remove thealloccrate andGlobalAlloc
MAINTAINERS: add entry for the RustallocmoduleEthan D. Twardy (1):
rust: kbuild: expand rusttest target for macrosFilipe Xavier (2):
rust: error: make conversion functions public
rust: error: optimize error type to use nonzeroGary Guo (3):
rust: fixsize_tin bindgen prototypes of C builtins
rust: map__kernel_size_tand friends also to usize/isize
rust: use custom FFI integer typesMiguel Ojeda (17):
rust: workqueue: remove unneeded ``#[allow(clippy::new_ret_no_self)]`
rust: sort global Rust flags
rust: types: avoid repetition in{As,From}Bytesimpls
rust: enableclippy::undocumented_unsafe_blockslint
rust: enableclippy::unnecessary_safety_commentlint
rust: enableclippy::unnecessary_safety_doclint
rust: enableclippy::ignored_unit_patternslint
rust: enablerustdoc::unescaped_backtickslint
rust: init: remove unneeded#[allow(clippy::disallowed_names)]
rust: sync: remove unneeded`#[allow(clippy::non_send_fields_in_send_ty)]`rust: introduce
.clippy.toml
rust: replaceclippy::dbg_macrowithdisallowed_macros
rust: provide proper code documentation titles
rust: enable Clippy'scheck-private-items
Documentation: rust: add coding guidelines on lints
rust: start using the#[expect(...)]attribute
Documentation: rust: discuss#[expect(...)]in the guidelinesThomas Böhler (7):
drm/panic: avoid reimplementingIterator::finddrm/panic: remove unnecessary borrow inalignment_patterndrm/panic: prefer eliding lifetimes
drm/panic: remove redundant field when assigning value drm/panic: correctly indent continuation of line in list item drm/panic: allow verbose boolean for clarity drm/panic: allow verbose version check.clippy.toml | 9 + .gitignore | 1 + Documentation/rust/coding-guidelines.rst | 148 ++++ MAINTAINERS | 8 + Makefile | 15 +- drivers/block/rnull.rs | 4 +- drivers/gpu/drm/drm_panic_qr.rs | 23 +- mm/kasan/kasan_test_rust.rs | 3 +- rust/Makefile | 92 +-- rust/bindgen_parameters | 5 + rust/bindings/bindings_helper.h | 1 + rust/bindings/lib.rs | 6 + rust/exports.c | 1 - rust/ffi.rs | 13 + rust/helpers/helpers.c | 1 + rust/helpers/slab.c | 6 + rust/helpers/vmalloc.c | 9 + rust/kernel/alloc.rs | 150 +++- rust/kernel/alloc/allocator.rs | 208 ++++-- rust/kernel/alloc/allocator_test.rs | 95 +++ rust/kernel/alloc/box_ext.rs | 89 --- rust/kernel/alloc/kbox.rs | 456 +++++++++++ rust/kernel/alloc/kvec.rs | 913 +++++++++++++++++++++++ rust/kernel/alloc/layout.rs | 91 +++ rust/kernel/alloc/vec_ext.rs | 185 ----- rust/kernel/block/mq/operations.rs | 18 +- rust/kernel/block/mq/raw_writer.rs | 2 +- rust/kernel/block/mq/tag_set.rs | 2 +- rust/kernel/error.rs | 79 +- rust/kernel/init.rs | 127 ++-- rust/kernel/init/__internal.rs | 13 +- rust/kernel/init/macros.rs | 18 +- rust/kernel/ioctl.rs | 2 +- rust/kernel/lib.rs | 5 +- rust/kernel/list.rs | 1 + rust/kernel/list/arc_field.rs | 2 +- rust/kernel/net/phy.rs | 16 +- rust/kernel/prelude.rs | 5 +- rust/kernel/print.rs | 5 +- rust/kernel/rbtree.rs | 49 +- rust/kernel/std_vendor.rs | 12 +- rust/kernel/str.rs | 46 +- rust/kernel/sync/arc.rs | 25 +- rust/kernel/sync/arc/std_vendor.rs | 2 + rust/kernel/sync/condvar.rs | 7 +- rust/kernel/sync/lock.rs | 8 +- rust/kernel/sync/lock/mutex.rs | 4 +- rust/kernel/sync/lock/spinlock.rs | 4 +- rust/kernel/sync/locked_by.rs | 2 +- rust/kernel/task.rs | 8 +- rust/kernel/time.rs | 4 +- rust/kernel/types.rs | 140 ++-- rust/kernel/uaccess.rs | 23 +- rust/kernel/workqueue.rs | 29 +- rust/macros/lib.rs | 14 +- rust/macros/module.rs | 8 +- rust/uapi/lib.rs | 6 + samples/rust/rust_minimal.rs | 4 +- samples/rust/rust_print.rs | 1 + scripts/Makefile.build | 4 +- scripts/generate_rust_analyzer.py | 11 +- 61 files changed, 2482 insertions(+), 756 deletions(-) create mode 100644 .clippy.toml create mode 100644 rust/ffi.rs create mode 100644 rust/helpers/vmalloc.c create mode 100644 rust/kernel/alloc/allocator_test.rs delete mode 100644 rust/kernel/alloc/box_ext.rs create mode 100644 rust/kernel/alloc/kbox.rs create mode 100644 rust/kernel/alloc/kvec.rs create mode 100644 rust/kernel/alloc/layout.rs delete mode 100644 rust/kernel/alloc/vec_ext.rs--
2.48.1
Quoted 9 lines · Ilya K
Hi, I think this is missing one final change, specifically
27c7518e, or rather, the only line of it that applies:pub unsafe extern "C" fn drm_panic_qr_generate(
(quoted diff) +1
-1- url: *const i8, + url: *const kernel::ffi::c_char,Without it, the build fails on Rust 1.85 / aarch64.
Bah, sorry, my bad, that is embarrassing... It is not just that one -- the actual remap is not there. Let me re-send...
Greg: no changes except for the 2 extra on top you will see.
It still holds that the x86_64 build still builds commit-by-commit, and I double-checked that hash builds for x86_64, arm64 and riscv64 with the min and max compilers.
Let me also run a test for loongarch64 with the unrelated fix applied.
Cheers,
Miguel
Greg Kroah-Hartman
maintainerQuoted 14 lines · Miguel Ojeda
Quoted 9 lines · Ilya K
Hi, I think this is missing one final change, specifically
27c7518e, or rather, the only line of it that applies:pub unsafe extern "C" fn drm_panic_qr_generate(
(quoted diff) +1
-1- url: *const i8, + url: *const kernel::ffi::c_char,Without it, the build fails on Rust 1.85 / aarch64.
Bah, sorry, my bad, that is embarrassing... It is not just that one -- the actual remap is not there. Let me re-send...
Quoted 7 lines
Greg: no changes except for the 2 extra on top you will see.
It still holds that the
x86_64build still builds commit-by-commit, and I double-checked that hash builds forx86_64, arm64 and riscv64 with the min and max compilers.Let me also run a test for loongarch64 with the unrelated fix applied.
Please just send additional ones, not the whole series, otherwise I'm going to get confused :)
thanks,
greg k-h
Miguel Ojeda
maintainercover The two missing ones
Two missing ones on top of the other 60 -- sorry again! I tested the end result of applying the 62 on top of v6.12.18 with all combinations of:
- The minimum and maximum Rust compiler versions (i.e. 1.78.0 and 1.85.0).
- x86_64, arm64, riscv64 and loongarch64 (this last one with the other unrelated-to-Rust fix on top).
- A defconfig with Rust users enabled (rust_minimal, rust_print, rnull, drm_panic_qr, qt2025, ax88796b_rust) plus a similar with a couple debug options on top (Rust debug assertions and KUnit Rust doctests).
All pass my usual tests, are WERROR=y and Clippy-clean etc.
Plus x86_64 out-of-tree build, a x86_64 subdir build and a x86_64 Rust disabled build. On x86_64, it should still build commit-by-commit.
Cheers,
Miguel
Gary Guo (1):
rust: map long to isize and char to u8
Miguel Ojeda (1):
rust: finish using custom FFI integer types
drivers/gpu/drm/drm_panic_qr.rs | 2 +- rust/ffi.rs | 37 ++++++++++++++++++++++++++++++++- rust/kernel/error.rs | 5 +---- rust/kernel/firmware.rs | 2 +- rust/kernel/uaccess.rs | 27 +++++++----------------- 5 files changed, 46 insertions(+), 27 deletions(-)
--
2.48.1
Miguel Ojeda
maintainerPATCH 1/2 rust: finish using custom FFI integer types
commit 27c7518e7f1ccaaa43eb5f25dc362779d2dc2ccb upstream.
In the last kernel cycle we migrated most of the core::ffi cases in commit d072acda4862 ("rust: use custom FFI integer types"):
Currently FFI integer types are defined in libcore. This commit creates the ffi crate and asks bindgen to use that crate for FFI integer types instead of core::ffi.
This commit is preparatory and no type changes are made in this commit yet.
Finish now the few remaining/new cases so that we perform the actual remapping in the next commit as planned.
--- drivers/gpu/drm/drm_panic_qr.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/drm_panic_qr.rs +1 -1
@@ -931,7 +931,7 @@ fn draw_all(&mut self, data: impl Iterator<Item = u8>) {/// They must remain valid for the duration of the function call. #[no_mangle] pub unsafe extern "C" fn drm_panic_qr_generate ( - url: *const i8 , + url: *const kernel::ffi::c_char , data: *mut u8 , data_len:usize , data_size: usize,
Signature · 1 line
2.48.1
Patch "rust: finish using custom FFI integer types" has been added to the 6.12-stable tree
This is a note to let you know that I've just added the patch titled
rust: finish using custom FFI integer types
to the 6.12-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
rust-finish-using-custom-ffi-integer-types.patch
and it can be found in the queue-6.12 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
From [email protected] Sun Mar 9 21:42:38 2025
From: Miguel Ojeda <[email protected]>
Date: Sun, 9 Mar 2025 21:42:16 +0100
Subject: rust: finish using custom FFI integer types
To: Greg Kroah-Hartman <[email protected]>, Sasha Levin <[email protected]>, [email protected]
Cc: Danilo Krummrich <[email protected]>, Alice Ryhl <[email protected]>, Alyssa Ross <[email protected]>, NoisyCoil <[email protected]>, [email protected], Miguel Ojeda <[email protected]>
Message-ID: <[email protected]>
From: Miguel Ojeda <[email protected]>
commit 27c7518e7f1ccaaa43eb5f25dc362779d2dc2ccb upstream.
In the last kernel cycle we migrated most of the core::ffi cases in commit d072acda4862 ("rust: use custom FFI integer types"):
Currently FFI integer types are defined in libcore. This commit creates the ffi crate and asks bindgen to use that crate for FFI integer types instead of core::ffi.
This commit is preparatory and no type changes are made in this commit yet.
Finish now the few remaining/new cases so that we perform the actual remapping in the next commit as planned.
--- drivers/gpu/drm/drm_panic_qr.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/drm_panic_qr.rs +1 -1
@@ -931,7 +931,7 @@ impl QrImage<'_> {/// They must remain valid for the duration of the function call. #[no_mangle] pub unsafe extern "C" fn drm_panic_qr_generate ( - url: *const i8 , + url: *const kernel::ffi::c_char , data: *mut u8 , data_len:usize , data_size: usize,
Patches currently in stable-queue which might be from [email protected] are
queue-6.12/rust-fix-size_t-in-bindgen-prototypes-of-c-builtins.patch queue-6.12/rust-alloc-add-box-to-prelude.patch queue-6.12/drm-panic-correctly-indent-continuation-of-line-in-list-item.patch queue-6.12/rust-replace-clippy-dbg_macro-with-disallowed_macros.patch queue-6.12/rust-error-use-core-alloc-layouterror.patch queue-6.12/rust-alloc-add-allocator-trait.patch queue-6.12/rust-alloc-fix-arraylayout-allocations.patch queue-6.12/rust-alloc-update-module-comment-of-alloc.rs.patch queue-6.12/rust-map-__kernel_size_t-and-friends-also-to-usize-isize.patch queue-6.12/rust-sync-remove-unneeded.patch queue-6.12/drm-panic-remove-unnecessary-borrow-in-alignment_pattern.patch queue-6.12/rust-error-make-conversion-functions-public.patch queue-6.12/rust-alloc-implement-intoiterator-for-vec.patch queue-6.12/rust-alloc-introduce-arraylayout.patch queue-6.12/rust-alloc-implement-kernel-box.patch queue-6.12/rust-alloc-remove-vecext-extension.patch queue-6.12/rust-alloc-make-allocator-module-public.patch queue-6.12/rust-alloc-add-vec-to-prelude.patch queue-6.12/rust-alloc-implement-vmalloc-allocator.patch queue-6.12/rust-alloc-implement-collect-for-intoiter.patch queue-6.12/rust-enable-rustdoc-unescaped_backticks-lint.patch queue-6.12/rust-error-optimize-error-type-to-use-nonzero.patch queue-6.12/rust-treewide-switch-to-the-kernel-vec-type.patch queue-6.12/rust-alloc-implement-contains-for-flags.patch queue-6.12/rust-start-using-the-attribute.patch queue-6.12/rust-alloc-implement-cmalloc-in-module-allocator_test.patch queue-6.12/rust-introduce-.clippy.toml.patch queue-6.12/rust-alloc-implement-kernel-vec-type.patch queue-6.12/documentation-rust-discuss-in-the-guidelines.patch queue-6.12/rust-alloc-add-module-allocator_test.patch queue-6.12/rust-alloc-implement-allocator-for-kmalloc.patch queue-6.12/rust-treewide-switch-to-our-kernel-box-type.patch queue-6.12/rust-alloc-separate-aligned_size-from-krealloc_aligned.patch queue-6.12/rust-enable-clippy-unnecessary_safety_comment-lint.patch queue-6.12/rust-alloc-remove-extension-of-std-s-box.patch queue-6.12/rust-provide-proper-code-documentation-titles.patch queue-6.12/rust-str-test-replace-alloc-format.patch queue-6.12/rust-enable-clippy-s-check-private-items.patch queue-6.12/drm-panic-avoid-reimplementing-iterator-find.patch queue-6.12/drm-panic-allow-verbose-version-check.patch queue-6.12/rust-enable-clippy-undocumented_unsafe_blocks-lint.patch queue-6.12/rust-enable-clippy-unnecessary_safety_doc-lint.patch queue-6.12/rust-sort-global-rust-flags.patch queue-6.12/maintainers-add-entry-for-the-rust-alloc-module.patch queue-6.12/drm-panic-prefer-eliding-lifetimes.patch queue-6.12/documentation-rust-add-coding-guidelines-on-lints.patch queue-6.12/kbuild-rust-remove-the-alloc-crate-and-globalalloc.patch queue-6.12/rust-kbuild-expand-rusttest-target-for-macros.patch queue-6.12/drm-panic-allow-verbose-boolean-for-clarity.patch queue-6.12/rust-block-fix-formatting-in-gendisk-doc.patch queue-6.12/rust-alloc-add-__gfp_nowarn-to-flags.patch queue-6.12/drm-panic-remove-redundant-field-when-assigning-value.patch queue-6.12/rust-workqueue-remove-unneeded.patch queue-6.12/rust-use-custom-ffi-integer-types.patch queue-6.12/rust-alloc-implement-kvmalloc-allocator.patch queue-6.12/rust-alloc-implement-reallocfunc.patch queue-6.12/loongarch-use-asm_reachable.patch queue-6.12/rust-init-remove-unneeded.patch queue-6.12/rust-enable-clippy-ignored_unit_patterns-lint.patch queue-6.12/rust-map-long-to-isize-and-char-to-u8.patch queue-6.12/rust-alloc-rename-kernelallocator-to-kmalloc.patch queue-6.12/rust-finish-using-custom-ffi-integer-types.patch queue-6.12/rust-error-check-for-config-test-in-error-name.patch queue-6.12/rust-types-avoid-repetition-in-as-from-bytes-impls.patch
Sasha Levin
maintainerRe: [PATCH 6.12.y 1/2] rust: finish using custom FFI integer types
In reply to Miguel Ojeda[ Sasha's backport helper bot ]
Hi,
✅ All tests passed successfully. No issues detected. No action required from the submitter.
The upstream commit SHA1 provided is correct: 27c7518e7f1ccaaa43eb5f25dc362779d2dc2ccb
Status in newer kernel trees:
6.13.y | Present (different SHA1: 0545eb878267)
Note: The patch differs from the upstream commit:
---
1: 27c7518e7f1cc < -: ------------- rust: finish using custom FFI integer types -: ------------- > 1: e14eb7876bb06 rust: finish using custom FFI integer types
---
Results of testing on various branches:
| Branch | Patch Apply | Build Test | |---------------------------|-------------|------------| | stable/linux-6.12.y | Success | Success |
Miguel Ojeda
maintainerPATCH 2/2 rust: map `long` to `isize` and `char` to `u8`
In reply to Miguel OjedaFrom: Gary Guo <[email protected]>
commit 1bae8729e50a900f41e9a1c17ae81113e4cf62b8 upstream.
The following FFI types are replaced compared to core::ffi:
1. char type is now always mapped to u8, since kernel uses -funsigned-char on the C code. core::ffi maps it to platform default ABI, which can be either signed or unsigned.
2. long is now always mapped to isize. It's very common in the kernel to use long to represent a pointer-sized integer, and in fact intptr_t is a typedef of long in the kernel. Enforce this mapping rather than mapping to i32/i64 depending on platform can save us a lot of unnecessary casts.
[ Moved uaccess changes from the next commit, since they were
irrefutable patterns that Rust >= 1.82.0 warns about. Reworded slightly and reformatted a few documentation comments. Rebased on top of rust-next. Added the removal of two casts to avoid Clippy warnings. - Miguel ]
--- rust/ffi.rs | 37 ++++++++++++++++++++++++++++++++++++- rust/kernel/error.rs | 5 +---- rust/kernel/firmware.rs | 2 +- rust/kernel/uaccess.rs | 27 +++++++-------------------- 4 files changed, 45 insertions(+), 26 deletions(-)
rust/ffi.rs +36 -1
@@ -10,4 +10,39 @@#![no_std] -pub use core::ffi::*; +macro_rules! alias { + ($($name:ident = $ty:ty;)*) => {$( +#[allow(non_camel_case_types, missing_docs)] +pub type $name = $ty; + +// Check size compatibility with `core`. +const _: () =assert! ( + core::mem::size_of ::<$name>() == core::mem::size_of ::<core::ffi::$name>() + ); + )*} +} + +alias! { +// `core::ffi::c_char` is either `i8` or `u8` depending on architecture. In the kernel, we use +// `-funsigned-char` so it's always mapped to `u8`. + c_char =u8 ; + + c_schar =i8 ; + c_uchar =u8 ; + + c_short =i16 ; + c_ushort =u16 ; + + c_int =i32 ; + c_uint =u32 ; + +// In the kernel, `intptr_t` is defined to be `long` in all platforms, so we can map the type to +// `isize`. + c_long =isize ; + c_ulong =usize ; + + c_longlong =i64 ; + c_ulonglong =u64 ; +} + +pub use core::ffi::c_void;
rust/kernel/error.rs +1 -4
@@ -153,11 +153,8 @@ pub(crate) fn to_blk_status(self) -> bindings::blk_status_t {/// Returns the error encoded as a pointer. pub fn to_ptr <T >(self) -> *mut T { -#[cfg_attr(target_pointer_width = "32" , allow(clippy::useless_conversion))] // SAFETY: `self.0` is a valid error due to its invariant. -unsafe { - bindings::ERR_PTR (self.0 .get ().into ())as *mut _ - } +unsafe { bindings::ERR_PTR (self.0 .get ()as _ )as *mut _ } }/// Returns a string representing the error, if one exists.
rust/kernel/firmware.rs +1 -1
@@ -12,7 +12,7 @@/// One of the following: `bindings::request_firmware`, `bindings::firmware_request_nowarn`, /// `bindings::firmware_request_platform`, `bindings::request_firmware_direct`. struct FwFunc ( -unsafe extern "C" fn (*mut *const bindings::firmware , *const i8 , *mut bindings::device ) ->i32 , +unsafe extern "C" fn (*mut *const bindings::firmware , *const u8 , *mut bindings::device ) ->i32 , );impl FwFunc {
rust/kernel/uaccess.rs +7 -20
@@ -8,7 +8,7 @@ alloc::Flags, bindings, error::Result, - ffi::{c_ulong, c_void}, + ffi::c_void, prelude::*, types::{AsBytes, FromBytes}, };
@@ -224,13 +224,9 @@ pub fn read_raw(&mut self, out: &mut [MaybeUninit<u8>]) -> Result {if len > self.length {return Err (EFAULT ); } -let Ok (len_ulong) = c_ulong::try_from (len)else { -return Err (EFAULT ); - }; -// SAFETY: `out_ptr` points into a mutable slice of length `len_ulong`, so we may write +// SAFETY: `out_ptr` points into a mutable slice of length `len`, so we may write // that many bytes to it. -let res = -unsafe { bindings::copy_from_user (out_ptr, self.ptras *const c_void , len_ulong) }; +let res =unsafe { bindings::copy_from_user (out_ptr, self.ptras *const c_void , len) };if res !=0 {return Err (EFAULT ); }
@@ -259,9 +255,6 @@ pub fn read<T: FromBytes>(&mut self) -> Result<T> {if len > self.length {return Err (EFAULT ); } -let Ok (len_ulong) = c_ulong::try_from (len)else { -return Err (EFAULT ); - };let mut out:MaybeUninit <T > =MaybeUninit ::uninit ();// SAFETY: The local variable `out` is valid for writing `size_of::<T>()` bytes. //
@@ -272,7 +265,7 @@ pub fn read<T: FromBytes>(&mut self) -> Result<T> { bindings::_copy_from_user ( out.as_mut_ptr ().cast ::<c_void >(), self.ptras *const c_void , - len_ulong, + len, ) };if res !=0 {
@@ -335,12 +328,9 @@ pub fn write_slice(&mut self, data: &[u8]) -> Result {if len > self.length {return Err (EFAULT ); } -let Ok (len_ulong) = c_ulong::try_from (len)else { -return Err (EFAULT ); - }; -// SAFETY: `data_ptr` points into an immutable slice of length `len_ulong`, so we may read +// SAFETY: `data_ptr` points into an immutable slice of length `len`, so we may read // that many bytes from it. -let res =unsafe { bindings::copy_to_user (self.ptras *mut c_void , data_ptr, len_ulong) }; +let res =unsafe { bindings::copy_to_user (self.ptras *mut c_void , data_ptr, len) };if res !=0 {return Err (EFAULT ); }
@@ -359,9 +349,6 @@ pub fn write<T: AsBytes>(&mut self, value: &T) -> Result {if len > self.length {return Err (EFAULT ); } -let Ok (len_ulong) = c_ulong::try_from (len)else { -return Err (EFAULT ); - };// SAFETY: The reference points to a value of type `T`, so it is valid for reading // `size_of::<T>()` bytes. //
@@ -372,7 +359,7 @@ pub fn write<T: AsBytes>(&mut self, value: &T) -> Result { bindings::_copy_to_user ( self.ptras *mut c_void , (valueas *const T ).cast ::<c_void >(), - len_ulong, + len, ) };if res !=0 {
Signature · 1 line
2.48.1
Patch "rust: map `long` to `isize` and `char` to `u8`" has been added to the 6.12-stable tree
This is a note to let you know that I've just added the patch titled
rust: map long to isize and char to u8
to the 6.12-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
rust-map-long-to-isize-and-char-to-u8.patch
and it can be found in the queue-6.12 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
From [email protected] Sun Mar 9 21:42:43 2025
From: Miguel Ojeda <[email protected]>
Date: Sun, 9 Mar 2025 21:42:17 +0100
Subject: rust: map long to isize and char to u8
To: Greg Kroah-Hartman <[email protected]>, Sasha Levin <[email protected]>, [email protected]
Cc: Danilo Krummrich <[email protected]>, Alice Ryhl <[email protected]>, Alyssa Ross <[email protected]>, NoisyCoil <[email protected]>, [email protected], Miguel Ojeda <[email protected]>
Message-ID: <[email protected]>
From: Gary Guo <[email protected]>
commit 1bae8729e50a900f41e9a1c17ae81113e4cf62b8 upstream.
The following FFI types are replaced compared to core::ffi:
1. char type is now always mapped to u8, since kernel uses -funsigned-char on the C code. core::ffi maps it to platform default ABI, which can be either signed or unsigned.
2. long is now always mapped to isize. It's very common in the kernel to use long to represent a pointer-sized integer, and in fact intptr_t is a typedef of long in the kernel. Enforce this mapping rather than mapping to i32/i64 depending on platform can save us a lot of unnecessary casts.
[ Moved uaccess changes from the next commit, since they were
irrefutable patterns that Rust >= 1.82.0 warns about. Reworded slightly and reformatted a few documentation comments. Rebased on top of rust-next. Added the removal of two casts to avoid Clippy warnings. - Miguel ]
--- rust/ffi.rs | 37 ++++++++++++++++++++++++++++++++++++- rust/kernel/error.rs | 5 +---- rust/kernel/firmware.rs | 2 +- rust/kernel/uaccess.rs | 27 +++++++-------------------- 4 files changed, 45 insertions(+), 26 deletions(-)
rust/ffi.rs +36 -1
@@ -10,4 +10,39 @@#![no_std] -pub use core::ffi::*; +macro_rules! alias { + ($($name:ident = $ty:ty;)*) => {$( +#[allow(non_camel_case_types, missing_docs)] +pub type $name = $ty; + +// Check size compatibility with `core`. +const _: () =assert! ( + core::mem::size_of ::<$name>() == core::mem::size_of ::<core::ffi::$name>() + ); + )*} +} + +alias! { +// `core::ffi::c_char` is either `i8` or `u8` depending on architecture. In the kernel, we use +// `-funsigned-char` so it's always mapped to `u8`. + c_char =u8 ; + + c_schar =i8 ; + c_uchar =u8 ; + + c_short =i16 ; + c_ushort =u16 ; + + c_int =i32 ; + c_uint =u32 ; + +// In the kernel, `intptr_t` is defined to be `long` in all platforms, so we can map the type to +// `isize`. + c_long =isize ; + c_ulong =usize ; + + c_longlong =i64 ; + c_ulonglong =u64 ; +} + +pub use core::ffi::c_void;
rust/kernel/error.rs +1 -4
@@ -153,11 +153,8 @@ impl Error {/// Returns the error encoded as a pointer. pub fn to_ptr <T >(self) -> *mut T { -#[cfg_attr(target_pointer_width = "32" , allow(clippy::useless_conversion))] // SAFETY: `self.0` is a valid error due to its invariant. -unsafe { - bindings::ERR_PTR (self.0 .get ().into ())as *mut _ - } +unsafe { bindings::ERR_PTR (self.0 .get ()as _ )as *mut _ } }/// Returns a string representing the error, if one exists.
rust/kernel/firmware.rs +1 -1
@@ -12,7 +12,7 @@ use core::ptr::NonNull;/// One of the following: `bindings::request_firmware`, `bindings::firmware_request_nowarn`, /// `bindings::firmware_request_platform`, `bindings::request_firmware_direct`. struct FwFunc ( -unsafe extern "C" fn (*mut *const bindings::firmware , *const i8 , *mut bindings::device ) ->i32 , +unsafe extern "C" fn (*mut *const bindings::firmware , *const u8 , *mut bindings::device ) ->i32 , );impl FwFunc {
rust/kernel/uaccess.rs +7 -20
@@ -8,7 +8,7 @@ use crate::{ alloc::Flags, bindings, error::Result, - ffi::{c_ulong, c_void}, + ffi::c_void, prelude::*, types::{AsBytes, FromBytes}, };
@@ -224,13 +224,9 @@ impl UserSliceReader {if len > self.length {return Err (EFAULT ); } -let Ok (len_ulong) = c_ulong::try_from (len)else { -return Err (EFAULT ); - }; -// SAFETY: `out_ptr` points into a mutable slice of length `len_ulong`, so we may write +// SAFETY: `out_ptr` points into a mutable slice of length `len`, so we may write // that many bytes to it. -let res = -unsafe { bindings::copy_from_user (out_ptr, self.ptras *const c_void , len_ulong) }; +let res =unsafe { bindings::copy_from_user (out_ptr, self.ptras *const c_void , len) };if res !=0 {return Err (EFAULT ); }
@@ -259,9 +255,6 @@ impl UserSliceReader {if len > self.length {return Err (EFAULT ); } -let Ok (len_ulong) = c_ulong::try_from (len)else { -return Err (EFAULT ); - };let mut out:MaybeUninit <T > =MaybeUninit ::uninit ();// SAFETY: The local variable `out` is valid for writing `size_of::<T>()` bytes. //
@@ -272,7 +265,7 @@ impl UserSliceReader { bindings::_copy_from_user ( out.as_mut_ptr ().cast ::<c_void >(), self.ptras *const c_void , - len_ulong, + len, ) };if res !=0 {
@@ -335,12 +328,9 @@ impl UserSliceWriter {if len > self.length {return Err (EFAULT ); } -let Ok (len_ulong) = c_ulong::try_from (len)else { -return Err (EFAULT ); - }; -// SAFETY: `data_ptr` points into an immutable slice of length `len_ulong`, so we may read +// SAFETY: `data_ptr` points into an immutable slice of length `len`, so we may read // that many bytes from it. -let res =unsafe { bindings::copy_to_user (self.ptras *mut c_void , data_ptr, len_ulong) }; +let res =unsafe { bindings::copy_to_user (self.ptras *mut c_void , data_ptr, len) };if res !=0 {return Err (EFAULT ); }
@@ -359,9 +349,6 @@ impl UserSliceWriter {if len > self.length {return Err (EFAULT ); } -let Ok (len_ulong) = c_ulong::try_from (len)else { -return Err (EFAULT ); - };// SAFETY: The reference points to a value of type `T`, so it is valid for reading // `size_of::<T>()` bytes. //
@@ -372,7 +359,7 @@ impl UserSliceWriter { bindings::_copy_to_user ( self.ptras *mut c_void , (valueas *const T ).cast ::<c_void >(), - len_ulong, + len, ) };if res !=0 {
Patches currently in stable-queue which might be from [email protected] are
queue-6.12/rust-fix-size_t-in-bindgen-prototypes-of-c-builtins.patch queue-6.12/rust-alloc-add-box-to-prelude.patch queue-6.12/drm-panic-correctly-indent-continuation-of-line-in-list-item.patch queue-6.12/rust-replace-clippy-dbg_macro-with-disallowed_macros.patch queue-6.12/rust-error-use-core-alloc-layouterror.patch queue-6.12/rust-alloc-add-allocator-trait.patch queue-6.12/rust-alloc-fix-arraylayout-allocations.patch queue-6.12/rust-alloc-update-module-comment-of-alloc.rs.patch queue-6.12/rust-map-__kernel_size_t-and-friends-also-to-usize-isize.patch queue-6.12/rust-sync-remove-unneeded.patch queue-6.12/drm-panic-remove-unnecessary-borrow-in-alignment_pattern.patch queue-6.12/rust-error-make-conversion-functions-public.patch queue-6.12/rust-alloc-implement-intoiterator-for-vec.patch queue-6.12/rust-alloc-introduce-arraylayout.patch queue-6.12/rust-alloc-implement-kernel-box.patch queue-6.12/rust-alloc-remove-vecext-extension.patch queue-6.12/rust-alloc-make-allocator-module-public.patch queue-6.12/rust-alloc-add-vec-to-prelude.patch queue-6.12/rust-alloc-implement-vmalloc-allocator.patch queue-6.12/rust-alloc-implement-collect-for-intoiter.patch queue-6.12/rust-enable-rustdoc-unescaped_backticks-lint.patch queue-6.12/rust-error-optimize-error-type-to-use-nonzero.patch queue-6.12/rust-treewide-switch-to-the-kernel-vec-type.patch queue-6.12/rust-alloc-implement-contains-for-flags.patch queue-6.12/rust-start-using-the-attribute.patch queue-6.12/rust-alloc-implement-cmalloc-in-module-allocator_test.patch queue-6.12/rust-introduce-.clippy.toml.patch queue-6.12/rust-alloc-implement-kernel-vec-type.patch queue-6.12/documentation-rust-discuss-in-the-guidelines.patch queue-6.12/rust-alloc-add-module-allocator_test.patch queue-6.12/rust-alloc-implement-allocator-for-kmalloc.patch queue-6.12/rust-treewide-switch-to-our-kernel-box-type.patch queue-6.12/rust-alloc-separate-aligned_size-from-krealloc_aligned.patch queue-6.12/rust-enable-clippy-unnecessary_safety_comment-lint.patch queue-6.12/rust-alloc-remove-extension-of-std-s-box.patch queue-6.12/rust-provide-proper-code-documentation-titles.patch queue-6.12/rust-str-test-replace-alloc-format.patch queue-6.12/rust-enable-clippy-s-check-private-items.patch queue-6.12/drm-panic-avoid-reimplementing-iterator-find.patch queue-6.12/drm-panic-allow-verbose-version-check.patch queue-6.12/rust-enable-clippy-undocumented_unsafe_blocks-lint.patch queue-6.12/rust-enable-clippy-unnecessary_safety_doc-lint.patch queue-6.12/rust-sort-global-rust-flags.patch queue-6.12/maintainers-add-entry-for-the-rust-alloc-module.patch queue-6.12/drm-panic-prefer-eliding-lifetimes.patch queue-6.12/documentation-rust-add-coding-guidelines-on-lints.patch queue-6.12/kbuild-rust-remove-the-alloc-crate-and-globalalloc.patch queue-6.12/rust-kbuild-expand-rusttest-target-for-macros.patch queue-6.12/drm-panic-allow-verbose-boolean-for-clarity.patch queue-6.12/rust-block-fix-formatting-in-gendisk-doc.patch queue-6.12/rust-alloc-add-__gfp_nowarn-to-flags.patch queue-6.12/drm-panic-remove-redundant-field-when-assigning-value.patch queue-6.12/rust-workqueue-remove-unneeded.patch queue-6.12/rust-use-custom-ffi-integer-types.patch queue-6.12/rust-alloc-implement-kvmalloc-allocator.patch queue-6.12/rust-alloc-implement-reallocfunc.patch queue-6.12/loongarch-use-asm_reachable.patch queue-6.12/rust-init-remove-unneeded.patch queue-6.12/rust-enable-clippy-ignored_unit_patterns-lint.patch queue-6.12/rust-map-long-to-isize-and-char-to-u8.patch queue-6.12/rust-alloc-rename-kernelallocator-to-kmalloc.patch queue-6.12/rust-finish-using-custom-ffi-integer-types.patch queue-6.12/rust-error-check-for-config-test-in-error-name.patch queue-6.12/rust-types-avoid-repetition-in-as-from-bytes-impls.patch
Sasha Levin
maintainerRe: [PATCH 6.12.y 2/2] rust: map `long` to `isize` and `char` to `u8`
In reply to Miguel Ojeda[ Sasha's backport helper bot ]
Hi,
Summary of potential issues:
ℹ️ This is part 2/2 of a series
❌ Build failures detected
The upstream commit SHA1 provided is correct: 1bae8729e50a900f41e9a1c17ae81113e4cf62b8
WARNING: Author mismatch between patch and upstream commit:
Backport author: Miguel Ojeda<[email protected]> Commit author: Gary Guo<[email protected]>
Status in newer kernel trees:
6.13.y | Present (different SHA1: 7efbbb5407e7)
Note: The patch differs from the upstream commit:
---
Failed to apply patch cleanly.
---
NOTE: These results are for this patch alone. Full series testing will be performed when all parts are received.
Results of testing on various branches:
| Branch | Patch Apply | Build Test | |---------------------------|-------------|------------| | stable/linux-6.12.y | Failed | N/A |
Build Errors:
Patch failed to apply on stable/linux-6.12.y. Reject:
diff a/rust/kernel/error.rs b/rust/kernel/error.rs (rejected hunks)
@@ -153,11 +153,8 @@ pub(crate) fn to_blk_status(self) -> bindings::blk_status_t {
/// Returns the error encoded as a pointer.
pub fn to_ptr<T>(self) -> *mut T {
- #[cfg_attr(target_pointer_width = "32", allow(clippy::useless_conversion))]
// SAFETY: `self.0` is a valid error due to its invariant.- unsafe {
- bindings::ERR_PTR(self.0.get().into()) as *mut _
- }
+ unsafe { bindings::ERR_PTR(self.0.get() as _) as *mut _ }
}
/// Returns a string representing the error, if one exists.diff a/rust/kernel/uaccess.rs b/rust/kernel/uaccess.rs (rejected hunks)
@@ -8,7 +8,7 @@
alloc::Flags,
bindings,
error::Result,
- ffi::{c_ulong, c_void},
+ ffi::c_void,
prelude::*,
types::{AsBytes, FromBytes},};
Re: [PATCH 6.12.y 2/2] rust: map `long` to `isize` and `char` to `u8`
Quoted 10 lines · Sasha Levin
[ Sasha's backport helper bot ]
Summary of potential issues:
ℹ️ This is part 2/2 of a series
❌ Build failures detectedFailed to apply patch cleanly.
Patch failed to apply on stable/linux-6.12.y. Reject:
Hmm... these patches are already applied in -rc.
I guess the bot picked up these 2 "independent" patches that were not really independent but rather were meant to be applied on top of the other 60 I sent.
All 62 were applied by Greg, the 2-series at commit 9cbe3832da9c ("rust: map long to isize and char to u8") and the 60-series at commit bfc1c86b1e13 ("rust: alloc: Fix ArrayLayout allocations").
I hope that helps!
Cheers,
Miguel
Greg Kroah-Hartman
maintainerRe: [PATCH 6.12.y 0/2] The two missing ones
In reply to Miguel OjedaQuoted 33 lines · Miguel Ojeda
Two missing ones on top of the other 60 -- sorry again! I tested the end result of applying the 62 on top of v6.12.18 with all combinations of:
- The minimum and maximum Rust compiler versions (i.e. 1.78.0 and 1.85.0).
-
x86_64, arm64, riscv64 and loongarch64 (this last one with the other unrelated-to-Rust fix on top).- A defconfig with Rust users enabled (
rust_minimal,rust_print, rnull,drm_panic_qr, qt2025,ax88796b_rust) plus a similar with a couple debug options on top (Rust debug assertions and KUnit Rust doctests).All pass my usual tests, are
WERROR=yand Clippy-clean etc.Plus
x86_64out-of-tree build, ax86_64subdir build and ax86_64Rust disabled build. Onx86_64, it should still build commit-by-commit.Cheers,
MiguelGary Guo (1):
rust: maplongtoisizeandchartou8Miguel Ojeda (1):
rust: finish using custom FFI integer typesdrivers/gpu/drm/drm_panic_qr.rs | 2 +- rust/ffi.rs | 37 ++++++++++++++++++++++++++++++++- rust/kernel/error.rs | 5 +---- rust/kernel/firmware.rs | 2 +- rust/kernel/uaccess.rs | 27 +++++++----------------- 5 files changed, 46 insertions(+), 27 deletions(-)
Quoted 3 lines
--
2.48.1
Now queued up, thanks.
greg k-h