X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;ds=sidebyside;f=resources%2Flibraries%2Fpython%2FQemuUtils.py;h=c215dfd96faf1f9c766d119bb8b14f486330b23e;hb=HEAD;hp=51fba6105e7f93c7f2827caf2d5b53dfe5b2aad5;hpb=44dcb3113c8ade2e44543746abca861a89362c9b;p=csit.git diff --git a/resources/libraries/python/QemuUtils.py b/resources/libraries/python/QemuUtils.py index 51fba6105e..8dac06001c 100644 --- a/resources/libraries/python/QemuUtils.py +++ b/resources/libraries/python/QemuUtils.py @@ -1,4 +1,4 @@ -# Copyright (c) 2021 Cisco and/or its affiliates. +# Copyright (c) 2024-2024 Cisco and/or its affiliates. # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at: @@ -42,7 +42,7 @@ class QemuUtils: def __init__( self, node, qemu_id=1, smp=1, mem=512, vnf=None, - img=Constants.QEMU_VM_IMAGE): + img=Constants.QEMU_VM_IMAGE, page_size=u""): """Initialize QemuUtil class. :param node: Node to run QEMU on. @@ -51,12 +51,14 @@ class QemuUtils: :param mem: Amount of memory. :param vnf: Network function workload. :param img: QEMU disk image or kernel image path. + :param page_size: Hugepage Size. :type node: dict :type qemu_id: int :type smp: int :type mem: int :type vnf: str :type img: str + :type page_size: str """ self._nic_id = 0 self._node = node @@ -65,16 +67,13 @@ class QemuUtils: # Architecture specific options if self._arch == u"aarch64": - dpdk_target = u"arm64-armv8a" self._opt[u"machine_args"] = \ u"virt,accel=kvm,usb=off,mem-merge=off,gic-version=3" self._opt[u"console"] = u"ttyAMA0" else: - dpdk_target = u"x86_64-native" self._opt[u"machine_args"] = u"pc,accel=kvm,usb=off,mem-merge=off" self._opt[u"console"] = u"ttyS0" - self._testpmd_path = f"{Constants.QEMU_VM_DPDK}/" \ - f"{dpdk_target}-linux-gcc/app" + self._testpmd_path = f"{Constants.QEMU_VM_DPDK}/build/app" self._vm_info = { u"host": node[u"host"], u"type": NodeType.VM, @@ -94,6 +93,8 @@ class QemuUtils: self._opt[u"smp"] = int(smp) self._opt[u"img"] = img self._opt[u"vnf"] = vnf + self._opt[u"page_size"] = page_size + # Temporary files. self._temp = dict() self._temp[u"log"] = f"/tmp/serial_{qemu_id}.log" @@ -118,6 +119,9 @@ class QemuUtils: def add_default_params(self): """Set default QEMU command line parameters.""" + mem_path = f"/dev/hugepages1G" \ + if self._opt[u"page_size"] == u"1G" else u"/dev/hugepages" + self._params.add(u"daemonize") self._params.add(u"nodefaults") self._params.add_with_value( @@ -136,11 +140,11 @@ class QemuUtils: ) self._params.add_with_value( u"object", f"memory-backend-file,id=mem," - f"size={self._opt.get(u'mem')}M,mem-path=/dev/hugepages,share=on" + f"size={self._opt.get(u'mem')}M," + f"mem-path={mem_path},share=on" ) self._params.add_with_value(u"m", f"{self._opt.get(u'mem')}M") self._params.add_with_value(u"numa", u"node,memdev=mem") - self._params.add_with_value(u"balloon", u"none") def add_net_user(self, net="10.0.2.0/24"): """Set managment port forwarding.""" @@ -206,6 +210,8 @@ class QemuUtils: def add_kernelvm_params(self): """Set KernelVM QEMU parameters.""" + hugepages = 3 if self._opt[u"page_size"] == u"1G" else 512 + self._params.add_with_value( u"serial", f"file:{self._temp.get(u'log')}" ) @@ -224,32 +230,35 @@ class QemuUtils: self._params.add_with_value( u"append", f"'ro rootfstype=9p rootflags=trans=virtio " f"root=virtioroot console={self._opt.get(u'console')} " - f"tsc=reliable hugepages=512 " + f"tsc=reliable hugepages={hugepages} " + f"hugepagesz={self._opt.get(u'page_size')} " f"init={self._temp.get(u'ini')} fastboot'" ) def add_vhost_user_if( - self, socket, server=True, jumbo_frames=False, queue_size=None, + self, socket, server=True, jumbo=False, queue_size=None, queues=1, virtio_feature_mask=None): """Add Vhost-user interface. :param socket: Path of the unix socket. :param server: If True the socket shall be a listening socket. - :param jumbo_frames: Set True if jumbo frames are used in the test. + :param jumbo: Set True if jumbo frames are used in the test. :param queue_size: Vring queue size. :param queues: Number of queues. :param virtio_feature_mask: Mask of virtio features to be enabled. :type socket: str :type server: bool - :type jumbo_frames: bool + :type jumbo: bool :type queue_size: int :type queues: int :type virtio_feature_mask: int """ self._nic_id += 1 + if jumbo: + logger.debug(u"Jumbo frames temporarily disabled!") self._params.add_with_value( u"chardev", f"socket,id=char{self._nic_id}," - f"path={socket}{u',server' if server is True else u''}" + f"path={socket}{u',server=on' if server is True else u''}" ) self._params.add_with_value( u"netdev", f"vhost-user,id=vhost{self._nic_id}," @@ -315,9 +324,10 @@ class QemuUtils: vpp_config.add_unix_exec(running) vpp_config.add_socksvr() vpp_config.add_main_heap_size(u"512M") - vpp_config.add_main_heap_page_size(u"2M") + vpp_config.add_main_heap_page_size(self._opt[u"page_size"]) + vpp_config.add_default_hugepage_size(self._opt[u"page_size"]) vpp_config.add_statseg_size(u"512M") - vpp_config.add_statseg_page_size(u"2M") + vpp_config.add_statseg_page_size(self._opt[u"page_size"]) vpp_config.add_statseg_per_node_counters(u"on") vpp_config.add_buffers_per_numa(107520) vpp_config.add_cpu_main_core(u"0") @@ -332,7 +342,7 @@ class QemuUtils: vpp_config.add_dpdk_dev(u"0000:00:06.0", u"0000:00:07.0") vpp_config.add_dpdk_dev_default_rxq(kwargs[u"queues"]) vpp_config.add_dpdk_log_level(u"debug") - if not kwargs[u"jumbo_frames"]: + if not kwargs[u"jumbo"]: vpp_config.add_dpdk_no_multi_seg() vpp_config.add_dpdk_no_tx_checksum_offload() if "ipsec" in self._opt.get(u'vnf'): @@ -361,14 +371,14 @@ class QemuUtils: :param kwargs: Key-value pairs to construct command line parameters. :type kwargs: dict """ - pmd_max_pkt_len = u"9200" if kwargs[u"jumbo_frames"] else u"1518" + pmd_max_pkt_len = u"9200" if kwargs[u"jumbo"] else u"1518" testpmd_cmd = DpdkUtil.get_testpmd_cmdline( eal_corelist=f"0-{self._opt.get(u'smp') - 1}", eal_driver=False, eal_pci_whitelist0=u"0000:00:06.0", eal_pci_whitelist1=u"0000:00:07.0", eal_in_memory=True, - pmd_num_mbufs=16384, + pmd_num_mbufs=32768, pmd_fwd_mode=u"io", pmd_nb_ports=u"2", pmd_portmask=u"0x3", @@ -388,14 +398,14 @@ class QemuUtils: :param kwargs: Key-value pairs to construct command line parameters. :type kwargs: dict """ - pmd_max_pkt_len = u"9200" if kwargs[u"jumbo_frames"] else u"1518" + pmd_max_pkt_len = u"9200" if kwargs[u"jumbo"] else u"1518" testpmd_cmd = DpdkUtil.get_testpmd_cmdline( eal_corelist=f"0-{self._opt.get(u'smp') - 1}", eal_driver=False, eal_pci_whitelist0=u"0000:00:06.0", eal_pci_whitelist1=u"0000:00:07.0", eal_in_memory=True, - pmd_num_mbufs=16384, + pmd_num_mbufs=32768, pmd_fwd_mode=u"mac", pmd_nb_ports=u"2", pmd_portmask=u"0x3", @@ -595,7 +605,7 @@ class QemuUtils: except AttributeError: self._wait_default() - def _wait_default(self, retries=60): + def _wait_default(self, retries=120): """Wait until QEMU with VPP is booted. :param retries: Number of retries. @@ -722,7 +732,9 @@ class QemuUtils: message = f"QEMU: Start failed on {self._node[u'host']}!" try: DUTSetup.check_huge_page( - self._node, u"/dev/hugepages", int(self._opt.get(u"mem"))) + self._node, self._opt.get(u"mem-path"), + int(self._opt.get(u"mem")) + ) exec_cmd_no_error( self._node, cmd_opts, timeout=300, sudo=True, message=message