arm64: efi: Make running tests on EFI can be parallel

Currently running tests on EFI in parallel can cause part of tests to
fail, this is because arm/efi/run script use the EFI_CASE to create the
subdir under the efi-tests, and the EFI_CASE is the filename of the
test, when running tests in parallel, the multiple tests exist in the
same filename will execute at the same time, which will use the same
directory and write the test specific things into it, this cause
chaotic and make some tests fail.

For example, if we running the pmu-sw-incr and pmu-chained-counters
and other pmu tests on EFI at the same time, the EFI_CASE will be pmu.
So they will write their $cmd_args to the $EFI/TEST/pmu/startup.nsh
at the same time, which will corrupt the startup.nsh file.

And we can get the log which outputs:

* pmu-sw-incr.log:
  - ABORT: pmu: Unknown sub-test 'pmu-mem-acce'
* pmu-chained-counters.log
  - ABORT: pmu: Unknown sub-test 'pmu-mem-access-reliab'

And the efi-tests/pmu/startup.nsh:

@echo -off
setvar fdtfile -guid 97ef3e03-7329-4a6a-b9ba-6c1fdcc5f823 -rt =L"dtb"
pmu.efi pmu-mem-access-reliability
setvar fdtfile -guid 97ef3e03-7329-4a6a-b9ba-6c1fdcc5f823 -rt =L"dtb"
pmu.efi pmu-chained-sw-incr

As you can see, when multiple tests write to the same startup.nsh file,
it causes the issue.

To Fix this issue, use the testname instead of the filename to create
the subdir under the efi-tests. We use the EFI_TESTNAME to replace the
EFI_CASE in script. Since every testname is specific, now the tests
can be run parallel. It also considers when user directly use the
arm/efi/run to run test, in this case, still use the filename.

Besides, replace multiple $EFI_TEST/$EFI_CASE to the $EFI_CASE_DIR, this
makes the script looks more clean and we don'e need to replace many
EFI_CASE to EFI_TESTNAME.

Reviewed-by: Andrew Jones <andrew.jones@linux.dev>
Signed-off-by: Shaoqin Huang <shahuang@redhat.com>
Reviewed-by: Nikos Nikoleris <nikos.nikoleris@arm.com>
Signed-off-by: Andrew Jones <andrew.jones@linux.dev>
1 file changed
tree: dedf20a88b6614e8eb9f65eca5f43779ce1f0f44
  1. arm/
  2. ci/
  3. common/
  4. lib/
  5. powerpc/
  6. riscv/
  7. s390x/
  8. scripts/
  9. x86/
  10. .editorconfig
  11. .gitignore
  12. .gitlab-ci.yml
  13. .travis.yml
  14. configure
  15. COPYRIGHT
  16. errata.txt
  17. LICENSE
  18. MAINTAINERS
  19. Makefile
  20. README.macOS.md
  21. README.md
  22. run_tests.sh
README.md

Welcome to kvm-unit-tests

See http://www.linux-kvm.org/page/KVM-unit-tests for a high-level description of this project, as well as running tests and adding tests HOWTOs.

Building the tests

This directory contains sources for a KVM test suite.

To create the test images do:

./configure
make

in this directory. Test images are created in ./ARCH/*.flat

NOTE: GCC cross-compiler is required for build on macOS.

Standalone tests

The tests can be built as standalone. To create and use standalone tests do:

./configure
make standalone
(send tests/some-test somewhere)
(go to somewhere)
./some-test

make install will install all tests in PREFIX/share/kvm-unit-tests/tests, each as a standalone test.

Running the tests

Then use the runner script to detect the correct invocation and invoke the test:

./x86-run ./x86/msr.flat

or:

./run_tests.sh

to run them all.

By default the runner script searches for a suitable QEMU binary in the system. To select a specific QEMU binary though, specify the QEMU=path/to/binary environment variable:

QEMU=/tmp/qemu/x86_64-softmmu/qemu-system-x86_64 ./x86-run ./x86/msr.flat

To select an accelerator, for example “kvm”, “hvf” or “tcg”, specify the ACCEL=name environment variable:

ACCEL=kvm ./x86-run ./x86/msr.flat

For running tests that involve migration from one QEMU instance to another you also need to have the “ncat” binary (from the nmap.org project) installed, otherwise the related tests will be skipped.

Running the tests with UEFI

Check x86/efi/README.md.

Tests configuration file

The test case may need specific runtime configurations, for example, extra QEMU parameters and time to execute limited, the runner script reads those information from a configuration file found at ./ARCH/unittests.cfg.

The configuration file also contain the groups (if any) each test belong to. So that a given group can be executed by specifying its name in the runner's -g option.

Unit test inputs

Unit tests use QEMU's ‘-append args...’ parameter for command line inputs, i.e. all args will be available as argv strings in main(). Additionally a file of the form

KEY=VAL
KEY2=VAL
...

may be passed with ‘-initrd file’ to become the unit test's environ, which can then be accessed in the usual ways, e.g. VAL = getenv(“KEY”). Any key=val strings can be passed, but some have reserved meanings in the framework. The list of reserved environment variables is below

QEMU_ACCEL                   either kvm, hvf or tcg
QEMU_VERSION_STRING          string of the form `qemu -h | head -1`
KERNEL_VERSION_STRING        string of the form `uname -r`

Additionally these self-explanatory variables are reserved

QEMU_MAJOR, QEMU_MINOR, QEMU_MICRO, KERNEL_VERSION, KERNEL_PATCHLEVEL,
KERNEL_SUBLEVEL, KERNEL_EXTRAVERSION

Guarding unsafe tests

Some tests are not safe to run by default, as they may crash the host. kvm-unit-tests provides two ways to handle tests like those.

  1. Adding ‘nodefault’ to the groups field for the unit test in the unittests.cfg file. When a unit test is in the nodefault group it is only run when invoked

    a) independently, ARCH-run ARCH/test

    b) by specifying any other non-nodefault group it is in, groups = nodefault mygroup : ./run_tests.sh -g mygroup

    c) by specifying all tests should be run, ./run_tests.sh -a

  2. Making the test conditional on errata in the code,

    if (ERRATA(abcdef012345)) {
        do_unsafe_test();
    }
    

    With the errata condition the unsafe unit test is only run when

    a) the ERRATA_abcdef012345 environment variable is provided and ‘y’

    b) the ERRATA_FORCE environment variable is provided and ‘y’

    c) by specifying all tests should be run, ./run_tests.sh -a (The -a switch ensures the ERRATA_FORCE is provided and set to ‘y’.)

The ./errata.txt file provides a mapping of the commits needed by errata conditionals to their respective minimum kernel versions. By default, when the user does not provide an environ, then an environ generated from the ./errata.txt file and the host's kernel version is provided to all unit tests.

Contributing

Directory structure

.:                  configure script, top-level Makefile, and run_tests.sh
./scripts:          general architecture neutral helper scripts for building and running tests
./scripts/<ARCH>:   architecture dependent helper scripts for building and running tests
./lib:              general architecture neutral services for the tests
./lib/<ARCH>:       architecture dependent services for the tests
./<ARCH>:           the sources of the tests and the created objects/images

See ./ARCH/README for architecture specific documentation.

Style

Currently there is a mix of indentation styles so any changes to existing files should be consistent with the existing style. For new files:

  • C: please use standard linux-with-tabs, see Linux kernel doc Documentation/process/coding-style.rst
  • Shell: use TABs for indentation

Exceptions:

  • While the kernel standard requires 80 columns, we allow up to 120.

Header guards:

Please try to adhere to the following patterns when adding “#ifndef <...> #define <...>” header guards: ./lib: HEADER_H ./lib/: ARCH_HEADER_H ./lib//asm: ASMARCH_HEADER_H ./: ARCH_HEADER_H

Patches

Patches are welcome at the KVM mailing list kvm@vger.kernel.org.

Please prefix messages with: [kvm-unit-tests PATCH]

You can add the following to .git/config to do this automatically for you:

[format]
    subjectprefix = kvm-unit-tests PATCH

Additionally it‘s helpful to have a common order of file types in patches. Our chosen order attempts to place the more declarative files before the code files. We also start with common code and finish with unit test code. git-diff’s orderFile feature allows us to specify the order in a file. The orderFile we use is scripts/git.difforder; adding the config with git config diff.orderFile scripts/git.difforder enables it.

We strive to follow the Linux kernels coding style so it‘s recommended to run the kernel’s ./scripts/checkpatch.pl on new patches.