diff options
| author | Stefan Hajnoczi <stefanha@redhat.com> | 2025-01-30 10:29:40 -0500 |
|---|---|---|
| committer | Stefan Hajnoczi <stefanha@redhat.com> | 2025-01-30 10:29:40 -0500 |
| commit | e60938852ff051ab0afeb178af01bba0d63b3bbc (patch) | |
| tree | c0834ef865ca363c46e2a226078b29cd89b2ee26 /tests/functional/replay_kernel.py | |
| parent | 9736ee382e95ead06a838fe0b0498e0cb3845270 (diff) | |
| parent | f141caa270af536b4d5b7c8540820f1bdd245d71 (diff) | |
| download | focaccia-qemu-e60938852ff051ab0afeb178af01bba0d63b3bbc.tar.gz focaccia-qemu-e60938852ff051ab0afeb178af01bba0d63b3bbc.zip | |
Merge tag 'pull-request-2025-01-30' of https://gitlab.com/thuth/qemu into staging
* Convert more avocado tests to the functional framework * Fix the broken aarch64_tcg_plugins test * Add test for 64-bit mac99 machine * Add a Linux-based test for the 40p machine * Fix issues with record/replay of some s390x instructions * Fix node.js crashes on emulated s390x due to a bug in the MVC instruction * Enable virtio-balloon-pci and virtio-mem-pci on s390x * Fix a libslirp v4.9.0 compilation problem # -----BEGIN PGP SIGNATURE----- # # iQJFBAABCAAvFiEEJ7iIR+7gJQEY8+q5LtnXdP5wLbUFAmebewIRHHRodXRoQHJl # ZGhhdC5jb20ACgkQLtnXdP5wLbUfZQ//WHrZNVQNe0d+wOtAa5Zj4X9RpadHeGO9 # WCKtBWZ1tDADHiVkZzU6L6q/LYM5FcAOE+Kah/xr8rtf6he+LCYQ0RDHbgY6/oUE # t9TkIeph59+MMvBXWJ8flngaoVtxe8l2aYem8wk3ATPZtHyMQAZ5PAjY3+WYQAGc # gm13k1AMD4mA6mBUOs67QSitTqBQsunKpb1IvpyBjtv9NBl61L8h5hWn0bsxa8yC # 3KKZhw6Nclc8RVe33e6ZDrHrBi9klORd6Z+7fJ4w8Yj+C48ogfbQx+Zvb82jXhRe # 2qGdVb6cF7LVQ5D3pECBK7yo4Lkd7MYnNvn+EmbTXhj1y5MSPdokP6k0ZWkhhkCP # 2kIY0o5tFipdxkdDpCptU3gYJLdQFbNX2MqDFY0KeurLDGe4o6jIoRNmdZ67TJei # zleLlcEatoyRqpCKqTNMDVeWgza3ngykhiQIrG9PMPCRQET0N4qY6db35hzDujLI # NVuI1traCLawfCDYiMnU59dOxWSHy1bwSfnUxhZ92+Fl3AOb6c6PzhpkIGl/grwT # 8T8EcjFyA4hpaHHKjCeNgSrKt9N0Ka2G3l9oF8eWwJm4KAlwtYBDvfVb+juGBP9+ # 8gW0lXA8tYy/P5XgPQ0N5Z8coc1xUrYBhC7v70ud3ponMmmTdhRnosey2cOFUGsN # /U7avgXIm0Q= # =rEzl # -----END PGP SIGNATURE----- # gpg: Signature made Thu 30 Jan 2025 08:13:38 EST # gpg: using RSA key 27B88847EEE0250118F3EAB92ED9D774FE702DB5 # gpg: issuer "thuth@redhat.com" # gpg: Good signature from "Thomas Huth <th.huth@gmx.de>" [full] # gpg: aka "Thomas Huth <thuth@redhat.com>" [full] # gpg: aka "Thomas Huth <huth@tuxfamily.org>" [full] # gpg: aka "Thomas Huth <th.huth@posteo.de>" [unknown] # Primary key fingerprint: 27B8 8847 EEE0 2501 18F3 EAB9 2ED9 D774 FE70 2DB5 * tag 'pull-request-2025-01-30' of https://gitlab.com/thuth/qemu: net/slirp: libslirp 4.9.0 compatibility tests/functional/test_mips_malta: Convert the mips big endian replay tests tests/functional/test_mips64el_malta: Convert the mips64el replay tests tests/functional/test_mipsel_malta: Convert the mipsel replay tests tests/functional: Add the ReplayKernelBase class tests/functional: Add a decorator for skipping long running tests tests/functional: Extend PPC 40p test with Linux boot s390x/s390-virtio-ccw: Support plugging PCI-based virtio memory devices virtio-mem-pci: Allow setting nvectors, so we can use MSI-X virtio-balloon-pci: Allow setting nvectors, so we can use MSI-X hw/s390x/s390-virtio-ccw: Fix a record/replay deadlock tests/tcg/s390x: Test modifying code using the MVC instruction target/s390x: Fix MVC not always invalidating translation blocks target/s390x: Fix PPNO execution with icount tests/functional/test_mips_malta: Fix comment about endianness of the test tests/functional: Add a ppc64 mac99 test tests/functional: Fix the aarch64_tcg_plugins test tests/functional: Convert the migration avocado test tests/functional: Fix broken decorators with lamda functions tests/functional/qemu_test/decorators: Fix bad check for imports Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
Diffstat (limited to 'tests/functional/replay_kernel.py')
| -rw-r--r-- | tests/functional/replay_kernel.py | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/tests/functional/replay_kernel.py b/tests/functional/replay_kernel.py new file mode 100644 index 0000000000..8e8ac7d052 --- /dev/null +++ b/tests/functional/replay_kernel.py @@ -0,0 +1,84 @@ +# Record/replay test that boots a Linux kernel +# +# Copyright (c) 2020 ISP RAS +# +# Author: +# Pavel Dovgalyuk <Pavel.Dovgaluk@ispras.ru> +# +# This work is licensed under the terms of the GNU GPL, version 2 or +# later. See the COPYING file in the top-level directory. + +import os +import logging +import time +import subprocess + +from qemu_test.linuxkernel import LinuxKernelTest + +class ReplayKernelBase(LinuxKernelTest): + """ + Boots a Linux kernel in record mode and checks that the console + is operational and the kernel command line is properly passed + from QEMU to the kernel. + Then replays the same scenario and verifies, that QEMU correctly + terminates. + """ + + timeout = 180 + REPLAY_KERNEL_COMMAND_LINE = 'printk.time=1 panic=-1 ' + + def run_vm(self, kernel_path, kernel_command_line, console_pattern, + record, shift, args, replay_path): + # icount requires TCG to be available + self.require_accelerator('tcg') + + logger = logging.getLogger('replay') + start_time = time.time() + vm = self.get_vm() + vm.set_console() + if record: + logger.info('recording the execution...') + mode = 'record' + else: + logger.info('replaying the execution...') + mode = 'replay' + vm.add_args('-icount', 'shift=%s,rr=%s,rrfile=%s' % + (shift, mode, replay_path), + '-kernel', kernel_path, + '-append', kernel_command_line, + '-net', 'none', + '-no-reboot') + if args: + vm.add_args(*args) + vm.launch() + self.wait_for_console_pattern(console_pattern, vm) + if record: + vm.shutdown() + logger.info('finished the recording with log size %s bytes' + % os.path.getsize(replay_path)) + self.run_replay_dump(replay_path) + logger.info('successfully tested replay-dump.py') + else: + vm.wait() + logger.info('successfully finished the replay') + elapsed = time.time() - start_time + logger.info('elapsed time %.2f sec' % elapsed) + return elapsed + + def run_replay_dump(self, replay_path): + try: + subprocess.check_call(["./scripts/replay-dump.py", + "-f", replay_path], + stdout=subprocess.DEVNULL) + except subprocess.CalledProcessError: + self.fail('replay-dump.py failed') + + def run_rr(self, kernel_path, kernel_command_line, console_pattern, + shift=7, args=None): + replay_path = os.path.join(self.workdir, 'replay.bin') + t1 = self.run_vm(kernel_path, kernel_command_line, console_pattern, + True, shift, args, replay_path) + t2 = self.run_vm(kernel_path, kernel_command_line, console_pattern, + False, shift, args, replay_path) + logger = logging.getLogger('replay') + logger.info('replay overhead {:.2%}'.format(t2 / t1 - 1)) |