From: Luiz Augusto von Dentz <luiz.dentz@gmail.com>
To: linux-bluetooth@vger.kernel.org
Subject: [PATCH BlueZ v1 07/10] doc/test-functional: Document User Mode Linux VM hosts
Date: Fri, 30 Oct 2026 17:29:36 -0400 [thread overview]
Message-ID: <20261030212940.753771-8-luiz.dentz@gmail.com> (raw)
In-Reply-To: <20261030212940.753771-1-luiz.dentz@gmail.com>
From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
Document running the VM hosts as User Mode Linux guests through
test-runner, e.g. on machines without KVM support, with btvirt serving
their controllers and channels over vhost-user, and the kernel
configuration this needs.
The hosts run on real time, as time travel makes these tests slower:
document the measurements and why.
Assisted-by: Claude:claude-opus-5-5
---
doc/test-functional.rst | 74 ++++++++++++++++++++++++++++++++++++++---
1 file changed, 70 insertions(+), 4 deletions(-)
diff --git a/doc/test-functional.rst b/doc/test-functional.rst
index e2fcf34138b3..a50cd441189c 100644
--- a/doc/test-functional.rst
+++ b/doc/test-functional.rst
@@ -90,8 +90,9 @@ The following additional options apply:
``--kernel=<image>``
Kernel image (or built Linux source tree root) to
- use. See **test-runner(1)** and `tester.config` for required
- kernel config.
+ use, either a QEMU ``bzImage`` or a User Mode Linux binary, see
+ `User Mode Linux`_. See **test-runner(1)** and `tester.config`
+ for required kernel config.
If not provided, value from `FUNCTIONAL_TESTING_KERNEL`
environment variable is used. If none, no image is used.
@@ -167,7 +168,9 @@ A test run consists of the Pytest process (the *upper tester*, running on
the developer machine) and one or more *VM hosts*. Each VM host is a
separate **test-runner(1)** instance, i.e. a QEMU virtual machine booting
the given kernel image with the developer machine's root filesystem passed
-through read-only. The VM hosts are wired together by a Bluetooth
+through read-only. With a User Mode Linux kernel the VM hosts are UML
+processes instead, see `User Mode Linux`_. The VM hosts are wired
+together by a Bluetooth
controller: either the emulated **btvirt(1)** controller, or a real USB
controller passed through to the VM::
@@ -249,6 +252,46 @@ Writing test code that runs in the VM, and the available VM-side
facilities, are documented by `pytest-bluezenv
<https://pypi.org/project/pytest-bluezenv/>`__.
+User Mode Linux
+---------------
+
+When ``--kernel`` is a User Mode Linux (UML) binary, or a built kernel tree
+with a ``linux`` binary and no ``bzImage``, **test-runner(1)** runs the VM
+hosts as UML processes instead of QEMU, e.g. on machines without KVM
+support, with the developer machine's root filesystem mounted read-only
+through hostfs. The channels are passed to it with ``-o`` as kernel
+parameters: a single ``btvirt`` process serves every device of the VM hosts
+over vhost-user (see `virtio.rst <virtio.rst>`_), the controllers with
+``-V``, and the control and log channels as virtio consoles with
+``--console``::
+
+ VM host #0 (UML) developer machine VM host #1 (UML)
+ ┌────────────┐ ┌─────────────────┐ ┌────────────┐
+ │ virtio_bt ├─ vhost ────┤ btvirt ├──── vhost ─┤ virtio_bt │
+ │ hvc ├─ vhost ────┤ controllers, ├──── vhost ─┤ hvc │
+ └────────────┘ │ consoles │ └────────────┘
+ └────────┬────────┘
+ │ control, log
+ pytest
+
+The shared directory is mounted with hostfs instead of 9p. There is no
+``tty`` channel, so ``test/test-functional-attach`` is not available, and
+controllers cannot be passed through, so ``--usb`` and ``--pcie`` need
+QEMU.
+
+The VM hosts run on real time, with test-runner ``-R``. Time travel, which
+makes the kernel testers faster, makes the functional tests slower: they
+exchange traffic between two or three guests, and in lock-step only one
+guest runs at a time, each exchange taking a round trip to the calendar.
+Wall clock time of ``make check-functional`` with 4 workers, same kernel
+version and machine, UML with seccomp, cut off at 78 s, and of
+``-k test_bluetoothctl``::
+
+ VM hosts check-functional test_bluetoothctl
+ KVM 68 s, 49 tests run 20.1 s
+ UML 78 s, 41 tests run 20.4 s
+ UML time travel 78 s, 12 tests run 25.8 s
+
REQUIREMENTS
============
@@ -258,7 +301,7 @@ General
The following are needed:
-- QEmu (x86_64)
+- QEmu (x86_64), unless running User Mode Linux VM hosts
- ``dbus-daemon`` available
Recommended:
@@ -317,6 +360,22 @@ configuration enabled:
CONFIG_PTP_1588_CLOCK_KVM=y
CONFIG_PTP_1588_CLOCK_VMCLOCK=y
+A User Mode Linux kernel is built with ``ARCH=um`` from the same config,
+and needs in addition:
+
+.. code-block::
+
+ CONFIG_HOSTFS=y
+ CONFIG_VIRTIO_UML=y
+
+.. code-block::
+
+ make ARCH=um defconfig
+ scripts/kconfig/merge_config.sh -m .config ../bluez/doc/tester.config
+ make ARCH=um olddefconfig linux
+
+The KVM and PTP options above do not apply to User Mode Linux.
+
USB
---
@@ -348,6 +407,13 @@ Run all tests
Test output is logged in ``test-functional.log``.
+Run all tests under User Mode Linux
+-----------------------------------
+
+.. code-block::
+
+ $ test/test-functional --kernel=/pathto/linux
+
Show output during run
----------------------
--
2.56.0
next prev parent reply other threads:[~2026-10-30 21:29 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-30 21:29 [PATCH BlueZ v1 00/10] Run test-functional under User Mode Linux Luiz Augusto von Dentz
2026-10-30 21:29 ` [PATCH BlueZ v1 01/10] tools/test-runner: Default to time travel with " Luiz Augusto von Dentz
2026-10-30 23:58 ` Run test-functional under " bluez.test.bot
2026-10-30 21:29 ` [PATCH BlueZ v1 02/10] tools/test-runner: Unbind virtio devices before powering off UML Luiz Augusto von Dentz
2026-10-30 21:29 ` [PATCH BlueZ v1 03/10] emulator: Answer the time of a guest with a skew Luiz Augusto von Dentz
2026-10-30 21:29 ` [PATCH BlueZ v1 04/10] adapter: Don't return Busy when a pending change sets the same value Luiz Augusto von Dentz
2026-10-30 21:34 ` Luiz Augusto von Dentz
2026-10-30 21:29 ` [PATCH BlueZ v1 05/10] test: functional: wait for BAP transports to be configured Luiz Augusto von Dentz
2026-10-30 21:29 ` [PATCH BlueZ v1 06/10] shared/mcp: Don't drop commands before supported opcodes are read Luiz Augusto von Dentz
2026-10-30 21:29 ` Luiz Augusto von Dentz [this message]
2026-10-30 21:29 ` [PATCH BlueZ v1 08/10] a2dp: Fix refusing the AVDTP connection of a new link Luiz Augusto von Dentz
2026-10-30 21:29 ` [PATCH BlueZ v1 09/10] adapter: Don't cancel requests of a new link on stale disconnection Luiz Augusto von Dentz
2026-10-30 21:29 ` [PATCH BlueZ v1 10/10] test: Cover A2DP reconnection with a pending disconnection Luiz Augusto von Dentz
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20261030212940.753771-8-luiz.dentz@gmail.com \
--to=luiz.dentz@gmail.com \
--cc=linux-bluetooth@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox