IPsec: add 4, 40 and 400 tunnel policy tests
[csit.git] / resources / libraries / python / CpuUtils.py
index e4fff01..170cbe6 100644 (file)
@@ -1,4 +1,4 @@
-# Copyright (c) 2020 Cisco and/or its affiliates.
+# Copyright (c) 2021 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:
@@ -84,6 +84,29 @@ class CpuUtils:
                         [CpuUtils.__str2int(x) for x in line.split(u",")]
                     )
 
+    @staticmethod
+    def worker_count_from_cores_and_smt(phy_cores, smt_used):
+        """Simple conversion utility, needs smt from caller.
+
+        The implementation assumes we pack 1 or 2 workers per core,
+        depending on hyperthreading.
+
+        Some keywords use None to indicate no core/worker limit,
+        so this converts None to None.
+
+        :param phy_cores: How many physical cores to use for workers.
+        :param smt_used: Whether symmetric multithreading is used.
+        :type phy_cores: Optional[int]
+        :type smt_used: bool
+        :returns: How many VPP workers fit into the given number of cores.
+        :rtype: Optional[int]
+        """
+        if phy_cores is None:
+            return None
+        workers_per_core = CpuUtils.NR_OF_THREADS if smt_used else 1
+        workers = phy_cores * workers_per_core
+        return workers
+
     @staticmethod
     def cpu_node_count(node):
         """Return count of numa nodes.
@@ -392,3 +415,57 @@ class CpuUtils:
             smt_used=False)
 
         return master_thread_id[0], latency_thread_id[0], cpu_node, threads
+
+    @staticmethod
+    def get_affinity_iperf(
+            node, pf_key, cpu_skip_cnt=0, cpu_cnt=1):
+        """Get affinity for iPerf3. Result will be used to pin iPerf3 threads.
+
+        :param node: Topology node.
+        :param pf_key: Topology interface.
+        :param cpu_skip_cnt: Amount of CPU cores to skip.
+        :param cpu_cnt: CPU threads count.
+        :type node: dict
+        :type pf_key: str
+        :type cpu_skip_cnt: int
+        :type cpu_cnt: int
+        :returns: List of CPUs allocated to iPerf3.
+        :rtype: str
+        """
+        if pf_key:
+            cpu_node = Topology.get_interface_numa_node(node, pf_key)
+        else:
+            cpu_node = 0
+
+        return CpuUtils.cpu_range_per_node_str(
+            node, cpu_node, skip_cnt=cpu_skip_cnt, cpu_cnt=cpu_cnt,
+            smt_used=False)
+
+    @staticmethod
+    def get_affinity_vhost(
+            node, pf_key, skip_cnt=0, cpu_cnt=1):
+        """Get affinity for vhost. Result will be used to pin vhost threads.
+
+        :param node: Topology node.
+        :param pf_key: Topology interface.
+        :param skip_cnt: Amount of CPU cores to skip.
+        :param cpu_cnt: CPU threads count.
+        :type node: dict
+        :type pf_key: str
+        :type skip_cnt: int
+        :type cpu_cnt: int
+        :returns: List of CPUs allocated to vhost process.
+        :rtype: str
+        """
+        if pf_key:
+            cpu_node = Topology.get_interface_numa_node(node, pf_key)
+        else:
+            cpu_node = 0
+
+        smt_used = CpuUtils.is_smt_enabled(node[u"cpuinfo"])
+        if smt_used:
+            cpu_cnt = cpu_cnt // CpuUtils.NR_OF_THREADS
+
+        return CpuUtils.cpu_slice_of_list_per_node(
+            node, cpu_node=cpu_node, skip_cnt=skip_cnt, cpu_cnt=cpu_cnt,
+            smt_used=False)