Skip to contentSkip to conversation

samples: rust: debugfs: fix excessive stack use

PATCH Applied Gary Guo 5 participants 5 messages Jul 16 – Jul 21

Subsystems (2)
lore
Share & tools
lore

Gary Guo

author
#0 lore raw

PATCH 1/1 samples: rust: debugfs: fix excessive stack use

From: Gary Guo <[email protected]>

The current implementation creates a 4K array and move it into the box. Klint reports that this causes excesssive stack usage:

warning: stack size of create_file_write is 4472 bytes, exceeds the 2048-byte limit
--> samples/rust/rust_debugfs_scoped.rs:54:1

   |
54 | / fn create_file_write(
55 | |     mod_data: &ModuleData,
56 | |     reader: &mut kernel::uaccess::UserSliceReader,
57 | | ) -> Result {
   | |___________^
   |

= note: the stack size is inferred from instruction sub $0x1178,%rsp at .text+2205

Use pin-init to create the array in-place instead.

Fixes f656279afde1 ("samples: rust: debugfs_scoped: add example for blobs")
---
 samples/rust/rust_debugfs_scoped.rs | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
samples/rust/rust_debugfs_scoped.rs +1 -1
index 6a575a15a2c2..33a4a0865f5b 100644
@@ -75,7 +75,7 @@ fn create_file_write(
             GFP_KERNEL,
         )?;
     }
-    let blob = KBox::pin_init(new_mutex!([0x42; SZ_4K]), GFP_KERNEL)?;
+    let blob = KBox::pin_init(new_mutex!(pin_init::init_array_from_fn(|_| 0x42)), GFP_KERNEL)?;
 
     let scope = KBox::pin_init(
         mod_data.device_dir.scope(

base-commit: b8809969e1d7a591e0f49dd464a5d04b3cf02ab1

Signature · 1 line
2.54.0
reviewer Reviewed-by on v1 1/1
#1 lore raw
Quoted 29 lines · Gary Guo

From: Gary Guo <[email protected]>

The current implementation creates a 4K array and move it into the box. Klint reports that this causes excesssive stack usage:

warning: stack size of create_file_write is 4472 bytes, exceeds the 2048-byte limit
--> samples/rust/rust_debugfs_scoped.rs:54:1

   |
54 | / fn create_file_write(
55 | |     mod_data: &ModuleData,
56 | |     reader: &mut kernel::uaccess::UserSliceReader,
57 | | ) -> Result {
   | |___________^
   |

= note: the stack size is inferred from instruction sub $0x1178,%rsp at .text+2205

Use pin-init to create the array in-place instead.

Fixes f656279afde1 ("samples: rust: debugfs_scoped: add example for blobs")
---
 samples/rust/rust_debugfs_scoped.rs | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
samples/rust/rust_debugfs_scoped.rs +0 -0
index 6a575a15a2c2..33a4a0865f5b 100644

samples/rust/rust_debugfs_scoped.rs fn create_file_write( · line 78

Quoted 5 lines
samples/rust/rust_debugfs_scoped.rs +1 -1
@@ -75,7 +75,7 @@ fn create_file_write(
             GFP_KERNEL,
         )?;
     }
-    let blob = KBox::pin_init(new_mutex!([0x42; SZ_4K]), GFP_KERNEL)?;
+    let blob = KBox::pin_init(new_mutex!(pin_init::init_array_from_fn(|_| 0x42)), GFP_KERNEL)?;

Since this is a sample, do we want to specify the size explicitly as it is arguably more readable in this case?

Regardless,

reviewer
#2 lore raw
Quoted 25 lines · Alexandre Courbot
Quoted 24 lines · Gary Guo

From: Gary Guo <[email protected]>

The current implementation creates a 4K array and move it into the box. Klint reports that this causes excesssive stack usage:

warning: stack size of create_file_write is 4472 bytes, exceeds the 2048-byte limit
--> samples/rust/rust_debugfs_scoped.rs:54:1

   |
54 | / fn create_file_write(
55 | |     mod_data: &ModuleData,
56 | |     reader: &mut kernel::uaccess::UserSliceReader,
57 | | ) -> Result {
   | |___________^
   |

= note: the stack size is inferred from instruction sub $0x1178,%rsp at .text+2205

Use pin-init to create the array in-place instead.

Fixes f656279afde1 ("samples: rust: debugfs_scoped: add example for blobs")
---
 samples/rust/rust_debugfs_scoped.rs | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
Quoted 13 lines

samples/rust/rust_debugfs_scoped.rs fn create_file_write( · line 78

Quoted 10 lines
samples/rust/rust_debugfs_scoped.rs +1 -1
index 6a575a15a2c2..33a4a0865f5b 100644
@@ -75,7 +75,7 @@ fn create_file_write(
             GFP_KERNEL,
         )?;
     }
-    let blob = KBox::pin_init(new_mutex!([0x42; SZ_4K]), GFP_KERNEL)?;
+    let blob = KBox::pin_init(new_mutex!(pin_init::init_array_from_fn(|_| 0x42)), GFP_KERNEL)?;

Since this is a sample, do we want to specify the size explicitly as it is arguably more readable in this case?

It's not easy to specify size with init_array_from_fn because you need to specify additionally Init, T and E, so it'll become

    init_array_from_fn::<_, SZ_4K, _, _>

which is ugly.

Best,
Gary

#3 lore raw
In reply to Gary Guo
kernel test robot noticed the following build errors:

Hi Gary,

kernel test robot noticed the following build errors:

[auto build test ERROR on b8809969e1d7a591e0f49dd464a5d04b3cf02ab1]

url:    https://github.com/intel-lab-lkp/linux/commits/Gary-Guo/samples-rust-debugfs-fix-excessive-stack-use/20260717-053803
base:   b8809969e1d7a591e0f49dd464a5d04b3cf02ab1
patch link:    https://lore.kernel.org/r/20260716144144.3665719-1-gary%40kernel.org
patch subject: [PATCH] samples: rust: debugfs: fix excessive stack use
config: x86_64-rhel-9.4-rust (https://download.01.org/0day-ci/archive/20260717/[email protected]/config)
compiler: clang version 22.1.8 (https://github.com/llvm/llvm-project ca7933e47d3a3451d81e72ac174dcb5aa28b59d1)
rustc: rustc 1.96.0 (ac68faa20 2026-05-25)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260717/[email protected]/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <[email protected]>
| Closes: https://lore.kernel.org/oe-kbuild-all/[email protected]/

All errors (new ones prefixed by >>):

   PATH=/opt/cross/clang-22/bin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
   INFO PATH=/opt/cross/rustc-1.96.0-bindgen-0.72.1/cargo/bin:/opt/cross/clang-22/bin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
   /usr/bin/timeout -k 100 12h /usr/bin/make KCFLAGS=\ -fno-crash-diagnostics\ -Wno-error=return-type\ -Wreturn-type\ -funsigned-char\ -Wundef\ -falign-functions=64 W=1 --keep-going LLVM=1 -j384 -C source O=/kbuild/obj/consumer/x86_64-rhel-9.4-rust ARCH=x86_64 SHELL=/bin/bash rustfmtcheck 
   make: Entering directory '/kbuild/src'
   make[1]: Entering directory '/kbuild/obj/consumer/x86_64-rhel-9.4-rust'
   Diff in rust/kernel/cpufreq.rs:792:
        }
        /// Driver's `adjust_perf` callback.
   -    fn adjust_perf(_policy: &mut Policy, _min_perf: usize, _target_perf: usize,
   -                   _max_perf: usize, _capacity: usize) {
   +    fn adjust_perf(
   +        _policy: &mut Policy,
   +        _min_perf: usize,
   +        _target_perf: usize,
   +        _max_perf: usize,
   +        _capacity: usize,
   +    ) {
            build_error!(VTABLE_DEFAULT_ERROR)
        }
   Diff in rust/kernel/cpufreq.rs:792:
        }
        /// Driver's `adjust_perf` callback.
   -    fn adjust_perf(_policy: &mut Policy, _min_perf: usize, _target_perf: usize,
   -                   _max_perf: usize, _capacity: usize) {
   +    fn adjust_perf(
   +        _policy: &mut Policy,
   +        _min_perf: usize,
   +        _target_perf: usize,
   +        _max_perf: usize,
   +        _capacity: usize,
   +    ) {
            build_error!(VTABLE_DEFAULT_ERROR)
        }
>> Diff in samples/rust/rust_debugfs_scoped.rs:75:
                GFP_KERNEL,
            )?;
        }
   -    let blob = KBox::pin_init(new_mutex!(pin_init::init_array_from_fn(|_| 0x42)), GFP_KERNEL)?;
   +    let blob = KBox::pin_init(
   +        new_mutex!(pin_init::init_array_from_fn(|_| 0x42)),
   +        GFP_KERNEL,
   +    )?;
    
        let scope = KBox::pin_init(
            mod_data.device_dir.scope(

make[2]: *** [Makefile:2029: rustfmt] Error 123
make[2]: Target 'rustfmtcheck' not remade because of errors. make[1]: Leaving directory '/kbuild/obj/consumer/x86_64-rhel-9.4-rust' make[1]: *** [Makefile:248: __sub-make] Error 2
make[1]: Target 'rustfmtcheck' not remade because of errors.
make: *** [Makefile:248: __sub-make] Error 2
make: Target 'rustfmtcheck' not remade because of errors.
make: Leaving directory '/kbuild/src'

--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki

maintainer Applied
#4 lore raw
In reply to Gary Guo
Quoted 1 line · Gary Guo

[PATCH] samples: rust: debugfs: fix excessive stack use

Applied, thanks!

Branch: driver-core-testing
Tree: git://git.kernel.org/pub/scm/linux/kernel/git/driver-core/driver-core.git

[1/1] samples: rust: debugfs: fix excessive stack use
commit: f5256ad60651

[ Make the patch rustfmtcheck complient. - Danilo ]

The patch will appear in the next linux-next integration (typically within 24 hours on weekdays).

The patch is in the driver-core-testing branch and will be promoted to driver-core-next after validation.