xref: /qemu/tests/functional/test_virtio_gpu.py (revision 239d08aa96d39bf6b9802b74ddbdb0f5796e4546)
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