* [PATCH] selftests: livepatch: unset sub_make_done in case top level Makefile be overwritten
@ 2026-05-25 8:37 Zelin Deng
2026-06-19 14:42 ` Miroslav Benes
0 siblings, 1 reply; 10+ messages in thread
From: Zelin Deng @ 2026-05-25 8:37 UTC (permalink / raw)
To: mbenes, shuah; +Cc: linux-kselftest, Zelin Deng
After I did: make kselftest-all in top level of kernel source tree, top
level Makefile was overwritten by auto generated contents by
filechk_makefile:
[root@emr: /home/shiyu.dzl/linux-next]$ cat Makefile
export KBUILD_OUTPUT = .
export KBUILD_EXTMOD = /home/shiyu.dzl/linux-next
export KBUILD_EXTMOD_OUTPUT = /home/shiyu.dzl/linux-next
include /home/shiyu.dzl/linux-next/Makefile
Top-level Makefile export sub_make_done=1, leaks into unrelated re-invocations
of the top-level Makefile when recursive descent through selftests -
building test_module of livepatch. That causes KBUILD_EXTMOD setup to be
skipped, which leads to a relative/absolute path mismatch in srcroot vs
CURDIR, falsely setting building_out_of_srctree, and ultimately overwriting
the source tree's Makefile with a generated stub.
Clear sub_make_done before re-invoking the kernel Makefile.
Fixes: c4bbe83d27c2 ("livepatch: Move tests from lib/livepatch to selftests/livepatch")
Signed-off-by: Zelin Deng <zelin.deng@linux.alibaba.com>
---
tools/testing/selftests/livepatch/test_modules/Makefile | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/tools/testing/selftests/livepatch/test_modules/Makefile b/tools/testing/selftests/livepatch/test_modules/Makefile
index a13d398585dc..b78657089ab7 100644
--- a/tools/testing/selftests/livepatch/test_modules/Makefile
+++ b/tools/testing/selftests/livepatch/test_modules/Makefile
@@ -19,11 +19,11 @@ obj-m += test_klp_atomic_replace.o \
# Ensure that KDIR exists, otherwise skip the compilation
modules:
ifneq ("$(wildcard $(KDIR))", "")
- $(Q)$(MAKE) -C $(KDIR) modules KBUILD_EXTMOD=$(TESTMODS_DIR)
+ $(Q)unset sub_make_done && $(MAKE) -C $(KDIR) modules KBUILD_EXTMOD=$(TESTMODS_DIR)
endif
# Ensure that KDIR exists, otherwise skip the clean target
clean:
ifneq ("$(wildcard $(KDIR))", "")
- $(Q)$(MAKE) -C $(KDIR) clean KBUILD_EXTMOD=$(TESTMODS_DIR)
+ $(Q)unset sub_make_done && $(MAKE) -C $(KDIR) clean KBUILD_EXTMOD=$(TESTMODS_DIR)
endif
--
2.43.7
^ permalink raw reply related [flat|nested] 10+ messages in thread* Re: [PATCH] selftests: livepatch: unset sub_make_done in case top level Makefile be overwritten 2026-05-25 8:37 [PATCH] selftests: livepatch: unset sub_make_done in case top level Makefile be overwritten Zelin Deng @ 2026-06-19 14:42 ` Miroslav Benes 2026-06-21 14:36 ` Zelin Deng 0 siblings, 1 reply; 10+ messages in thread From: Miroslav Benes @ 2026-06-19 14:42 UTC (permalink / raw) To: Zelin Deng; +Cc: shuah, linux-kselftest, live-patching, mpdesouza On Mon, 25 May 2026, Zelin Deng wrote: > After I did: make kselftest-all in top level of kernel source tree, top > level Makefile was overwritten by auto generated contents by > filechk_makefile: > [root@emr: /home/shiyu.dzl/linux-next]$ cat Makefile > export KBUILD_OUTPUT = . > export KBUILD_EXTMOD = /home/shiyu.dzl/linux-next > export KBUILD_EXTMOD_OUTPUT = /home/shiyu.dzl/linux-next > include /home/shiyu.dzl/linux-next/Makefile > > Top-level Makefile export sub_make_done=1, leaks into unrelated re-invocations > of the top-level Makefile when recursive descent through selftests - > building test_module of livepatch. That causes KBUILD_EXTMOD setup to be > skipped, which leads to a relative/absolute path mismatch in srcroot vs > CURDIR, falsely setting building_out_of_srctree, and ultimately overwriting > the source tree's Makefile with a generated stub. > > Clear sub_make_done before re-invoking the kernel Makefile. > > Fixes: c4bbe83d27c2 ("livepatch: Move tests from lib/livepatch to selftests/livepatch") > Signed-off-by: Zelin Deng <zelin.deng@linux.alibaba.com> Adding Marcos and KLP ML. I cannot reproduce and I do not understand it much from the changelog (I am by far not a Kbuild expert). Could you share the exact steps to reproduce please? If I just run 'make kselftest-all' in the top level, it passes and livepatch test_modules are not even touched. Miroslav ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH] selftests: livepatch: unset sub_make_done in case top level Makefile be overwritten 2026-06-19 14:42 ` Miroslav Benes @ 2026-06-21 14:36 ` Zelin Deng 2026-06-30 14:32 ` Petr Mladek 0 siblings, 1 reply; 10+ messages in thread From: Zelin Deng @ 2026-06-21 14:36 UTC (permalink / raw) To: Miroslav Benes; +Cc: shuah, linux-kselftest, live-patching, mpdesouza 在 2026/6/19 22:42, Miroslav Benes 写道: > On Mon, 25 May 2026, Zelin Deng wrote: > >> After I did: make kselftest-all in top level of kernel source tree, top >> level Makefile was overwritten by auto generated contents by >> filechk_makefile: >> [root@emr: /home/shiyu.dzl/linux-next]$ cat Makefile >> export KBUILD_OUTPUT = . >> export KBUILD_EXTMOD = /home/shiyu.dzl/linux-next >> export KBUILD_EXTMOD_OUTPUT = /home/shiyu.dzl/linux-next >> include /home/shiyu.dzl/linux-next/Makefile >> >> Top-level Makefile export sub_make_done=1, leaks into unrelated re-invocations >> of the top-level Makefile when recursive descent through selftests - >> building test_module of livepatch. That causes KBUILD_EXTMOD setup to be >> skipped, which leads to a relative/absolute path mismatch in srcroot vs >> CURDIR, falsely setting building_out_of_srctree, and ultimately overwriting >> the source tree's Makefile with a generated stub. >> >> Clear sub_make_done before re-invoking the kernel Makefile. >> >> Fixes: c4bbe83d27c2 ("livepatch: Move tests from lib/livepatch to selftests/livepatch") >> Signed-off-by: Zelin Deng <zelin.deng@linux.alibaba.com> > Adding Marcos and KLP ML. > > I cannot reproduce and I do not understand it much from the changelog (I > am by far not a Kbuild expert). Could you share the exact steps to > reproduce please? If I just run 'make kselftest-all' in the top level, it > passes and livepatch test_modules are not even touched. > > Miroslav Thank you for replying. Per my understanding, to build livepatch test_modules KDIR must be either set explicitly when doing 'make kselftest-all KDIR=<path-to-kernel-build-dir>' or have the kernel devel package installed. Otherwise the compilation could be skipped. (see tools/testing/selftests/livepatch/test_modules/Makefile) KDIR ?= /lib/modules/$(shell uname -r)/build ... # Ensure that KDIR exists, otherwise skip the compilation modules: ifneq ("$(wildcard $(KDIR))", "") $(Q)$(MAKE) -C $(KDIR) modules KBUILD_EXTMOD=$(TESTMODS_DIR) endif ... Here're how I reproduce the issue: 1. pull linux-next, reset to HEAD, for example 3ce97bd3c4f18608335e709c24d6a40e7036cab8 (tag next-20260619) 2. at linux-next tree: make all -j$(nproc) && make modules_install headers_install -j$(nproc) && make install && reboot 3. at linux-next tree: make kselftest-all 4. top level Makefile in linux-next has been overwritten by export KBUILD_OUTPUT = . export KBUILD_EXTMOD = /home/shiyu.dzl/linux-next export KBUILD_EXTMOD_OUTPUT = /home/shiyu.dzl/linux-next include /home/shiyu.dzl/linux-next/Makefile it is a stub generated by filechk_makefile. I'm not quite sure that it could be related to my toolchain (like make version ?), I briefed analysis the root cause on my environment (KDIR '/lib/modules/7.1.0-next-20260619/build' which actually a symbol link to my kernel source -> '/home/shiyu.dzl/linux-next'): 1. sub_make_done leaks via environment. The top-level Makefile sets export sub_make_done := 1 after its first-pass initialization. Because it is exported, every child make process inherits it. 2. livepatch test_modules re-invokes the top-level Makefile. The call chain is: top-level Makefile → kselftest-% pattern rule → tools/testing/selftests/ → livepatch test_modules/Makefile → $(MAKE) -C $(KDIR) modules KBUILD_EXTMOD=..., which re-enters the top-level Makefile to build an external module. 3. The inherited sub_make_done=1 skips critical initialization. The top-level Makefile's first-pass block (ifneq ($(sub_make_done),1)) is skipped entirely. This block is responsible for correctly parsing command-line variables and setting up KBUILD_EXTMOD-related paths. 4. Path mismatch triggers false out-of-tree detection. With the initialization skipped, srcroot and CURDIR end up with mismatched values (e.g., absolute vs. relative). The comparison (ifeq ($(srcroot),$(CURDIR))) fails, so building_out_of_srctree is incorrectly set to 1. 5. outputmakefile overwrites the source tree's Makefile. Because building_out_of_srctree is set, the filechk_makefile rule fires and replaces the real top-level Makefile with a generated stub containing KBUILD_OUTPUT, KBUILD_EXTMOD, and an include directive. Why make -C tools/testing/selftests/ all is unaffected: it enters the selftests directory directly without ever executing the top-level Makefile first, so sub_make_done is never exported into the environment. When livepatch test_modules later invokes $(MAKE) -C $(KDIR), the top-level Makefile runs its full initialization normally. Thanks, Zelin ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH] selftests: livepatch: unset sub_make_done in case top level Makefile be overwritten 2026-06-21 14:36 ` Zelin Deng @ 2026-06-30 14:32 ` Petr Mladek 2026-06-30 16:12 ` Thomas Weißschuh 0 siblings, 1 reply; 10+ messages in thread From: Petr Mladek @ 2026-06-30 14:32 UTC (permalink / raw) To: Zelin Deng Cc: Miroslav Benes, shuah, linux-kselftest, live-patching, mpdesouza, Thomas Weißschuh, Nathan Chancellor, Nicolas Schier, linux-kbuild Added some people involved in "filechk_makefile" feature into Cc. For the new people, see the whole thread at https://lore.kernel.org/all/20260525083721.27857-1-zelin.deng@linux.alibaba.com/ On Sun 2026-06-21 22:36:24, Zelin Deng wrote: > > 在 2026/6/19 22:42, Miroslav Benes 写道: > > On Mon, 25 May 2026, Zelin Deng wrote: > > > > > After I did: make kselftest-all in top level of kernel source tree, top > > > level Makefile was overwritten by auto generated contents by > > > filechk_makefile: > > > [root@emr: /home/shiyu.dzl/linux-next]$ cat Makefile > > > export KBUILD_OUTPUT = . > > > export KBUILD_EXTMOD = /home/shiyu.dzl/linux-next > > > export KBUILD_EXTMOD_OUTPUT = /home/shiyu.dzl/linux-next > > > include /home/shiyu.dzl/linux-next/Makefile > > > > > > Top-level Makefile export sub_make_done=1, leaks into unrelated re-invocations > > > of the top-level Makefile when recursive descent through selftests - > > > building test_module of livepatch. That causes KBUILD_EXTMOD setup to be > > > skipped, which leads to a relative/absolute path mismatch in srcroot vs > > > CURDIR, falsely setting building_out_of_srctree, and ultimately overwriting > > > the source tree's Makefile with a generated stub. > > > > > > Clear sub_make_done before re-invoking the kernel Makefile. > > > > > > Fixes: c4bbe83d27c2 ("livepatch: Move tests from lib/livepatch to selftests/livepatch") > > > Signed-off-by: Zelin Deng <zelin.deng@linux.alibaba.com> > > Adding Marcos and KLP ML. > > > > I cannot reproduce and I do not understand it much from the changelog (I > > am by far not a Kbuild expert). Could you share the exact steps to > > reproduce please? If I just run 'make kselftest-all' in the top level, it > > passes and livepatch test_modules are not even touched. > > > > Miroslav > > Thank you for replying. > > Per my understanding, to build livepatch test_modules KDIR must be either > set explicitly when doing 'make kselftest-all > KDIR=<path-to-kernel-build-dir>' or have the kernel devel package installed. > Otherwise the compilation could be skipped. (see > tools/testing/selftests/livepatch/test_modules/Makefile) > > KDIR ?= /lib/modules/$(shell uname -r)/build > > ... > > # Ensure that KDIR exists, otherwise skip the compilation > modules: > ifneq ("$(wildcard $(KDIR))", "") > $(Q)$(MAKE) -C $(KDIR) modules KBUILD_EXTMOD=$(TESTMODS_DIR) > endif > > ... > > Here're how I reproduce the issue: > > 1. pull linux-next, reset to HEAD, for example > 3ce97bd3c4f18608335e709c24d6a40e7036cab8 (tag next-20260619) > > 2. at linux-next tree: make all -j$(nproc) && make modules_install > headers_install -j$(nproc) && make install && reboot > > 3. at linux-next tree: make kselftest-all > > 4. top level Makefile in linux-next has been overwritten by > > export KBUILD_OUTPUT = . > export KBUILD_EXTMOD = /home/shiyu.dzl/linux-next > export KBUILD_EXTMOD_OUTPUT = /home/shiyu.dzl/linux-next > include /home/shiyu.dzl/linux-next/Makefile > > it is a stub generated by filechk_makefile. It seems that "filechk_makefile" has reached mainline in v7.1-rc1, see the commit c9bb03ac2c66bc5aa81b ("kbuild: reduce output spam when building out of tree"). The commit message says: <paste> The Makefile is now created even if the build is aborted due to an unclean working tree. That should not make a difference in practice. </paste> It seems that is actually makes a difference in the livepatch selftest case. Sigh, the Makefile rules are a maze to me. It is possible that we do something wrong in tools/testing/selftests/livepatch/test_modules/Makefile. Namely with: ifneq ("$(wildcard $(KDIR))", "") $(Q)$(MAKE) -C $(KDIR) modules KBUILD_EXTMOD=$(TESTMODS_DIR) endif But I see "$(MAKE) -C ..." called in many other makefiles. Best Regards, Petr > I'm not quite sure that it could be related to my toolchain (like make > version ?), I briefed analysis the root cause on my environment (KDIR > '/lib/modules/7.1.0-next-20260619/build' which actually a symbol link to my > kernel source -> '/home/shiyu.dzl/linux-next'): > > 1. sub_make_done leaks via environment. The top-level Makefile sets export > sub_make_done := 1 after its first-pass initialization. > Because it is exported, every child make process inherits it. > 2. livepatch test_modules re-invokes the top-level Makefile. The call > chain is: top-level Makefile → kselftest-% pattern rule → > tools/testing/selftests/ → livepatch test_modules/Makefile → $(MAKE) -C > $(KDIR) modules KBUILD_EXTMOD=..., which re-enters the top-level Makefile to > build an external module. > 3. The inherited sub_make_done=1 skips critical initialization. The > top-level Makefile's first-pass block (ifneq ($(sub_make_done),1)) is > skipped entirely. This block is responsible for correctly parsing > command-line variables and setting up KBUILD_EXTMOD-related paths. > 4. Path mismatch triggers false out-of-tree detection. With the > initialization skipped, srcroot and CURDIR end up with mismatched values > (e.g., > absolute vs. relative). The comparison (ifeq ($(srcroot),$(CURDIR))) > fails, so building_out_of_srctree is incorrectly set to 1. > 5. outputmakefile overwrites the source tree's Makefile. Because > building_out_of_srctree is set, the filechk_makefile rule fires and replaces > the > real top-level Makefile with a generated stub containing KBUILD_OUTPUT, > KBUILD_EXTMOD, and an include directive. > > Why make -C tools/testing/selftests/ all is unaffected: it enters the > selftests directory directly without ever executing the top-level Makefile > first, so sub_make_done is never exported into the environment. When > livepatch test_modules later invokes $(MAKE) -C $(KDIR), the top-level > Makefile > runs its full initialization normally. > > Thanks, > > Zelin > ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH] selftests: livepatch: unset sub_make_done in case top level Makefile be overwritten 2026-06-30 14:32 ` Petr Mladek @ 2026-06-30 16:12 ` Thomas Weißschuh 2026-07-01 15:14 ` Petr Mladek 0 siblings, 1 reply; 10+ messages in thread From: Thomas Weißschuh @ 2026-06-30 16:12 UTC (permalink / raw) To: Zelin Deng, Petr Mladek Cc: Miroslav Benes, shuah, linux-kselftest, live-patching, mpdesouza, Nathan Chancellor, Nicolas Schier, linux-kbuild Hi Zelin, On Tue, Jun 30, 2026 at 04:32:16PM +0200, Petr Mladek wrote: > Added some people involved in "filechk_makefile" feature into Cc. > > For the new people, see the whole thread at > https://lore.kernel.org/all/20260525083721.27857-1-zelin.deng@linux.alibaba.com/ Thanks for the report and forwarding it. > On Sun 2026-06-21 22:36:24, Zelin Deng wrote: > > > > 在 2026/6/19 22:42, Miroslav Benes 写道: > > > On Mon, 25 May 2026, Zelin Deng wrote: > > > > > > > After I did: make kselftest-all in top level of kernel source tree, top > > > > level Makefile was overwritten by auto generated contents by > > > > filechk_makefile: > > > > [root@emr: /home/shiyu.dzl/linux-next]$ cat Makefile > > > > export KBUILD_OUTPUT = . > > > > export KBUILD_EXTMOD = /home/shiyu.dzl/linux-next > > > > export KBUILD_EXTMOD_OUTPUT = /home/shiyu.dzl/linux-next > > > > include /home/shiyu.dzl/linux-next/Makefile > > > > > > > > Top-level Makefile export sub_make_done=1, leaks into unrelated re-invocations > > > > of the top-level Makefile when recursive descent through selftests - > > > > building test_module of livepatch. That causes KBUILD_EXTMOD setup to be > > > > skipped, which leads to a relative/absolute path mismatch in srcroot vs > > > > CURDIR, falsely setting building_out_of_srctree, and ultimately overwriting > > > > the source tree's Makefile with a generated stub. > > > > > > > > Clear sub_make_done before re-invoking the kernel Makefile. > > > > > > > > Fixes: c4bbe83d27c2 ("livepatch: Move tests from lib/livepatch to selftests/livepatch") > > > > Signed-off-by: Zelin Deng <zelin.deng@linux.alibaba.com> > > > Adding Marcos and KLP ML. > > > > > > I cannot reproduce and I do not understand it much from the changelog (I > > > am by far not a Kbuild expert). Could you share the exact steps to > > > reproduce please? If I just run 'make kselftest-all' in the top level, it > > > passes and livepatch test_modules are not even touched. > > > > > > Miroslav > > > > Thank you for replying. > > > > Per my understanding, to build livepatch test_modules KDIR must be either > > set explicitly when doing 'make kselftest-all > > KDIR=<path-to-kernel-build-dir>' or have the kernel devel package installed. > > Otherwise the compilation could be skipped. (see > > tools/testing/selftests/livepatch/test_modules/Makefile) > > > > KDIR ?= /lib/modules/$(shell uname -r)/build > > > > ... > > > > # Ensure that KDIR exists, otherwise skip the compilation > > modules: > > ifneq ("$(wildcard $(KDIR))", "") > > $(Q)$(MAKE) -C $(KDIR) modules KBUILD_EXTMOD=$(TESTMODS_DIR) > > endif > > > > ... > > > > Here're how I reproduce the issue: > > > > 1. pull linux-next, reset to HEAD, for example > > 3ce97bd3c4f18608335e709c24d6a40e7036cab8 (tag next-20260619) > > > > 2. at linux-next tree: make all -j$(nproc) && make modules_install > > headers_install -j$(nproc) && make install && reboot > > > > 3. at linux-next tree: make kselftest-all > > > > 4. top level Makefile in linux-next has been overwritten by > > > > export KBUILD_OUTPUT = . > > export KBUILD_EXTMOD = /home/shiyu.dzl/linux-next > > export KBUILD_EXTMOD_OUTPUT = /home/shiyu.dzl/linux-next > > include /home/shiyu.dzl/linux-next/Makefile > > > > it is a stub generated by filechk_makefile. > > It seems that "filechk_makefile" has reached mainline in v7.1-rc1, > see the commit c9bb03ac2c66bc5aa81b ("kbuild: reduce output spam when > building out of tree"). > > The commit message says: > > <paste> > The Makefile is now created even if the build is aborted due to an > unclean working tree. That should not make a difference in practice. > </paste> > > It seems that is actually makes a difference in the livepatch selftest > case. > > Sigh, the Makefile rules are a maze to me. It is possible that > we do something wrong in > tools/testing/selftests/livepatch/test_modules/Makefile. Namely > with: > > ifneq ("$(wildcard $(KDIR))", "") > $(Q)$(MAKE) -C $(KDIR) modules KBUILD_EXTMOD=$(TESTMODS_DIR) > endif > > But I see "$(MAKE) -C ..." called in many other makefiles. > > Best Regards, > Petr > > > I'm not quite sure that it could be related to my toolchain (like make > > version ?), I briefed analysis the root cause on my environment (KDIR > > '/lib/modules/7.1.0-next-20260619/build' which actually a symbol link to my > > kernel source -> '/home/shiyu.dzl/linux-next'): > > > > 1. sub_make_done leaks via environment. The top-level Makefile sets export > > sub_make_done := 1 after its first-pass initialization. > > Because it is exported, every child make process inherits it. > > 2. livepatch test_modules re-invokes the top-level Makefile. The call > > chain is: top-level Makefile → kselftest-% pattern rule → > > tools/testing/selftests/ → livepatch test_modules/Makefile → $(MAKE) -C > > $(KDIR) modules KBUILD_EXTMOD=..., which re-enters the top-level Makefile to > > build an external module. > > 3. The inherited sub_make_done=1 skips critical initialization. The > > top-level Makefile's first-pass block (ifneq ($(sub_make_done),1)) is > > skipped entirely. This block is responsible for correctly parsing > > command-line variables and setting up KBUILD_EXTMOD-related paths. > > 4. Path mismatch triggers false out-of-tree detection. With the > > initialization skipped, srcroot and CURDIR end up with mismatched values > > (e.g., > > absolute vs. relative). The comparison (ifeq ($(srcroot),$(CURDIR))) > > fails, so building_out_of_srctree is incorrectly set to 1. > > 5. outputmakefile overwrites the source tree's Makefile. Because > > building_out_of_srctree is set, the filechk_makefile rule fires and replaces > > the > > real top-level Makefile with a generated stub containing KBUILD_OUTPUT, > > KBUILD_EXTMOD, and an include directive. > > > > Why make -C tools/testing/selftests/ all is unaffected: it enters the > > selftests directory directly without ever executing the top-level Makefile > > first, so sub_make_done is never exported into the environment. When > > livepatch test_modules later invokes $(MAKE) -C $(KDIR), the top-level > > Makefile > > runs its full initialization normally. Can you try this: diff --git a/Makefile b/Makefile index b9c5792c79e0..f717a4dc96d6 100644 --- a/Makefile +++ b/Makefile @@ -1591,10 +1591,10 @@ tools/%: FORCE PHONY += kselftest kselftest: headers - $(Q)$(MAKE) -C $(srctree)/tools/testing/selftests run_tests + $(Q)unset sub_make_done; $(MAKE) -C $(srctree)/tools/testing/selftests run_tests kselftest-%: headers FORCE - $(Q)$(MAKE) -C $(srctree)/tools/testing/selftests $* + $(Q)unset sub_make_done; $(MAKE) -C $(srctree)/tools/testing/selftests $* PHONY += kselftest-merge kselftest-merge: The same is done for cmd_install. Thomas ^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [PATCH] selftests: livepatch: unset sub_make_done in case top level Makefile be overwritten 2026-06-30 16:12 ` Thomas Weißschuh @ 2026-07-01 15:14 ` Petr Mladek 2026-07-01 15:19 ` Thomas Weißschuh 0 siblings, 1 reply; 10+ messages in thread From: Petr Mladek @ 2026-07-01 15:14 UTC (permalink / raw) To: Thomas Weißschuh Cc: Zelin Deng, Miroslav Benes, shuah, linux-kselftest, live-patching, mpdesouza, Nathan Chancellor, Nicolas Schier, linux-kbuild On Tue 2026-06-30 18:12:46, Thomas Weißschuh wrote: > Hi Zelin, > > On Tue, Jun 30, 2026 at 04:32:16PM +0200, Petr Mladek wrote: > > Added some people involved in "filechk_makefile" feature into Cc. > > > > For the new people, see the whole thread at > > https://lore.kernel.org/all/20260525083721.27857-1-zelin.deng@linux.alibaba.com/ > > Thanks for the report and forwarding it. > > > On Sun 2026-06-21 22:36:24, Zelin Deng wrote: > > > > > > 在 2026/6/19 22:42, Miroslav Benes 写道: > > > > On Mon, 25 May 2026, Zelin Deng wrote: > > > Here're how I reproduce the issue: > > > > > > 1. pull linux-next, reset to HEAD, for example > > > 3ce97bd3c4f18608335e709c24d6a40e7036cab8 (tag next-20260619) > > > > > > 2. at linux-next tree: make all -j$(nproc) && make modules_install > > > headers_install -j$(nproc) && make install && reboot > > > > > > 3. at linux-next tree: make kselftest-all > > > > > > 4. top level Makefile in linux-next has been overwritten by > > > > > > export KBUILD_OUTPUT = . > > > export KBUILD_EXTMOD = /home/shiyu.dzl/linux-next > > > export KBUILD_EXTMOD_OUTPUT = /home/shiyu.dzl/linux-next > > > include /home/shiyu.dzl/linux-next/Makefile > > > > > > it is a stub generated by filechk_makefile. > > > > It seems that "filechk_makefile" has reached mainline in v7.1-rc1, > > see the commit c9bb03ac2c66bc5aa81b ("kbuild: reduce output spam when > > building out of tree"). > > > > The commit message says: > > > > <paste> > > The Makefile is now created even if the build is aborted due to an > > unclean working tree. That should not make a difference in practice. > > </paste> > > > > It seems that is actually makes a difference in the livepatch selftest > > case. > > > > Sigh, the Makefile rules are a maze to me. It is possible that > > we do something wrong in > > tools/testing/selftests/livepatch/test_modules/Makefile. Namely > > with: > > > > ifneq ("$(wildcard $(KDIR))", "") > > $(Q)$(MAKE) -C $(KDIR) modules KBUILD_EXTMOD=$(TESTMODS_DIR) > > endif > > > > But I see "$(MAKE) -C ..." called in many other makefiles. > > > > Best Regards, > > Petr > > > > > I'm not quite sure that it could be related to my toolchain (like make > > > version ?), I briefed analysis the root cause on my environment (KDIR > > > '/lib/modules/7.1.0-next-20260619/build' which actually a symbol link to my > > > kernel source -> '/home/shiyu.dzl/linux-next'): > > > > > > 1. sub_make_done leaks via environment. The top-level Makefile sets export > > > sub_make_done := 1 after its first-pass initialization. > > > Because it is exported, every child make process inherits it. > > > 2. livepatch test_modules re-invokes the top-level Makefile. The call > > > chain is: top-level Makefile → kselftest-% pattern rule → > > > tools/testing/selftests/ → livepatch test_modules/Makefile → $(MAKE) -C > > > $(KDIR) modules KBUILD_EXTMOD=..., which re-enters the top-level Makefile to > > > build an external module. > > > 3. The inherited sub_make_done=1 skips critical initialization. The > > > top-level Makefile's first-pass block (ifneq ($(sub_make_done),1)) is > > > skipped entirely. This block is responsible for correctly parsing > > > command-line variables and setting up KBUILD_EXTMOD-related paths. > > > 4. Path mismatch triggers false out-of-tree detection. With the > > > initialization skipped, srcroot and CURDIR end up with mismatched values > > > (e.g., > > > absolute vs. relative). The comparison (ifeq ($(srcroot),$(CURDIR))) > > > fails, so building_out_of_srctree is incorrectly set to 1. > > > 5. outputmakefile overwrites the source tree's Makefile. Because > > > building_out_of_srctree is set, the filechk_makefile rule fires and replaces > > > the > > > real top-level Makefile with a generated stub containing KBUILD_OUTPUT, > > > KBUILD_EXTMOD, and an include directive. > > > > > > Why make -C tools/testing/selftests/ all is unaffected: it enters the > > > selftests directory directly without ever executing the top-level Makefile > > > first, so sub_make_done is never exported into the environment. When > > > livepatch test_modules later invokes $(MAKE) -C $(KDIR), the top-level > > > Makefile > > > runs its full initialization normally. > > Can you try this: > > diff --git a/Makefile b/Makefile > index b9c5792c79e0..f717a4dc96d6 100644 > --- a/Makefile > +++ b/Makefile > @@ -1591,10 +1591,10 @@ tools/%: FORCE > > PHONY += kselftest > kselftest: headers > - $(Q)$(MAKE) -C $(srctree)/tools/testing/selftests run_tests > + $(Q)unset sub_make_done; $(MAKE) -C $(srctree)/tools/testing/selftests run_tests > > kselftest-%: headers FORCE > - $(Q)$(MAKE) -C $(srctree)/tools/testing/selftests $* > + $(Q)unset sub_make_done; $(MAKE) -C $(srctree)/tools/testing/selftests $* > > PHONY += kselftest-merge > kselftest-merge: Heh, this is exactly the same change which Zelin Deng proposed as well, see https://lore.kernel.org/all/20260525083721.27857-1-zelin.deng@linux.alibaba.com/ > The same is done for cmd_install. I guess that this is related to the commit 14ccc638b02f9ec ("kbuild: cancel sub_make_done for the install target to fix DKMS"). Which is related to the commit bcf637f54f6d2515d ("kbuild: parse C= and M= before changing the working directory"). Honestly, it all looks like a wild magic to me. I would need much better understanding of the Makefile maze to get on top of it. But it seems that it is a reasonable fix after all. It solves the original problem. It does not break my workflow. So, I tend to add: Acked-by: Petr Mladek <pmladek@suse.com> Best Regards, Petr ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH] selftests: livepatch: unset sub_make_done in case top level Makefile be overwritten 2026-07-01 15:14 ` Petr Mladek @ 2026-07-01 15:19 ` Thomas Weißschuh 2026-07-02 2:40 ` Zelin Deng 0 siblings, 1 reply; 10+ messages in thread From: Thomas Weißschuh @ 2026-07-01 15:19 UTC (permalink / raw) To: Petr Mladek Cc: Zelin Deng, Miroslav Benes, shuah, linux-kselftest, live-patching, mpdesouza, Nathan Chancellor, Nicolas Schier, linux-kbuild On Wed, Jul 01, 2026 at 05:14:24PM +0200, Petr Mladek wrote: > On Tue 2026-06-30 18:12:46, Thomas Weißschuh wrote: > > Hi Zelin, > > > > On Tue, Jun 30, 2026 at 04:32:16PM +0200, Petr Mladek wrote: > > > Added some people involved in "filechk_makefile" feature into Cc. > > > > > > For the new people, see the whole thread at > > > https://lore.kernel.org/all/20260525083721.27857-1-zelin.deng@linux.alibaba.com/ > > > > Thanks for the report and forwarding it. > > > > > On Sun 2026-06-21 22:36:24, Zelin Deng wrote: > > > > > > > > 在 2026/6/19 22:42, Miroslav Benes 写道: > > > > > On Mon, 25 May 2026, Zelin Deng wrote: > > > > Here're how I reproduce the issue: > > > > > > > > 1. pull linux-next, reset to HEAD, for example > > > > 3ce97bd3c4f18608335e709c24d6a40e7036cab8 (tag next-20260619) > > > > > > > > 2. at linux-next tree: make all -j$(nproc) && make modules_install > > > > headers_install -j$(nproc) && make install && reboot > > > > > > > > 3. at linux-next tree: make kselftest-all > > > > > > > > 4. top level Makefile in linux-next has been overwritten by > > > > > > > > export KBUILD_OUTPUT = . > > > > export KBUILD_EXTMOD = /home/shiyu.dzl/linux-next > > > > export KBUILD_EXTMOD_OUTPUT = /home/shiyu.dzl/linux-next > > > > include /home/shiyu.dzl/linux-next/Makefile > > > > > > > > it is a stub generated by filechk_makefile. > > > > > > It seems that "filechk_makefile" has reached mainline in v7.1-rc1, > > > see the commit c9bb03ac2c66bc5aa81b ("kbuild: reduce output spam when > > > building out of tree"). > > > > > > The commit message says: > > > > > > <paste> > > > The Makefile is now created even if the build is aborted due to an > > > unclean working tree. That should not make a difference in practice. > > > </paste> > > > > > > It seems that is actually makes a difference in the livepatch selftest > > > case. > > > > > > Sigh, the Makefile rules are a maze to me. It is possible that > > > we do something wrong in > > > tools/testing/selftests/livepatch/test_modules/Makefile. Namely > > > with: > > > > > > ifneq ("$(wildcard $(KDIR))", "") > > > $(Q)$(MAKE) -C $(KDIR) modules KBUILD_EXTMOD=$(TESTMODS_DIR) > > > endif > > > > > > But I see "$(MAKE) -C ..." called in many other makefiles. > > > > > > Best Regards, > > > Petr > > > > > > > I'm not quite sure that it could be related to my toolchain (like make > > > > version ?), I briefed analysis the root cause on my environment (KDIR > > > > '/lib/modules/7.1.0-next-20260619/build' which actually a symbol link to my > > > > kernel source -> '/home/shiyu.dzl/linux-next'): > > > > > > > > 1. sub_make_done leaks via environment. The top-level Makefile sets export > > > > sub_make_done := 1 after its first-pass initialization. > > > > Because it is exported, every child make process inherits it. > > > > 2. livepatch test_modules re-invokes the top-level Makefile. The call > > > > chain is: top-level Makefile → kselftest-% pattern rule → > > > > tools/testing/selftests/ → livepatch test_modules/Makefile → $(MAKE) -C > > > > $(KDIR) modules KBUILD_EXTMOD=..., which re-enters the top-level Makefile to > > > > build an external module. > > > > 3. The inherited sub_make_done=1 skips critical initialization. The > > > > top-level Makefile's first-pass block (ifneq ($(sub_make_done),1)) is > > > > skipped entirely. This block is responsible for correctly parsing > > > > command-line variables and setting up KBUILD_EXTMOD-related paths. > > > > 4. Path mismatch triggers false out-of-tree detection. With the > > > > initialization skipped, srcroot and CURDIR end up with mismatched values > > > > (e.g., > > > > absolute vs. relative). The comparison (ifeq ($(srcroot),$(CURDIR))) > > > > fails, so building_out_of_srctree is incorrectly set to 1. > > > > 5. outputmakefile overwrites the source tree's Makefile. Because > > > > building_out_of_srctree is set, the filechk_makefile rule fires and replaces > > > > the > > > > real top-level Makefile with a generated stub containing KBUILD_OUTPUT, > > > > KBUILD_EXTMOD, and an include directive. > > > > > > > > Why make -C tools/testing/selftests/ all is unaffected: it enters the > > > > selftests directory directly without ever executing the top-level Makefile > > > > first, so sub_make_done is never exported into the environment. When > > > > livepatch test_modules later invokes $(MAKE) -C $(KDIR), the top-level > > > > Makefile > > > > runs its full initialization normally. > > > > Can you try this: > > > > diff --git a/Makefile b/Makefile > > index b9c5792c79e0..f717a4dc96d6 100644 > > --- a/Makefile > > +++ b/Makefile > > @@ -1591,10 +1591,10 @@ tools/%: FORCE > > > > PHONY += kselftest > > kselftest: headers > > - $(Q)$(MAKE) -C $(srctree)/tools/testing/selftests run_tests > > + $(Q)unset sub_make_done; $(MAKE) -C $(srctree)/tools/testing/selftests run_tests > > > > kselftest-%: headers FORCE > > - $(Q)$(MAKE) -C $(srctree)/tools/testing/selftests $* > > + $(Q)unset sub_make_done; $(MAKE) -C $(srctree)/tools/testing/selftests $* > > > > PHONY += kselftest-merge > > kselftest-merge: > > Heh, this is exactly the same change which Zelin Deng proposed as > well, see > https://lore.kernel.org/all/20260525083721.27857-1-zelin.deng@linux.alibaba.com/ The difference is that my proposal is in the toplevel Makefile while Zelin's is in the selftest one. The toplevel one should fix all selftests at the same time. > > The same is done for cmd_install. > > I guess that this is related to the commit 14ccc638b02f9ec ("kbuild: > cancel sub_make_done for the install target to fix DKMS"). Which > is related to the commit bcf637f54f6d2515d ("kbuild: parse C= and M= > before changing the working directory"). > > Honestly, it all looks like a wild magic to me. I would need much > better understanding of the Makefile maze to get on top of it. I was not able to reproduce the issue yet. My proposal is just a guess. We'll need feedback from Zelin. > But it seems that it is a reasonable fix after all. It solves the > original problem. It does not break my workflow. So, I tend to add: > > Acked-by: Petr Mladek <pmladek@suse.com> Thomas ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH] selftests: livepatch: unset sub_make_done in case top level Makefile be overwritten 2026-07-01 15:19 ` Thomas Weißschuh @ 2026-07-02 2:40 ` Zelin Deng 2026-07-02 7:11 ` Thomas Weißschuh 0 siblings, 1 reply; 10+ messages in thread From: Zelin Deng @ 2026-07-02 2:40 UTC (permalink / raw) To: Thomas Weißschuh, Petr Mladek Cc: Miroslav Benes, shuah, linux-kselftest, live-patching, mpdesouza, Nathan Chancellor, Nicolas Schier, linux-kbuild 在 2026/7/1 23:19, Thomas Weißschuh 写道: > On Wed, Jul 01, 2026 at 05:14:24PM +0200, Petr Mladek wrote: >> On Tue 2026-06-30 18:12:46, Thomas Weißschuh wrote: >>> Hi Zelin, >>> >>> On Tue, Jun 30, 2026 at 04:32:16PM +0200, Petr Mladek wrote: >>>> Added some people involved in "filechk_makefile" feature into Cc. >>>> >>>> For the new people, see the whole thread at >>>> https://lore.kernel.org/all/20260525083721.27857-1-zelin.deng@linux.alibaba.com/ >>> Thanks for the report and forwarding it. >>> >>>> On Sun 2026-06-21 22:36:24, Zelin Deng wrote: >>>>> 在 2026/6/19 22:42, Miroslav Benes 写道: >>>>>> On Mon, 25 May 2026, Zelin Deng wrote: >>>>> Here're how I reproduce the issue: >>>>> >>>>> 1. pull linux-next, reset to HEAD, for example >>>>> 3ce97bd3c4f18608335e709c24d6a40e7036cab8 (tag next-20260619) >>>>> >>>>> 2. at linux-next tree: make all -j$(nproc) && make modules_install >>>>> headers_install -j$(nproc) && make install && reboot >>>>> >>>>> 3. at linux-next tree: make kselftest-all >>>>> >>>>> 4. top level Makefile in linux-next has been overwritten by >>>>> >>>>> export KBUILD_OUTPUT = . >>>>> export KBUILD_EXTMOD = /home/shiyu.dzl/linux-next >>>>> export KBUILD_EXTMOD_OUTPUT = /home/shiyu.dzl/linux-next >>>>> include /home/shiyu.dzl/linux-next/Makefile >>>>> >>>>> it is a stub generated by filechk_makefile. >>>> It seems that "filechk_makefile" has reached mainline in v7.1-rc1, >>>> see the commit c9bb03ac2c66bc5aa81b ("kbuild: reduce output spam when >>>> building out of tree"). >>>> >>>> The commit message says: >>>> >>>> <paste> >>>> The Makefile is now created even if the build is aborted due to an >>>> unclean working tree. That should not make a difference in practice. >>>> </paste> >>>> >>>> It seems that is actually makes a difference in the livepatch selftest >>>> case. >>>> >>>> Sigh, the Makefile rules are a maze to me. It is possible that >>>> we do something wrong in >>>> tools/testing/selftests/livepatch/test_modules/Makefile. Namely >>>> with: >>>> >>>> ifneq ("$(wildcard $(KDIR))", "") >>>> $(Q)$(MAKE) -C $(KDIR) modules KBUILD_EXTMOD=$(TESTMODS_DIR) >>>> endif >>>> >>>> But I see "$(MAKE) -C ..." called in many other makefiles. >>>> >>>> Best Regards, >>>> Petr >>>> >>>>> I'm not quite sure that it could be related to my toolchain (like make >>>>> version ?), I briefed analysis the root cause on my environment (KDIR >>>>> '/lib/modules/7.1.0-next-20260619/build' which actually a symbol link to my >>>>> kernel source -> '/home/shiyu.dzl/linux-next'): >>>>> >>>>> 1. sub_make_done leaks via environment. The top-level Makefile sets export >>>>> sub_make_done := 1 after its first-pass initialization. >>>>> Because it is exported, every child make process inherits it. >>>>> 2. livepatch test_modules re-invokes the top-level Makefile. The call >>>>> chain is: top-level Makefile → kselftest-% pattern rule → >>>>> tools/testing/selftests/ → livepatch test_modules/Makefile → $(MAKE) -C >>>>> $(KDIR) modules KBUILD_EXTMOD=..., which re-enters the top-level Makefile to >>>>> build an external module. >>>>> 3. The inherited sub_make_done=1 skips critical initialization. The >>>>> top-level Makefile's first-pass block (ifneq ($(sub_make_done),1)) is >>>>> skipped entirely. This block is responsible for correctly parsing >>>>> command-line variables and setting up KBUILD_EXTMOD-related paths. >>>>> 4. Path mismatch triggers false out-of-tree detection. With the >>>>> initialization skipped, srcroot and CURDIR end up with mismatched values >>>>> (e.g., >>>>> absolute vs. relative). The comparison (ifeq ($(srcroot),$(CURDIR))) >>>>> fails, so building_out_of_srctree is incorrectly set to 1. >>>>> 5. outputmakefile overwrites the source tree's Makefile. Because >>>>> building_out_of_srctree is set, the filechk_makefile rule fires and replaces >>>>> the >>>>> real top-level Makefile with a generated stub containing KBUILD_OUTPUT, >>>>> KBUILD_EXTMOD, and an include directive. >>>>> >>>>> Why make -C tools/testing/selftests/ all is unaffected: it enters the >>>>> selftests directory directly without ever executing the top-level Makefile >>>>> first, so sub_make_done is never exported into the environment. When >>>>> livepatch test_modules later invokes $(MAKE) -C $(KDIR), the top-level >>>>> Makefile >>>>> runs its full initialization normally. >>> Can you try this: >>> >>> diff --git a/Makefile b/Makefile >>> index b9c5792c79e0..f717a4dc96d6 100644 >>> --- a/Makefile >>> +++ b/Makefile >>> @@ -1591,10 +1591,10 @@ tools/%: FORCE >>> >>> PHONY += kselftest >>> kselftest: headers >>> - $(Q)$(MAKE) -C $(srctree)/tools/testing/selftests run_tests >>> + $(Q)unset sub_make_done; $(MAKE) -C $(srctree)/tools/testing/selftests run_tests >>> >>> kselftest-%: headers FORCE >>> - $(Q)$(MAKE) -C $(srctree)/tools/testing/selftests $* >>> + $(Q)unset sub_make_done; $(MAKE) -C $(srctree)/tools/testing/selftests $* >>> >>> PHONY += kselftest-merge >>> kselftest-merge: >> Heh, this is exactly the same change which Zelin Deng proposed as >> well, see >> https://lore.kernel.org/all/20260525083721.27857-1-zelin.deng@linux.alibaba.com/ > The difference is that my proposal is in the toplevel Makefile while > Zelin's is in the selftest one. The toplevel one should fix all selftests at > the same time. Thank you Petr. Yeah, Thomas's proposal is in top-level Makefile - if any other selftest also re-invokes the top-level Makefile with KBUILD_EXTMOD, it'd be covered too. > >>> The same is done for cmd_install. >> I guess that this is related to the commit 14ccc638b02f9ec ("kbuild: >> cancel sub_make_done for the install target to fix DKMS"). Which >> is related to the commit bcf637f54f6d2515d ("kbuild: parse C= and M= >> before changing the working directory"). >> >> Honestly, it all looks like a wild magic to me. I would need much >> better understanding of the Makefile maze to get on top of it. > I was not able to reproduce the issue yet. My proposal is just a guess. > We'll need feedback from Zelin. I had verify your proposal, it worked well - liveupatch kmod was built successfully and top-level Makefile wasn't overwritten any more. Petr thank you for your Ack, I think Thomas's proposal is better than mine, we don't have to do the quirk everytime when new selftest kmod is added. Thomas, so do I have to send a updated patch or you will do it by youself? > >> But it seems that it is a reasonable fix after all. It solves the >> original problem. It does not break my workflow. So, I tend to add: >> >> Acked-by: Petr Mladek <pmladek@suse.com> > > Thomas ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH] selftests: livepatch: unset sub_make_done in case top level Makefile be overwritten 2026-07-02 2:40 ` Zelin Deng @ 2026-07-02 7:11 ` Thomas Weißschuh 2026-07-02 8:09 ` Zelin Deng 0 siblings, 1 reply; 10+ messages in thread From: Thomas Weißschuh @ 2026-07-02 7:11 UTC (permalink / raw) To: Zelin Deng Cc: Petr Mladek, Miroslav Benes, shuah, linux-kselftest, live-patching, mpdesouza, Nathan Chancellor, Nicolas Schier, linux-kbuild On Thu, Jul 02, 2026 at 10:40:21AM +0800, Zelin Deng wrote: > 在 2026/7/1 23:19, Thomas Weißschuh 写道: (...) > I had verify your proposal, it worked well - liveupatch kmod was built > successfully and top-level Makefile wasn't overwritten any more. Thanks for testing! > Petr thank you for your Ack, I think Thomas's proposal is better than mine, > we don't have to do the quirk everytime when new selftest kmod is added. > > Thomas, so do I have to send a updated patch or you will do it by youself? Your choice. You did most of the work, so should be credited as author. If you don't want I can do it, too. Thomas ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH] selftests: livepatch: unset sub_make_done in case top level Makefile be overwritten 2026-07-02 7:11 ` Thomas Weißschuh @ 2026-07-02 8:09 ` Zelin Deng 0 siblings, 0 replies; 10+ messages in thread From: Zelin Deng @ 2026-07-02 8:09 UTC (permalink / raw) To: Thomas Weißschuh Cc: Petr Mladek, Miroslav Benes, shuah, linux-kselftest, live-patching, mpdesouza, Nathan Chancellor, Nicolas Schier, linux-kbuild On 2026/7/2 15:11, Thomas Weißschuh wrote: > On Thu, Jul 02, 2026 at 10:40:21AM +0800, Zelin Deng wrote: >> 在 2026/7/1 23:19, Thomas Weißschuh 写道: > (...) :) Now client language has changed. >> I had verify your proposal, it worked well - liveupatch kmod was built >> successfully and top-level Makefile wasn't overwritten any more. > Thanks for testing! > >> Petr thank you for your Ack, I think Thomas's proposal is better than mine, >> we don't have to do the quirk everytime when new selftest kmod is added. >> >> Thomas, so do I have to send a updated patch or you will do it by youself? > Your choice. You did most of the work, so should be credited as author. > If you don't want I can do it, too. Never mind, it will be good if you can do the change, so please do it thank you. I'm just glad to report the issue and get some positive feedbacks. > > Thomas ^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2026-07-02 8:09 UTC | newest] Thread overview: 10+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2026-05-25 8:37 [PATCH] selftests: livepatch: unset sub_make_done in case top level Makefile be overwritten Zelin Deng 2026-06-19 14:42 ` Miroslav Benes 2026-06-21 14:36 ` Zelin Deng 2026-06-30 14:32 ` Petr Mladek 2026-06-30 16:12 ` Thomas Weißschuh 2026-07-01 15:14 ` Petr Mladek 2026-07-01 15:19 ` Thomas Weißschuh 2026-07-02 2:40 ` Zelin Deng 2026-07-02 7:11 ` Thomas Weißschuh 2026-07-02 8:09 ` Zelin Deng
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox