1*239d08aaSThomas Huth#!/usr/bin/env python3 2*239d08aaSThomas Huth# 373240f10SMarc-André Lureau# virtio-gpu tests 473240f10SMarc-André Lureau# 573240f10SMarc-André Lureau# This work is licensed under the terms of the GNU GPL, version 2 or 673240f10SMarc-André Lureau# later. See the COPYING file in the top-level directory. 773240f10SMarc-André Lureau 873240f10SMarc-André Lureau 9*239d08aaSThomas Huthfrom qemu_test import BUILD_DIR 10*239d08aaSThomas Huthfrom qemu_test import QemuSystemTest, Asset 11*239d08aaSThomas Huthfrom qemu_test import wait_for_console_pattern 12*239d08aaSThomas Huthfrom qemu_test import exec_command_and_wait_for_pattern 13*239d08aaSThomas Huthfrom qemu_test import is_readable_executable_file 1473240f10SMarc-André Lureau 15beb6b57bSJohn Snowfrom qemu.utils import kvm_available 1673240f10SMarc-André Lureau 1773240f10SMarc-André Lureauimport os 1873240f10SMarc-André Lureauimport socket 1973240f10SMarc-André Lureauimport subprocess 2073240f10SMarc-André Lureau 2173240f10SMarc-André Lureau 2273240f10SMarc-André Lureaudef pick_default_vug_bin(): 2373240f10SMarc-André Lureau relative_path = "./contrib/vhost-user-gpu/vhost-user-gpu" 2473240f10SMarc-André Lureau if is_readable_executable_file(relative_path): 2573240f10SMarc-André Lureau return relative_path 2673240f10SMarc-André Lureau 2773240f10SMarc-André Lureau bld_dir_path = os.path.join(BUILD_DIR, relative_path) 2873240f10SMarc-André Lureau if is_readable_executable_file(bld_dir_path): 2973240f10SMarc-André Lureau return bld_dir_path 3073240f10SMarc-André Lureau 3173240f10SMarc-André Lureau 322283b627SPhilippe Mathieu-Daudéclass VirtioGPUx86(QemuSystemTest): 3373240f10SMarc-André Lureau 34532835d0SCleber Rosa KERNEL_COMMAND_LINE = "printk.time=0 console=ttyS0 rdinit=/bin/bash" 35*239d08aaSThomas Huth ASSET_KERNEL = Asset( 36*239d08aaSThomas Huth ("https://archives.fedoraproject.org/pub/archive/fedora" 3773240f10SMarc-André Lureau "/linux/releases/33/Everything/x86_64/os/images" 38*239d08aaSThomas Huth "/pxeboot/vmlinuz"), 39*239d08aaSThomas Huth '2dc5fb5cfe9ac278fa45640f3602d9b7a08cc189ed63fd9b162b07073e4df397') 40*239d08aaSThomas Huth ASSET_INITRD = Asset( 41*239d08aaSThomas Huth ("https://archives.fedoraproject.org/pub/archive/fedora" 4273240f10SMarc-André Lureau "/linux/releases/33/Everything/x86_64/os/images" 43*239d08aaSThomas Huth "/pxeboot/initrd.img"), 44*239d08aaSThomas Huth 'c49b97f893a5349e4883452178763e402bdc5caa8845b226a2d1329b5f356045') 4573240f10SMarc-André Lureau 4673240f10SMarc-André Lureau def wait_for_console_pattern(self, success_message, vm=None): 4773240f10SMarc-André Lureau wait_for_console_pattern( 4873240f10SMarc-André Lureau self, 4973240f10SMarc-André Lureau success_message, 5073240f10SMarc-André Lureau failure_message="Kernel panic - not syncing", 5173240f10SMarc-André Lureau vm=vm, 5273240f10SMarc-André Lureau ) 5373240f10SMarc-André Lureau 5473240f10SMarc-André Lureau def test_virtio_vga_virgl(self): 5573240f10SMarc-André Lureau # FIXME: should check presence of virtio, virgl etc 568ee6e281SCleber Rosa self.require_accelerator('kvm') 5773240f10SMarc-André Lureau 58*239d08aaSThomas Huth kernel_path = self.ASSET_KERNEL.fetch() 59*239d08aaSThomas Huth initrd_path = self.ASSET_INITRD.fetch() 6073240f10SMarc-André Lureau 6173240f10SMarc-André Lureau self.vm.set_console() 62*239d08aaSThomas Huth self.vm.add_args("-cpu", "host") 6373240f10SMarc-André Lureau self.vm.add_args("-m", "2G") 6473240f10SMarc-André Lureau self.vm.add_args("-machine", "pc,accel=kvm") 653a05eee2SCleber Rosa self.vm.add_args("-device", "virtio-vga-gl") 6673240f10SMarc-André Lureau self.vm.add_args("-display", "egl-headless") 6773240f10SMarc-André Lureau self.vm.add_args( 6873240f10SMarc-André Lureau "-kernel", 6973240f10SMarc-André Lureau kernel_path, 7073240f10SMarc-André Lureau "-initrd", 7173240f10SMarc-André Lureau initrd_path, 7273240f10SMarc-André Lureau "-append", 73532835d0SCleber Rosa self.KERNEL_COMMAND_LINE, 7473240f10SMarc-André Lureau ) 75d9894645SAlex Bennée try: 7673240f10SMarc-André Lureau self.vm.launch() 77d9894645SAlex Bennée except: 78d9894645SAlex Bennée # TODO: probably fails because we are missing the VirGL features 79*239d08aaSThomas Huth self.skipTest("VirGL not enabled?") 80d9894645SAlex Bennée 8173240f10SMarc-André Lureau self.wait_for_console_pattern("as init process") 8273240f10SMarc-André Lureau exec_command_and_wait_for_pattern( 8373240f10SMarc-André Lureau self, "/usr/sbin/modprobe virtio_gpu", "" 8473240f10SMarc-André Lureau ) 8573240f10SMarc-André Lureau self.wait_for_console_pattern("features: +virgl +edid") 8673240f10SMarc-André Lureau 8773240f10SMarc-André Lureau def test_vhost_user_vga_virgl(self): 8873240f10SMarc-André Lureau # FIXME: should check presence of vhost-user-gpu, virgl, memfd etc 898ee6e281SCleber Rosa self.require_accelerator('kvm') 9073240f10SMarc-André Lureau 9173240f10SMarc-André Lureau vug = pick_default_vug_bin() 9273240f10SMarc-André Lureau if not vug: 93*239d08aaSThomas Huth self.skipTest("Could not find vhost-user-gpu") 9473240f10SMarc-André Lureau 95*239d08aaSThomas Huth kernel_path = self.ASSET_KERNEL.fetch() 96*239d08aaSThomas Huth initrd_path = self.ASSET_INITRD.fetch() 9773240f10SMarc-André Lureau 9873240f10SMarc-André Lureau # Create socketpair to connect proxy and remote processes 9973240f10SMarc-André Lureau qemu_sock, vug_sock = socket.socketpair( 10073240f10SMarc-André Lureau socket.AF_UNIX, socket.SOCK_STREAM 10173240f10SMarc-André Lureau ) 10273240f10SMarc-André Lureau os.set_inheritable(qemu_sock.fileno(), True) 10373240f10SMarc-André Lureau os.set_inheritable(vug_sock.fileno(), True) 10473240f10SMarc-André Lureau 10573240f10SMarc-André Lureau self._vug_log_path = os.path.join( 106cdcc50bfSCleber Rosa self.logdir, "vhost-user-gpu.log" 10773240f10SMarc-André Lureau ) 10873240f10SMarc-André Lureau self._vug_log_file = open(self._vug_log_path, "wb") 109cdcc50bfSCleber Rosa self.log.info('Complete vhost-user-gpu.log file can be ' 110cdcc50bfSCleber Rosa 'found at %s', self._vug_log_path) 11173240f10SMarc-André Lureau 11273240f10SMarc-André Lureau vugp = subprocess.Popen( 11373240f10SMarc-André Lureau [vug, "--virgl", "--fd=%d" % vug_sock.fileno()], 11473240f10SMarc-André Lureau stdin=subprocess.DEVNULL, 11573240f10SMarc-André Lureau stdout=self._vug_log_file, 11673240f10SMarc-André Lureau stderr=subprocess.STDOUT, 11773240f10SMarc-André Lureau shell=False, 11873240f10SMarc-André Lureau close_fds=False, 11973240f10SMarc-André Lureau ) 12073240f10SMarc-André Lureau 12173240f10SMarc-André Lureau self.vm.set_console() 122*239d08aaSThomas Huth self.vm.add_args("-cpu", "host") 12373240f10SMarc-André Lureau self.vm.add_args("-m", "2G") 12473240f10SMarc-André Lureau self.vm.add_args("-object", "memory-backend-memfd,id=mem,size=2G") 12573240f10SMarc-André Lureau self.vm.add_args("-machine", "pc,memory-backend=mem,accel=kvm") 12673240f10SMarc-André Lureau self.vm.add_args("-chardev", "socket,id=vug,fd=%d" % qemu_sock.fileno()) 12773240f10SMarc-André Lureau self.vm.add_args("-device", "vhost-user-vga,chardev=vug") 12873240f10SMarc-André Lureau self.vm.add_args("-display", "egl-headless") 12973240f10SMarc-André Lureau self.vm.add_args( 13073240f10SMarc-André Lureau "-kernel", 13173240f10SMarc-André Lureau kernel_path, 13273240f10SMarc-André Lureau "-initrd", 13373240f10SMarc-André Lureau initrd_path, 13473240f10SMarc-André Lureau "-append", 135532835d0SCleber Rosa self.KERNEL_COMMAND_LINE, 13673240f10SMarc-André Lureau ) 1377f027ee0SThomas Huth try: 13873240f10SMarc-André Lureau self.vm.launch() 1397f027ee0SThomas Huth except: 1407f027ee0SThomas Huth # TODO: probably fails because we are missing the VirGL features 141*239d08aaSThomas Huth self.skipTest("VirGL not enabled?") 14273240f10SMarc-André Lureau self.wait_for_console_pattern("as init process") 143ffab603bSThomas Huth exec_command_and_wait_for_pattern(self, "/usr/sbin/modprobe virtio_gpu", 144ffab603bSThomas Huth "features: +virgl +edid") 14573240f10SMarc-André Lureau self.vm.shutdown() 14673240f10SMarc-André Lureau qemu_sock.close() 14773240f10SMarc-André Lureau vugp.terminate() 14873240f10SMarc-André Lureau vugp.wait() 149*239d08aaSThomas Huth 150*239d08aaSThomas Huthif __name__ == '__main__': 151*239d08aaSThomas Huth QemuSystemTest.main() 152