This repo contains my attempts to run Linux kselftests via GitHub Actions (GHA).
It is also where I dump my kernel work, GitHub wouldn't let me push a whole fresh kernel tree and wouldn't let me create a separate fork of Linus' tree. 🤷♂️
Certain upstream branches are mirrored into this repository. For each upstream
branch, there is a shadow branch called github/$remote/$branch. And a branch
called github-base contains the actual GHA configuration.
The update_branches.yaml workflow periodically merges the upstream branches
into their shadow branches, then also merges github-base into them. Then the
test.yaml workflow can be run on the shadow branch to actually build the
kernel and run tests.
Note that the github-base branch doesn't contain any files that are likely
ever to exist in upstream kernel trees, so hopefully there will never be any
merge conflicts.
The goal is to keep minimal logic in the GHA YAML and instead put everything in
shell scripts under .github/scripts/, so that to the greatest extent possible
you can verify the logic locally.
Assuming you have an apt-based system, you can run the stuff under
.github/scripts locally. You can either do this by checking out one of this
repo's "shadow branches" (github/*), or you can just checkout github-base in
this repo and then run the scripts from the root of a separate kernel tree.
TODO: The reason for the apt dependency is for building the Debian guest
rootfs. It should be possible to avoid that by running the build in a container,
but even more practical would just be to provide an easy way to download it from
the Github artifacts.
.github/scripts/run_local.sh is intended to reproduce the whole test workflow
end-to-end.
.github/scripts/bisect_helper.sh is a modified version for when you want to
run a specific test, presumably to bisect a failure. For example, to just run
gup_test:
.github/scripts/bisect_helper.sh "cd mm/; ./run_vmtests.sh -t gup_test"-
Make sure the scripts can actually be run locally and document an example.
-
Automate running tests regularly (I don't think the automated push to the shadow branches fires the
pushtrigger in GHA, as a simple way to avoid recursive triggering). -
Run tests on unstable branches like -next. This will require logic to rebase.
-
Add basic logic to parse KTAP output. This now shows up in the summary of the Github Actions run.
-
Resolve vmtests that get skipped completely
-
vmalloc-> requiresCONFIG_TEST_VMALLOC -
hmm-> requiresCONFIG_TEST_HMM -
ksm,ksm_numa-> "Config KSM not enabled" (I guessCONFIG_KSM?) -
hugevm-> requires 5-level paging andPR_SET_VMA_ANON_NAME -
memfd_secret-> dunno, doesn't print anything - KSM, but probably various: Requires NUMA
- (Probably others that just silently skip most of their logic.
mrelease_test?)
-
-
Look into obvious failures commented in
.github/scripts/test.guest.sh -
userfaultfdtests are flaky. Think about how to address flaky tests. -
Try this to make things faster. Because we are interested in create merge commits, we need to clone the full history (at least, we don't know up front how much history we need to clone, and I don't know of a good way to figure that out on-the-fly). Apparently GitHub doesn't optimise this case, so it takes 10+ minutes to start the
update_branchesjob. -
Make the summary tables more readable, try to represent the nested structure if possible? ChatGPT says you can have arbitrary HTML in the
$GITHUB_STEP_SUMMARY, maybe with a<details>element you can make something reasonably readable. -
Also include skipped tests.
-
Make the skipped mm tests run
-
Try to run some more tests in this setup.
-
Figure out a way to make failures easy to reproduce locally by downloading artifacts.
-
Improvements to kernel scripts:
-
Fix bug where
tools/testing/kunit.py parsegoes into an infinite loop on this input:TAP version 13 ok 4 gup_longterm 1..4 -
Fix bug where
run_vmtests.shputs the plan line in the wrong place (i.e. produces output like the one above).
-
-
Clean up upstream testing scripts:
- Fix
kunit.pyto not go into infinite loops. - Fix the
KTAPoutpuit fromrun_vmtests.sh.
- Fix
I looked into trying to parse the mm selftests
KTAP.
I found that:
-
There is an open source Python library called Tappy, it cannot parse this data. It may be partly because the data is bogus but it also handles it poorly, e.g. it gets confused about seeing "Tap Version 13" lines even when they are prefixed with
#. It also has a wack API, so I think it's probably just quite a bad library. -
There is a KTAP parser provided with
kunit.py. When given the outpout of my script it gets into an infinite loop, fixed by:https://lore.kernel.org/lkml/CABVgOS=Pfp2_ZvCtxy6X_xoM6pGVgT6bD_4VxGVZ_SNWVgesGQ@mail.gmail.com/
Note also that run_vmtests.sh doesn't use KTAP's nesting feature which
is a shame.
Broonie pointed me here: https://github.com/Linaro/test-definitions/tree/master/automated/linux/kselftest