1239d08aaSThomas Huth#!/usr/bin/env python3 2239d08aaSThomas 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 9239d08aaSThomas Huthfrom qemu_test import QemuSystemTest, Asset 10239d08aaSThomas Huthfrom qemu_test import wait_for_console_pattern 11239d08aaSThomas Huthfrom qemu_test import exec_command_and_wait_for_pattern 12239d08aaSThomas Huthfrom qemu_test import is_readable_executable_file 1373240f10SMarc-André Lureau 1473240f10SMarc-André Lureau 1573240f10SMarc-André Lureauimport os 1673240f10SMarc-André Lureauimport socket 1773240f10SMarc-André Lureauimport subprocess 1873240f10SMarc-André Lureau 1973240f10SMarc-André Lureau 20*8b5a0dd3SDaniel P. Berrangédef pick_default_vug_bin(test): 21*8b5a0dd3SDaniel P. Berrangé bld_dir_path = test.build_file("contrib", "vhost-user-gpu", "vhost-user-gpu") 2273240f10SMarc-André Lureau if is_readable_executable_file(bld_dir_path): 2373240f10SMarc-André Lureau return bld_dir_path 2473240f10SMarc-André Lureau 2573240f10SMarc-André Lureau 262283b627SPhilippe Mathieu-Daudéclass VirtioGPUx86(QemuSystemTest): 2773240f10SMarc-André Lureau 28532835d0SCleber Rosa KERNEL_COMMAND_LINE = "printk.time=0 console=ttyS0 rdinit=/bin/bash" 29239d08aaSThomas Huth ASSET_KERNEL = Asset( 30239d08aaSThomas Huth ("https://archives.fedoraproject.org/pub/archive/fedora" 3173240f10SMarc-André Lureau "/linux/releases/33/Everything/x86_64/os/images" 32239d08aaSThomas Huth "/pxeboot/vmlinuz"), 33239d08aaSThomas Huth '2dc5fb5cfe9ac278fa45640f3602d9b7a08cc189ed63fd9b162b07073e4df397') 34239d08aaSThomas Huth ASSET_INITRD = Asset( 35239d08aaSThomas Huth ("https://archives.fedoraproject.org/pub/archive/fedora" 3673240f10SMarc-André Lureau "/linux/releases/33/Everything/x86_64/os/images" 37239d08aaSThomas Huth "/pxeboot/initrd.img"), 38239d08aaSThomas Huth 'c49b97f893a5349e4883452178763e402bdc5caa8845b226a2d1329b5f356045') 3973240f10SMarc-André Lureau 4073240f10SMarc-André Lureau def wait_for_console_pattern(self, success_message, vm=None): 4173240f10SMarc-André Lureau wait_for_console_pattern( 4273240f10SMarc-André Lureau self, 4373240f10SMarc-André Lureau success_message, 4473240f10SMarc-André Lureau failure_message="Kernel panic - not syncing", 4573240f10SMarc-André Lureau vm=vm, 4673240f10SMarc-André Lureau ) 4773240f10SMarc-André Lureau 4873240f10SMarc-André Lureau def test_virtio_vga_virgl(self): 4973240f10SMarc-André Lureau # FIXME: should check presence of virtio, virgl etc 508ee6e281SCleber Rosa self.require_accelerator('kvm') 5173240f10SMarc-André Lureau 52239d08aaSThomas Huth kernel_path = self.ASSET_KERNEL.fetch() 53239d08aaSThomas Huth initrd_path = self.ASSET_INITRD.fetch() 5473240f10SMarc-André Lureau 5573240f10SMarc-André Lureau self.vm.set_console() 56239d08aaSThomas Huth self.vm.add_args("-cpu", "host") 5773240f10SMarc-André Lureau self.vm.add_args("-m", "2G") 5873240f10SMarc-André Lureau self.vm.add_args("-machine", "pc,accel=kvm") 593a05eee2SCleber Rosa self.vm.add_args("-device", "virtio-vga-gl") 6073240f10SMarc-André Lureau self.vm.add_args("-display", "egl-headless") 6173240f10SMarc-André Lureau self.vm.add_args( 6273240f10SMarc-André Lureau "-kernel", 6373240f10SMarc-André Lureau kernel_path, 6473240f10SMarc-André Lureau "-initrd", 6573240f10SMarc-André Lureau initrd_path, 6673240f10SMarc-André Lureau "-append", 67532835d0SCleber Rosa self.KERNEL_COMMAND_LINE, 6873240f10SMarc-André Lureau ) 69d9894645SAlex Bennée try: 7073240f10SMarc-André Lureau self.vm.launch() 71d9894645SAlex Bennée except: 72d9894645SAlex Bennée # TODO: probably fails because we are missing the VirGL features 73239d08aaSThomas Huth self.skipTest("VirGL not enabled?") 74d9894645SAlex Bennée 7573240f10SMarc-André Lureau self.wait_for_console_pattern("as init process") 7673240f10SMarc-André Lureau exec_command_and_wait_for_pattern( 777699e37bSDaniel P. Berrangé self, "/usr/sbin/modprobe virtio_gpu", "features: +virgl +edid" 7873240f10SMarc-André Lureau ) 7973240f10SMarc-André Lureau 8073240f10SMarc-André Lureau def test_vhost_user_vga_virgl(self): 8173240f10SMarc-André Lureau # FIXME: should check presence of vhost-user-gpu, virgl, memfd etc 828ee6e281SCleber Rosa self.require_accelerator('kvm') 8373240f10SMarc-André Lureau 84*8b5a0dd3SDaniel P. Berrangé vug = pick_default_vug_bin(self) 8573240f10SMarc-André Lureau if not vug: 86239d08aaSThomas Huth self.skipTest("Could not find vhost-user-gpu") 8773240f10SMarc-André Lureau 88239d08aaSThomas Huth kernel_path = self.ASSET_KERNEL.fetch() 89239d08aaSThomas Huth initrd_path = self.ASSET_INITRD.fetch() 9073240f10SMarc-André Lureau 9173240f10SMarc-André Lureau # Create socketpair to connect proxy and remote processes 9273240f10SMarc-André Lureau qemu_sock, vug_sock = socket.socketpair( 9373240f10SMarc-André Lureau socket.AF_UNIX, socket.SOCK_STREAM 9473240f10SMarc-André Lureau ) 9573240f10SMarc-André Lureau os.set_inheritable(qemu_sock.fileno(), True) 9673240f10SMarc-André Lureau os.set_inheritable(vug_sock.fileno(), True) 9773240f10SMarc-André Lureau 98bcc12768SDaniel P. Berrangé self._vug_log_path = self.log_file("vhost-user-gpu.log") 9973240f10SMarc-André Lureau self._vug_log_file = open(self._vug_log_path, "wb") 100cdcc50bfSCleber Rosa self.log.info('Complete vhost-user-gpu.log file can be ' 101cdcc50bfSCleber Rosa 'found at %s', self._vug_log_path) 10273240f10SMarc-André Lureau 10373240f10SMarc-André Lureau vugp = subprocess.Popen( 10473240f10SMarc-André Lureau [vug, "--virgl", "--fd=%d" % vug_sock.fileno()], 10573240f10SMarc-André Lureau stdin=subprocess.DEVNULL, 10673240f10SMarc-André Lureau stdout=self._vug_log_file, 10773240f10SMarc-André Lureau stderr=subprocess.STDOUT, 10873240f10SMarc-André Lureau shell=False, 10973240f10SMarc-André Lureau close_fds=False, 11073240f10SMarc-André Lureau ) 11173240f10SMarc-André Lureau 11273240f10SMarc-André Lureau self.vm.set_console() 113239d08aaSThomas Huth self.vm.add_args("-cpu", "host") 11473240f10SMarc-André Lureau self.vm.add_args("-m", "2G") 11573240f10SMarc-André Lureau self.vm.add_args("-object", "memory-backend-memfd,id=mem,size=2G") 11673240f10SMarc-André Lureau self.vm.add_args("-machine", "pc,memory-backend=mem,accel=kvm") 11773240f10SMarc-André Lureau self.vm.add_args("-chardev", "socket,id=vug,fd=%d" % qemu_sock.fileno()) 11873240f10SMarc-André Lureau self.vm.add_args("-device", "vhost-user-vga,chardev=vug") 11973240f10SMarc-André Lureau self.vm.add_args("-display", "egl-headless") 12073240f10SMarc-André Lureau self.vm.add_args( 12173240f10SMarc-André Lureau "-kernel", 12273240f10SMarc-André Lureau kernel_path, 12373240f10SMarc-André Lureau "-initrd", 12473240f10SMarc-André Lureau initrd_path, 12573240f10SMarc-André Lureau "-append", 126532835d0SCleber Rosa self.KERNEL_COMMAND_LINE, 12773240f10SMarc-André Lureau ) 1287f027ee0SThomas Huth try: 12973240f10SMarc-André Lureau self.vm.launch() 1307f027ee0SThomas Huth except: 1317f027ee0SThomas Huth # TODO: probably fails because we are missing the VirGL features 132239d08aaSThomas Huth self.skipTest("VirGL not enabled?") 13373240f10SMarc-André Lureau self.wait_for_console_pattern("as init process") 134ffab603bSThomas Huth exec_command_and_wait_for_pattern(self, "/usr/sbin/modprobe virtio_gpu", 135ffab603bSThomas Huth "features: +virgl +edid") 13673240f10SMarc-André Lureau self.vm.shutdown() 13773240f10SMarc-André Lureau qemu_sock.close() 13873240f10SMarc-André Lureau vugp.terminate() 13973240f10SMarc-André Lureau vugp.wait() 140239d08aaSThomas Huth 141239d08aaSThomas Huthif __name__ == '__main__': 142239d08aaSThomas Huth QemuSystemTest.main() 143