On Tue, Jul 01, 2025 at 02:22:40PM +0900, Daniel Latypov wrote:
On Mon, Jun 30, 2025 at 3:32 PM Tzung-Bi Shih tzungbi@kernel.org wrote:
On Tue, May 20, 2025 at 09:04:53AM -0700, Daniel Latypov wrote:
You mention you don't like how static stubs requires modifying the code-under-test. Since it gets eliminated by the preprocessor unless you're compiling for KUnit, is the concern more so about how it conceptually feels wrong to do so? For the Android GKI kernel, they have (or had) KUnit enabled so there is potentially concern about real runtime cost there, not sure if you have something similar in mind.
Not exactly. Ideally, I think we shouldn't modify the CUT. I'm wondering if there is a way to not change the CUT but also break the external dependencies.
But stepping back, ftrace_stubs technically require modifying the code to make sure funcs are marked as `noinline`, which this patch series does not do.
...
They could be partially inlined even though they are exported symbols.
So to summarize, right now we're stuck with having to modify the code. (Unless someone can come up with something really clever, but not too clever)
To make it concrete, the current approach would look like:
int func(char* arg1, int arg2) { KUNIT_STATIC_STUB_REDIRECT(func, arg1, arg2); ... // unchanged }
vs an ftrace/kprobe approach that needs a conditional `noinline`
KUNIT_STUBBABLE int func(char* arg1, int arg2) { ... // unchanged }
The latter is definitely simpler and less burdensome. But I don't know if it's simpler enough to warrant a second implementation existing for me personally.
Instead of KUNIT_STUBBABLE macros, I was thinking of:
diff --git a/Makefile b/Makefile index 35e6e5240c61..40319083f58b 100644 --- a/Makefile +++ b/Makefile @@ -979,6 +979,10 @@ ifdef CONFIG_DEBUG_SECTION_MISMATCH KBUILD_CFLAGS += -fno-inline-functions-called-once endif
+ifdef CONFIG_KUNIT_KPROBE_STUBS +KBUILD_CFLAGS += -fno-inline +endif + # `rustc`'s `-Zfunction-sections` applies to data too (as of 1.59.0). ifdef CONFIG_LD_DEAD_CODE_DATA_ELIMINATION KBUILD_CFLAGS_KERNEL += -ffunction-sections -fdata-sections
I don't know what are most people's usages. I always run KUnit tests in qemu or at least in some real devices that I less care about the performance. Thus, turning inline off globally in such environments is totally acceptable.