aboutsummaryrefslogtreecommitdiffstats
path: root/resources/libraries/python/QemuUtils.py
diff options
context:
space:
mode:
Diffstat (limited to 'resources/libraries/python/QemuUtils.py')
-rw-r--r--resources/libraries/python/QemuUtils.py44
1 files changed, 28 insertions, 16 deletions
diff --git a/resources/libraries/python/QemuUtils.py b/resources/libraries/python/QemuUtils.py
index 51fba6105e..2df89ee87c 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) 2022-2023 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,7 +230,8 @@ 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'"
)
@@ -247,9 +254,11 @@ class QemuUtils:
:type virtio_feature_mask: int
"""
self._nic_id += 1
+ if jumbo_frames:
+ 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")
@@ -368,7 +378,7 @@ class QemuUtils:
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",
@@ -395,7 +405,7 @@ class QemuUtils:
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