Browse Source

* Fix a crash that occurs when passing through virtio devices to nested guest

* Update s390x MAINTAINERS
 * Fix various pylint warnings in functional tests
 -----BEGIN PGP SIGNATURE-----
 
 iQJFBAABCgAvFiEEJ7iIR+7gJQEY8+q5LtnXdP5wLbUFAmkgMrgRHHRodXRoQHJl
 ZGhhdC5jb20ACgkQLtnXdP5wLbXvEg/8CxLpA1a/lkf17XyGQmxvES5sRZDD2DCg
 CTZfK8j4ZwaDlHH4WIQdvAPHxSMZ4p0Z+HoS+GlKkAMTp6ALJkSg+mRosehy7sH0
 z3DRcGXnR46kArdhLzZIXL0QStAcTRAhTrva/eI+pf6CDD8ypR3Qut6d4hTBVdvB
 lgU1LOOXDOGRsWYq11asUJabwZr4VYYIQlIMd57Lv2MITCt3UNwK279hZQQ/Xe5C
 07Y9X4aC3m3f8+AHbZJhrSB9ySNQMGuKyGfHf+rQDyYGOybsG/cJoJLUO6eAUU3M
 b3J/YoEViL7JmKqwv2WJQdP2p7/M8M9XlK9rMn7Ry26Wdab/QeNTdjMHuakxHfmn
 oaorN7ua2P+wLKV6h2ElHFKiqhvs/n6vGGE39FsvbgGYhzsqdg0YvKDr61KxpXRp
 rz7LuiLygBFEUwhqlLa2ePoJb9wxgECLgEib17qNhjUlDHegSDGNpENAzvJ/rC2l
 ufCNQR17zocffJp1N/S1ZcjVc+JzMUG5G6ScdQsKUHueSqiXpS6pRI7cX0PFNz70
 jp2Ul+m1Mr9GJn9bFhz2Kf2k74gpW5B27SKnZlcZa/AFtT9WlHcEkStAs0PRe00Q
 rrPkxBJaesLayxX6xW8HMzO+IkBniHtxQesf5WPlf9+z2roM0eXuCXibMGHnK49P
 YqvvLCvBTEA=
 =yxWh
 -----END PGP SIGNATURE-----

Merge tag 'pull-request-2025-11-21' of https://gitlab.com/thuth/qemu into staging

* Fix a crash that occurs when passing through virtio devices to nested guest
* Update s390x MAINTAINERS
* Fix various pylint warnings in functional tests

# -----BEGIN PGP SIGNATURE-----
#
# iQJFBAABCgAvFiEEJ7iIR+7gJQEY8+q5LtnXdP5wLbUFAmkgMrgRHHRodXRoQHJl
# ZGhhdC5jb20ACgkQLtnXdP5wLbXvEg/8CxLpA1a/lkf17XyGQmxvES5sRZDD2DCg
# CTZfK8j4ZwaDlHH4WIQdvAPHxSMZ4p0Z+HoS+GlKkAMTp6ALJkSg+mRosehy7sH0
# z3DRcGXnR46kArdhLzZIXL0QStAcTRAhTrva/eI+pf6CDD8ypR3Qut6d4hTBVdvB
# lgU1LOOXDOGRsWYq11asUJabwZr4VYYIQlIMd57Lv2MITCt3UNwK279hZQQ/Xe5C
# 07Y9X4aC3m3f8+AHbZJhrSB9ySNQMGuKyGfHf+rQDyYGOybsG/cJoJLUO6eAUU3M
# b3J/YoEViL7JmKqwv2WJQdP2p7/M8M9XlK9rMn7Ry26Wdab/QeNTdjMHuakxHfmn
# oaorN7ua2P+wLKV6h2ElHFKiqhvs/n6vGGE39FsvbgGYhzsqdg0YvKDr61KxpXRp
# rz7LuiLygBFEUwhqlLa2ePoJb9wxgECLgEib17qNhjUlDHegSDGNpENAzvJ/rC2l
# ufCNQR17zocffJp1N/S1ZcjVc+JzMUG5G6ScdQsKUHueSqiXpS6pRI7cX0PFNz70
# jp2Ul+m1Mr9GJn9bFhz2Kf2k74gpW5B27SKnZlcZa/AFtT9WlHcEkStAs0PRe00Q
# rrPkxBJaesLayxX6xW8HMzO+IkBniHtxQesf5WPlf9+z2roM0eXuCXibMGHnK49P
# YqvvLCvBTEA=
# =yxWh
# -----END PGP SIGNATURE-----
# gpg: Signature made Fri 21 Nov 2025 01:36:56 AM PST
# gpg:                using RSA key 27B88847EEE0250118F3EAB92ED9D774FE702DB5
# gpg:                issuer "thuth@redhat.com"
# gpg: Good signature from "Thomas Huth <th.huth@gmx.de>" [unknown]
# gpg:                 aka "Thomas Huth <thuth@redhat.com>" [unknown]
# gpg:                 aka "Thomas Huth <th.huth@posteo.de>" [unknown]
# gpg:                 aka "Thomas Huth <huth@tuxfamily.org>" [unknown]
# gpg: WARNING: The key's User ID is not certified with a trusted signature!
# gpg:          There is no indication that the signature belongs to the owner.
# Primary key fingerprint: 27B8 8847 EEE0 2501 18F3  EAB9 2ED9 D774 FE70 2DB5

* tag 'pull-request-2025-11-21' of https://gitlab.com/thuth/qemu:
  MAINTAINERS: s390 maintainer updates
  tests/functional/aarch64/test_rme_sbsaref: Silence issues reported by pylint
  tests/functional/aarch64/test_reverse_debug: Fix issues reported by pylint
  tests/functional/ppc/test_ppe42: Fix style issues reported by pylint
  tests/functional/ppc/test_amiga: Fix issues reported by pylint and flake8
  tests/functional/x86_64/test_memlock: Silence pylint warnings
  tests/functional/x86_64/test_reverse_debug: Silence pylint warning
  tests/functional/x86_64/test_virtio_gpu: Fix various issues reported by pylint
  tests/functional/arm/test_aspeed_ast2600_buildroot: Fix pylint warnings
  hw/s390x: Fix a possible crash with passed-through virtio devices

Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
pull/312/head
Richard Henderson 4 months ago
parent
commit
ab9079f59b
  1. 9
      MAINTAINERS
  2. 14
      hw/s390x/s390-hypercall.c
  3. 4
      tests/functional/aarch64/test_reverse_debug.py
  4. 3
      tests/functional/aarch64/test_rme_sbsaref.py
  5. 21
      tests/functional/arm/test_aspeed_ast2600_buildroot.py
  6. 6
      tests/functional/ppc/test_amiga.py
  7. 14
      tests/functional/ppc/test_ppe42.py
  8. 6
      tests/functional/x86_64/test_memlock.py
  9. 2
      tests/functional/x86_64/test_reverse_debug.py
  10. 56
      tests/functional/x86_64/test_virtio_gpu.py

9
MAINTAINERS

@ -364,8 +364,8 @@ F: target/rx/
S390 TCG CPUs
M: Richard Henderson <richard.henderson@linaro.org>
M: David Hildenbrand <david@kernel.org>
R: Ilya Leoshkevich <iii@linux.ibm.com>
M: Ilya Leoshkevich <iii@linux.ibm.com>
R: David Hildenbrand <david@kernel.org>
S: Maintained
F: target/s390x/
F: target/s390x/tcg
@ -1862,7 +1862,8 @@ F: target/s390x/ioinst.c
L: qemu-s390x@nongnu.org
S390 CPU models
M: David Hildenbrand <david@kernel.org>
M: Hendrik Brueckner <brueckner@linux.ibm.com>
R: David Hildenbrand <david@kernel.org>
S: Maintained
F: target/s390x/cpu_features*.[ch]
F: target/s390x/cpu_models.[ch]
@ -2919,7 +2920,7 @@ L: qemu-s390x@nongnu.org
S390 floating interrupt controller
M: Halil Pasic <pasic@linux.ibm.com>
M: Christian Borntraeger <borntraeger@linux.ibm.com>
M: David Hildenbrand <david@kernel.org>
R: David Hildenbrand <david@kernel.org>
R: Jason Herne <jjherne@linux.ibm.com>
S: Supported
F: hw/intc/s390_flic*.c

14
hw/s390x/s390-hypercall.c

@ -10,6 +10,7 @@
*/
#include "qemu/osdep.h"
#include "qemu/error-report.h"
#include "cpu.h"
#include "hw/s390x/s390-virtio-ccw.h"
#include "hw/s390x/s390-hypercall.h"
@ -42,6 +43,19 @@ static int handle_virtio_ccw_notify(uint64_t subch_id, uint64_t data)
if (!sch || !css_subch_visible(sch)) {
return -EINVAL;
}
if (sch->id.cu_type != VIRTIO_CCW_CU_TYPE) {
/*
* This might happen in nested setups: If the L1 host defined the
* L2 guest with a virtio device (e.g. virtio-keyboard), and the
* L2 guest passes this device through to the L3 guest, the L3 guest
* might send virtio notifications to the QEMU in L2 for that device.
* But since the QEMU in L2 defined this device as vfio-ccw, it's not
* a VirtIODevice that we can handle here!
*/
warn_report_once("Got virtio notification for unsupported device "
"on subchannel %02x.%1x.%04x!", cssid, ssid, schid);
return -EINVAL;
}
vdev = virtio_ccw_get_vdev(sch);
if (vq_idx >= VIRTIO_QUEUE_MAX || !virtio_queue_get_num(vdev, vq_idx)) {

4
tests/functional/aarch64/test_reverse_debug.py

@ -14,11 +14,11 @@
# This work is licensed under the terms of the GNU GPL, version 2 or
# later. See the COPYING file in the top-level directory.
from qemu_test import Asset, skipFlakyTest
from qemu_test import Asset
from reverse_debugging import ReverseDebugging
class ReverseDebugging_AArch64(ReverseDebugging):
class ReverseDebuggingAArch64(ReverseDebugging):
ASSET_KERNEL = Asset(
('https://archives.fedoraproject.org/pub/archive/fedora/linux/'

3
tests/functional/aarch64/test_rme_sbsaref.py

@ -14,7 +14,6 @@ from os.path import join
import shutil
from qemu_test import QemuSystemTest, Asset, wait_for_console_pattern
from qemu_test import exec_command_and_wait_for_pattern
class Aarch64RMESbsaRefMachine(QemuSystemTest):
@ -48,7 +47,7 @@ class Aarch64RMESbsaRefMachine(QemuSystemTest):
efi = join(rme_stack, 'out', 'EFI')
os.makedirs(efi, exist_ok=True)
shutil.copyfile(join(rme_stack, 'out', 'Image'), join(efi, 'Image'))
with open(join(efi, 'startup.nsh'), 'w') as startup:
with open(join(efi, 'startup.nsh'), 'w', encoding='ascii') as startup:
startup.write('fs0:Image nokaslr root=/dev/vda rw init=/init --'
' /host/out/lkvm run --realm'
' -m 256m'

21
tests/functional/arm/test_aspeed_ast2600_buildroot.py

@ -9,8 +9,8 @@ import time
import tempfile
import subprocess
from qemu_test import Asset
from aspeed import AspeedTest
from qemu_test import Asset
from qemu_test import exec_command_and_wait_for_pattern, skipIfMissingCommands
@ -66,21 +66,18 @@ class AST2600Machine(AspeedTest):
'images/ast2600-evb/buildroot-2023.02-tpm/flash.img'),
'a46009ae8a5403a0826d607215e731a8c68d27c14c41e55331706b8f9c7bd997')
@skipIfMissingCommands('swtpm')
def test_arm_ast2600_evb_buildroot_tpm(self):
self.set_machine('ast2600-evb')
def _test_arm_ast2600_evb_buildroot_tpm(self, tpmstate_dir):
image_path = self.ASSET_BR2_202302_AST2600_TPM_FLASH.fetch()
tpmstate_dir = tempfile.TemporaryDirectory(prefix="qemu_")
socket = os.path.join(tpmstate_dir.name, 'swtpm-socket')
socket = os.path.join(tpmstate_dir, 'swtpm-socket')
# We must put the TPM state dir in /tmp/, not the build dir,
# because some distros use AppArmor to lock down swtpm and
# restrict the set of locations it can access files in.
subprocess.run(['swtpm', 'socket', '-d', '--tpm2',
'--tpmstate', f'dir={tpmstate_dir.name}',
'--ctrl', f'type=unixio,path={socket}'])
'--tpmstate', f'dir={tpmstate_dir}',
'--ctrl', f'type=unixio,path={socket}'],
check=True)
self.vm.add_args('-chardev', f'socket,id=chrtpm,path={socket}')
self.vm.add_args('-tpmdev', 'emulator,id=tpm0,chardev=chrtpm')
@ -97,6 +94,12 @@ class AST2600Machine(AspeedTest):
self.do_test_arm_aspeed_buildroot_poweroff()
@skipIfMissingCommands('swtpm')
def test_arm_ast2600_evb_buildroot_tpm(self):
self.set_machine('ast2600-evb')
with tempfile.TemporaryDirectory(prefix="qemu_") as tpmstate_dir:
self._test_arm_ast2600_evb_buildroot_tpm(tpmstate_dir)
if __name__ == '__main__':
AspeedTest.main()

6
tests/functional/ppc/test_amiga.py

@ -15,8 +15,6 @@ from qemu_test import wait_for_console_pattern
class AmigaOneMachine(QemuSystemTest):
timeout = 90
ASSET_IMAGE = Asset(
('https://www.hyperion-entertainment.com/index.php/'
'downloads?view=download&format=raw&file=25'),
@ -25,19 +23,19 @@ class AmigaOneMachine(QemuSystemTest):
def test_ppc_amigaone(self):
self.require_accelerator("tcg")
self.set_machine('amigaone')
tar_name = 'A1Firmware_Floppy_05-Mar-2005.zip'
self.archive_extract(self.ASSET_IMAGE, format="zip")
bios = self.scratch_file("u-boot-amigaone.bin")
with open(bios, "wb") as bios_fh:
subprocess.run(['tail', '-c', '524288',
self.scratch_file("floppy_edition",
"updater.image")],
stdout=bios_fh)
stdout=bios_fh, check=True)
self.vm.set_console()
self.vm.add_args('-bios', bios)
self.vm.launch()
wait_for_console_pattern(self, 'FLASH:')
if __name__ == '__main__':
QemuSystemTest.main()

14
tests/functional/ppc/test_ppe42.py

@ -6,8 +6,9 @@
#
# SPDX-License-Identifier: GPL-2.0-or-later
from qemu_test import QemuSystemTest, Asset
import asyncio
from qemu_test import QemuSystemTest, Asset
class Ppe42Machine(QemuSystemTest):
@ -30,13 +31,13 @@ class Ppe42Machine(QemuSystemTest):
raise
self.log.info(output)
if "NIP fff80200" in output:
self.log.info("<test completed>")
return True
else:
if "NIP fff80200" not in output:
self.log.info("<test not completed>")
return False
self.log.info("<test completed>")
return True
def _wait_pass_fail(self, timeout):
while not self._test_completed():
if timeout >= self.poll_period:
@ -49,14 +50,13 @@ class Ppe42Machine(QemuSystemTest):
except asyncio.TimeoutError:
self.log.info("Poll period ended.")
pass
except Exception as err:
self.log.debug(f"event_wait() failed due to {err=},"
" {type(err)=}")
raise
if e != None:
if e is not None:
self.log.debug(f"Execution stopped: {e}")
self.log.debug("Exiting due to test failure")
self.fail("Failure detected!")

6
tests/functional/x86_64/test_memlock.py

@ -69,11 +69,13 @@ class MemlockTest(QemuSystemTest):
return result
def _get_raw_process_status(self, pid: int) -> str:
status = None
try:
with open(f'/proc/{pid}/status', 'r') as f:
return f.read()
with open(f'/proc/{pid}/status', 'r', encoding="ascii") as f:
status = f.read()
except FileNotFoundError:
self.skipTest("Can't open status file of the process")
return status
if __name__ == '__main__':

2
tests/functional/x86_64/test_reverse_debug.py

@ -18,7 +18,7 @@ from qemu_test import skipFlakyTest
from reverse_debugging import ReverseDebugging
class ReverseDebugging_X86_64(ReverseDebugging):
class ReverseDebuggingX86(ReverseDebugging):
@skipFlakyTest("https://gitlab.com/qemu-project/qemu/-/issues/2922")
def test_x86_64_pc(self):

56
tests/functional/x86_64/test_virtio_gpu.py

@ -5,22 +5,23 @@
# 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 socket
import subprocess
from qemu_test import QemuSystemTest, Asset
from qemu_test import wait_for_console_pattern
from qemu_test import exec_command_and_wait_for_pattern
from qemu_test import is_readable_executable_file
import os
import socket
import subprocess
from qemu.machine.machine import VMLaunchFailure
def pick_default_vug_bin(test):
bld_dir_path = test.build_file("contrib", "vhost-user-gpu", "vhost-user-gpu")
if is_readable_executable_file(bld_dir_path):
return bld_dir_path
return None
class VirtioGPUx86(QemuSystemTest):
@ -46,8 +47,8 @@ class VirtioGPUx86(QemuSystemTest):
)
def test_virtio_vga_virgl(self):
# FIXME: should check presence of virtio, virgl etc
self.require_accelerator('kvm')
self.require_device('virtio-vga-gl')
kernel_path = self.ASSET_KERNEL.fetch()
initrd_path = self.ASSET_INITRD.fetch()
@ -68,7 +69,7 @@ class VirtioGPUx86(QemuSystemTest):
)
try:
self.vm.launch()
except:
except VMLaunchFailure:
# TODO: probably fails because we are missing the VirGL features
self.skipTest("VirGL not enabled?")
@ -78,8 +79,8 @@ class VirtioGPUx86(QemuSystemTest):
)
def test_vhost_user_vga_virgl(self):
# FIXME: should check presence of vhost-user-gpu, virgl, memfd etc
self.require_accelerator('kvm')
self.require_device('vhost-user-vga')
vug = pick_default_vug_bin(self)
if not vug:
@ -95,27 +96,29 @@ class VirtioGPUx86(QemuSystemTest):
os.set_inheritable(qemu_sock.fileno(), True)
os.set_inheritable(vug_sock.fileno(), True)
self._vug_log_path = self.log_file("vhost-user-gpu.log")
self._vug_log_file = open(self._vug_log_path, "wb")
self.log.info('Complete vhost-user-gpu.log file can be '
'found at %s', self._vug_log_path)
vugp = subprocess.Popen(
[vug, "--virgl", "--fd=%d" % vug_sock.fileno()],
stdin=subprocess.DEVNULL,
stdout=self._vug_log_file,
stderr=subprocess.STDOUT,
shell=False,
close_fds=False,
)
self._vug_log_file.close()
vug_log_path = self.log_file("vhost-user-gpu.log")
self.log.info('Complete vhost-user-gpu.log file can be found at %s',
vug_log_path)
with open(vug_log_path, "wb") as vug_log_file:
with subprocess.Popen([vug, "--virgl", f"--fd={vug_sock.fileno()}"],
stdin=subprocess.DEVNULL,
stdout=vug_log_file,
stderr=subprocess.STDOUT,
shell=False,
close_fds=False) as vugp:
self._test_vhost_user_vga_virgl(qemu_sock,
kernel_path, initrd_path)
qemu_sock.close()
vug_sock.close()
vugp.terminate()
def _test_vhost_user_vga_virgl(self, qemu_sock, kernel_path, initrd_path):
self.vm.set_console()
self.vm.add_args("-cpu", "host")
self.vm.add_args("-m", "2G")
self.vm.add_args("-object", "memory-backend-memfd,id=mem,size=2G")
self.vm.add_args("-machine", "pc,memory-backend=mem,accel=kvm")
self.vm.add_args("-chardev", "socket,id=vug,fd=%d" % qemu_sock.fileno())
self.vm.add_args("-chardev", f"socket,id=vug,fd={qemu_sock.fileno()}")
self.vm.add_args("-device", "vhost-user-vga,chardev=vug")
self.vm.add_args("-display", "egl-headless")
self.vm.add_args(
@ -128,17 +131,14 @@ class VirtioGPUx86(QemuSystemTest):
)
try:
self.vm.launch()
except:
except VMLaunchFailure:
# TODO: probably fails because we are missing the VirGL features
self.skipTest("VirGL not enabled?")
self.wait_for_console_pattern("as init process")
exec_command_and_wait_for_pattern(self, "/usr/sbin/modprobe virtio_gpu",
"features: +virgl +edid")
self.vm.shutdown()
qemu_sock.close()
vug_sock.close()
vugp.terminate()
vugp.wait()
if __name__ == '__main__':
QemuSystemTest.main()

Loading…
Cancel
Save