On Wed, Jul 09, 2025 at 01:36:14PM +0200, Petr Mladek wrote: > On Tue 2025-07-08 16:48:47, Arnd Bergmann wrote: > > On Tue, Jul 8, 2025, at 16:24, Petr Mladek wrote: > > > On Wed 2025-07-02 13:28:35, Nathan Chancellor wrote: > > >> On Wed, Jul 02, 2025 at 11:51:56AM +0200, Petr Mladek wrote: > > > > > > Thanks a lot for the nice report. > > > > > > The problem is how cpumask_var_t is defined in > > > include/linux/cpumask_types.h: > > > > > > #ifdef CONFIG_CPUMASK_OFFSTACK > > > typedef struct cpumask *cpumask_var_t; > > > #else > > > typedef struct cpumask cpumask_var_t[1]; > > > #endif /* CONFIG_CPUMASK_OFFSTACK */ > > > > > > And KUNIT_DEFINE_ACTION_WRAPPER() expect that the 3rd parameter > > > is a pointer. > > > > > > I am going to solve this by adding a wrapper over free_cpumask_var() > > > which would work with a pointer to cpumask_var_t. > > > > I'm not familiar enough with the cleanup mechanism of kunit, > > but can't you just move the mask allocation outside of > > test_readerwriter()? > > The only solution would be global variable.
When the cpumask is allocated on the stack, free_cpumask_var() is a no-op. So while the stack address would be leaked to another thread, it should be fine as nothing is ever done with it. For more clarity it could also be gated explicitly: if (IS_ENABLED(CONFIG_CPUMASK_OFFSTACK)) { err = kunit_add_action_or_reset(test, prbtest_cpumask_cleanup, test_cpus); KUNIT_ASSERT_EQ(test, err, 0); } <snip>