feat(core): Add dpdk log level
[csit.git] / resources / libraries / python / QemuUtils.py
index 21de620..35959ce 100644 (file)
@@ -1,4 +1,4 @@
-# Copyright (c) 2021 Cisco and/or its affiliates.
+# Copyright (c) 2022 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,7 +140,8 @@ 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")
@@ -205,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')}"
         )
@@ -223,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'"
         )
 
@@ -246,6 +254,8 @@ 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''}"
@@ -314,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")
@@ -330,7 +341,7 @@ class QemuUtils:
             vpp_config.add_plugin(u"enable", u"dpdk_plugin.so")
             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")
+            vpp_config.add_dpdk_log_level(u".*,debug")
             if not kwargs[u"jumbo_frames"]:
                 vpp_config.add_dpdk_no_multi_seg()
                 vpp_config.add_dpdk_no_tx_checksum_offload()
@@ -367,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",
@@ -394,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",
@@ -721,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