cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

run_wrapper.rst (8883B)


      1.. SPDX-License-Identifier: GPL-2.0
      2
      3=========================
      4Run Tests with kunit_tool
      5=========================
      6
      7We can either run KUnit tests using kunit_tool or can run tests
      8manually, and then use kunit_tool to parse the results. To run tests
      9manually, see: Documentation/dev-tools/kunit/run_manual.rst.
     10As long as we can build the kernel, we can run KUnit.
     11
     12kunit_tool is a Python script which configures and builds a kernel, runs
     13tests, and formats the test results.
     14
     15Run command:
     16
     17.. code-block::
     18
     19	./tools/testing/kunit/kunit.py run
     20
     21We should see the following:
     22
     23.. code-block::
     24
     25	Generating .config...
     26	Building KUnit kernel...
     27	Starting KUnit kernel...
     28
     29We may want to use the following options:
     30
     31.. code-block::
     32
     33	./tools/testing/kunit/kunit.py run --timeout=30 --jobs=`nproc --all
     34
     35- ``--timeout`` sets a maximum amount of time for tests to run.
     36- ``--jobs`` sets the number of threads to build the kernel.
     37
     38kunit_tool will generate a ``.kunitconfig`` with a default
     39configuration, if no other ``.kunitconfig`` file exists
     40(in the build directory). In addition, it verifies that the
     41generated ``.config`` file contains the ``CONFIG`` options in the
     42``.kunitconfig``.
     43It is also possible to pass a separate ``.kunitconfig`` fragment to
     44kunit_tool. This is useful if we have several different groups of
     45tests we want to run independently, or if we want to use pre-defined
     46test configs for certain subsystems.
     47
     48To use a different ``.kunitconfig`` file (such as one
     49provided to test a particular subsystem), pass it as an option:
     50
     51.. code-block::
     52
     53	./tools/testing/kunit/kunit.py run --kunitconfig=fs/ext4/.kunitconfig
     54
     55To view kunit_tool flags (optional command-line arguments), run:
     56
     57.. code-block::
     58
     59	./tools/testing/kunit/kunit.py run --help
     60
     61Create a  ``.kunitconfig`` File
     62===============================
     63
     64If we want to run a specific set of tests (rather than those listed
     65in the KUnit ``defconfig``), we can provide Kconfig options in the
     66``.kunitconfig`` file. For default .kunitconfig, see:
     67https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/tools/testing/kunit/configs/default.config.
     68A ``.kunitconfig`` is a ``minconfig`` (a .config
     69generated by running ``make savedefconfig``), used for running a
     70specific set of tests. This file contains the regular Kernel configs
     71with specific test targets. The ``.kunitconfig`` also
     72contains any other config options required by the tests (For example:
     73dependencies for features under tests, configs that enable/disable
     74certain code blocks, arch configs and so on).
     75
     76To create a ``.kunitconfig``, using the KUnit ``defconfig``:
     77
     78.. code-block::
     79
     80	cd $PATH_TO_LINUX_REPO
     81	cp tools/testing/kunit/configs/default.config .kunit/.kunitconfig
     82
     83We can then add any other Kconfig options. For example:
     84
     85.. code-block::
     86
     87	CONFIG_LIST_KUNIT_TEST=y
     88
     89kunit_tool ensures that all config options in ``.kunitconfig`` are
     90set in the kernel ``.config`` before running the tests. It warns if we
     91have not included the options dependencies.
     92
     93.. note:: Removing something from the ``.kunitconfig`` will
     94   not rebuild the ``.config file``. The configuration is only
     95   updated if the ``.kunitconfig`` is not a subset of ``.config``.
     96   This means that we can use other tools
     97   (For example: ``make menuconfig``) to adjust other config options.
     98   The build dir needs to be set for ``make menuconfig`` to
     99   work, therefore  by default use ``make O=.kunit menuconfig``.
    100
    101Configure, Build, and Run Tests
    102===============================
    103
    104If we want to make manual changes to the KUnit build process, we
    105can run part of the KUnit build process independently.
    106When running kunit_tool, from a ``.kunitconfig``, we can generate a
    107``.config`` by using the ``config`` argument:
    108
    109.. code-block::
    110
    111	./tools/testing/kunit/kunit.py config
    112
    113To build a KUnit kernel from the current ``.config``, we can use the
    114``build`` argument:
    115
    116.. code-block::
    117
    118	./tools/testing/kunit/kunit.py build
    119
    120If we already have built UML kernel with built-in KUnit tests, we
    121can run the kernel, and display the test results with the ``exec``
    122argument:
    123
    124.. code-block::
    125
    126	./tools/testing/kunit/kunit.py exec
    127
    128The ``run`` command discussed in section: **Run Tests with kunit_tool**,
    129is equivalent to running the above three commands in sequence.
    130
    131Parse Test Results
    132==================
    133
    134KUnit tests output displays results in TAP (Test Anything Protocol)
    135format. When running tests, kunit_tool parses this output and prints
    136a summary. To see the raw test results in TAP format, we can pass the
    137``--raw_output`` argument:
    138
    139.. code-block::
    140
    141	./tools/testing/kunit/kunit.py run --raw_output
    142
    143If we have KUnit results in the raw TAP format, we can parse them and
    144print the human-readable summary with the ``parse`` command for
    145kunit_tool. This accepts a filename for an argument, or will read from
    146standard input.
    147
    148.. code-block:: bash
    149
    150	# Reading from a file
    151	./tools/testing/kunit/kunit.py parse /var/log/dmesg
    152	# Reading from stdin
    153	dmesg | ./tools/testing/kunit/kunit.py parse
    154
    155Run Selected Test Suites
    156========================
    157
    158By passing a bash style glob filter to the ``exec`` or ``run``
    159commands, we can run a subset of the tests built into a kernel . For
    160example: if we only want to run KUnit resource tests, use:
    161
    162.. code-block::
    163
    164	./tools/testing/kunit/kunit.py run 'kunit-resource*'
    165
    166This uses the standard glob format with wildcard characters.
    167
    168Run Tests on qemu
    169=================
    170
    171kunit_tool supports running tests on  qemu as well as
    172via UML. To run tests on qemu, by default it requires two flags:
    173
    174- ``--arch``: Selects a configs collection (Kconfig, qemu config options
    175  and so on), that allow KUnit tests to be run on the specified
    176  architecture in a minimal way. The architecture argument is same as
    177  the option name passed to the ``ARCH`` variable used by Kbuild.
    178  Not all architectures currently support this flag, but we can use
    179  ``--qemu_config`` to handle it. If ``um`` is passed (or this flag
    180  is ignored), the tests will run via UML. Non-UML architectures,
    181  for example: i386, x86_64, arm and so on; run on qemu.
    182
    183- ``--cross_compile``: Specifies the Kbuild toolchain. It passes the
    184  same argument as passed to the ``CROSS_COMPILE`` variable used by
    185  Kbuild. As a reminder, this will be the prefix for the toolchain
    186  binaries such as GCC. For example:
    187
    188  - ``sparc64-linux-gnu`` if we have the sparc toolchain installed on
    189    our system.
    190
    191  - ``$HOME/toolchains/microblaze/gcc-9.2.0-nolibc/microblaze-linux/bin/microblaze-linux``
    192    if we have downloaded the microblaze toolchain from the 0-day
    193    website to a directory in our home directory called toolchains.
    194
    195If we want to run KUnit tests on an architecture not supported by
    196the ``--arch`` flag, or want to run KUnit tests on qemu using a
    197non-default configuration; then we can write our own``QemuConfig``.
    198These ``QemuConfigs`` are written in Python. They have an import line
    199``from..qemu_config import QemuArchParams`` at the top of the file.
    200The file must contain a variable called ``QEMU_ARCH`` that has an
    201instance of ``QemuArchParams`` assigned to it. See example in:
    202``tools/testing/kunit/qemu_configs/x86_64.py``.
    203
    204Once we have a ``QemuConfig``, we can pass it into kunit_tool,
    205using the ``--qemu_config`` flag. When used, this flag replaces the
    206``--arch`` flag. For example: using
    207``tools/testing/kunit/qemu_configs/x86_64.py``, the invocation appear
    208as
    209
    210.. code-block:: bash
    211
    212	./tools/testing/kunit/kunit.py run \
    213		--timeout=60 \
    214		--jobs=12 \
    215		--qemu_config=./tools/testing/kunit/qemu_configs/x86_64.py
    216
    217To run existing KUnit tests on non-UML architectures, see:
    218Documentation/dev-tools/kunit/non_uml.rst.
    219
    220Command-Line Arguments
    221======================
    222
    223kunit_tool has a number of other command-line arguments which can
    224be useful for our test environment. Below the most commonly used
    225command line arguments:
    226
    227- ``--help``: Lists all available options. To list common options,
    228  place ``--help`` before the command. To list options specific to that
    229  command, place ``--help`` after the command.
    230
    231  .. note:: Different commands (``config``, ``build``, ``run``, etc)
    232            have different supported options.
    233- ``--build_dir``: Specifies kunit_tool build directory. It includes
    234  the ``.kunitconfig``, ``.config`` files and compiled kernel.
    235
    236- ``--make_options``: Specifies additional options to pass to make, when
    237  compiling a kernel (using ``build`` or ``run`` commands). For example:
    238  to enable compiler warnings, we can pass ``--make_options W=1``.
    239
    240- ``--alltests``: Builds a UML kernel with all config options enabled
    241  using ``make allyesconfig``. This allows us to run as many tests as
    242  possible.
    243
    244  .. note:: It is slow and prone to breakage as new options are
    245            added or modified. Instead, enable all tests
    246            which have satisfied dependencies by adding
    247            ``CONFIG_KUNIT_ALL_TESTS=y`` to your ``.kunitconfig``.