marcandre.lur...@redhat.com writes:
> From: Marc-André Lureau <marcandre.lur...@redhat.com> > > This will check virtio/vhost-user-vga & virgl are correctly initialized > by the Linux kernel on an egl-headless display. > > Signed-off-by: Marc-André Lureau <marcandre.lur...@redhat.com> > --- > tests/acceptance/virtio-gpu.py | 161 +++++++++++++++++++++++++++++++++ > 1 file changed, 161 insertions(+) > create mode 100644 tests/acceptance/virtio-gpu.py This failed when I got to master: 2021-02-16 14:33:46,266 qmp L0255 DEBUG| >>> {'execute': 'qmp_capabilities'} 2021-02-16 14:33:46,441 machine L0385 DEBUG| Error launching VM 2021-02-16 14:33:46,441 machine L0387 DEBUG| Command: './qemu-system-x86_64 -display none -vga none -chardev socket,id=mon,path=/var/tmp/avo_qemu_sock_xy9ndjnm/qemu -29492-monitor.sock -mon chardev=mon,mode=control -chardev socket,id=console,path=/var/tmp/avo_qemu_sock_xy9ndjnm/qemu-29492-console.sock,server=on,wait=off -serial chardev: console -cpu host -m 2G -machine pc,accel=kvm -device virtio-vga,virgl=on -display egl-headless -kernel /home/alex.bennee/avocado/data/cache/by_location/892ae21f3ae7d04994d8 1e1c0bf204ecebe555bb/vmlinuz -initrd /home/alex.bennee/avocado/data/cache/by_location/892ae21f3ae7d04994d81e1c0bf204ecebe555bb/initrd.img -append printk.time=0 console=ttyS0 rdinit=/bin/bash' 2021-02-16 14:33:46,441 machine L0389 DEBUG| Output: "qemu-system-x86_64: -device virtio-vga,virgl=on: Property 'virtio-vga.virgl' not found\n" 2021-02-16 14:33:46,441 stacktrace L0039 ERROR| I'm going to assume this is because the beefy server I was building on didn't have the VirGL headers to enable this feature. In lieu of feature probing you might have to do what I did for the plugins test: try: vm.launch() except: # TODO: probably fails because plugins not enabled but we # can't currently probe for the feature. self.cancel("TCG Plugins not enabled?") > > diff --git a/tests/acceptance/virtio-gpu.py b/tests/acceptance/virtio-gpu.py > new file mode 100644 > index 0000000000..211f02932f > --- /dev/null > +++ b/tests/acceptance/virtio-gpu.py > @@ -0,0 +1,161 @@ > +# virtio-gpu tests > +# > +# 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 avocado_qemu import Test > +from avocado_qemu import BUILD_DIR > +from avocado_qemu import wait_for_console_pattern > +from avocado_qemu import exec_command_and_wait_for_pattern > +from avocado_qemu import is_readable_executable_file > + > +from qemu.accel import kvm_available > + > +import os > +import socket > +import subprocess > + > + > +ACCEL_NOT_AVAILABLE_FMT = "%s accelerator does not seem to be available" > +KVM_NOT_AVAILABLE = ACCEL_NOT_AVAILABLE_FMT % "KVM" > + > + > +def pick_default_vug_bin(): > + relative_path = "./contrib/vhost-user-gpu/vhost-user-gpu" > + if is_readable_executable_file(relative_path): > + return relative_path > + > + bld_dir_path = os.path.join(BUILD_DIR, relative_path) > + if is_readable_executable_file(bld_dir_path): > + return bld_dir_path > + > + > +class VirtioGPUx86(Test): > + """ > + :avocado: tags=virtio-gpu > + """ > + > + KERNEL_COMMON_COMMAND_LINE = "printk.time=0 " > + KERNEL_URL = ( > + "https://archives.fedoraproject.org/pub/fedora" > + "/linux/releases/33/Everything/x86_64/os/images" > + "/pxeboot/vmlinuz" > + ) > + INITRD_URL = ( > + "https://archives.fedoraproject.org/pub/fedora" > + "/linux/releases/33/Everything/x86_64/os/images" > + "/pxeboot/initrd.img" > + ) > + > + def wait_for_console_pattern(self, success_message, vm=None): > + wait_for_console_pattern( > + self, > + success_message, > + failure_message="Kernel panic - not syncing", > + vm=vm, > + ) > + > + def test_virtio_vga_virgl(self): > + """ > + :avocado: tags=arch:x86_64 > + :avocado: tags=device:virtio-vga > + """ > + kernel_command_line = ( > + self.KERNEL_COMMON_COMMAND_LINE + "console=ttyS0 > rdinit=/bin/bash" > + ) > + # FIXME: should check presence of virtio, virgl etc > + if not kvm_available(self.arch, self.qemu_bin): > + self.cancel(KVM_NOT_AVAILABLE) > + > + kernel_path = self.fetch_asset(self.KERNEL_URL) > + initrd_path = self.fetch_asset(self.INITRD_URL) > + > + self.vm.set_console() > + self.vm.add_args("-cpu", "host") > + self.vm.add_args("-m", "2G") > + self.vm.add_args("-machine", "pc,accel=kvm") > + self.vm.add_args("-device", "virtio-vga,virgl=on") > + self.vm.add_args("-display", "egl-headless") > + self.vm.add_args( > + "-kernel", > + kernel_path, > + "-initrd", > + initrd_path, > + "-append", > + kernel_command_line, > + ) > + self.vm.launch() > + self.wait_for_console_pattern("as init process") > + exec_command_and_wait_for_pattern( > + self, "/usr/sbin/modprobe virtio_gpu", "" > + ) > + self.wait_for_console_pattern("features: +virgl +edid") > + > + def test_vhost_user_vga_virgl(self): > + """ > + :avocado: tags=arch:x86_64 > + :avocado: tags=device:vhost-user-vga > + """ > + kernel_command_line = ( > + self.KERNEL_COMMON_COMMAND_LINE + "console=ttyS0 > rdinit=/bin/bash" > + ) > + # FIXME: should check presence of vhost-user-gpu, virgl, memfd etc > + if not kvm_available(self.arch, self.qemu_bin): > + self.cancel(KVM_NOT_AVAILABLE) > + > + vug = pick_default_vug_bin() > + if not vug: > + self.cancel("Could not find vhost-user-gpu") > + > + kernel_path = self.fetch_asset(self.KERNEL_URL) > + initrd_path = self.fetch_asset(self.INITRD_URL) > + > + # Create socketpair to connect proxy and remote processes > + qemu_sock, vug_sock = socket.socketpair( > + socket.AF_UNIX, socket.SOCK_STREAM > + ) > + os.set_inheritable(qemu_sock.fileno(), True) > + os.set_inheritable(vug_sock.fileno(), True) > + > + self._vug_log_path = os.path.join( > + self.vm._test_dir, "vhost-user-gpu.log" > + ) > + self._vug_log_file = open(self._vug_log_path, "wb") > + print(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.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("-device", "vhost-user-vga,chardev=vug") > + self.vm.add_args("-display", "egl-headless") > + self.vm.add_args( > + "-kernel", > + kernel_path, > + "-initrd", > + initrd_path, > + "-append", > + kernel_command_line, > + ) > + self.vm.launch() > + self.wait_for_console_pattern("as init process") > + exec_command_and_wait_for_pattern( > + self, "/usr/sbin/modprobe virtio_gpu", "" > + ) > + self.wait_for_console_pattern("features: +virgl -edid") > + self.vm.shutdown() > + qemu_sock.close() > + vugp.terminate() > + vugp.wait() -- Alex Bennée