Merge "testpmd: Simplify GUEST's testpmd configuration"
[vswitchperf.git] / vnfs / qemu / qemu.py
index 01c16a0..67dbfab 100644 (file)
@@ -81,11 +81,18 @@ class IVnfQemu(IVnf):
                               self._testpmd_fwd_mode, 'io')
             self._testpmd_fwd_mode = 'io'
 
+        guest_smp = int(get_test_param('guest_smp', 0))
+        if guest_smp:
+            override_list = [guest_smp] * (self._number + 1)
+            S.setValue('GUEST_SMP', override_list)
+
         name = 'Client%d' % self._number
         vnc = ':%d' % self._number
-        # don't use taskset to affinize main qemu process; It causes hangup
-        # of 2nd VM in case of DPDK. It also slows down VM responsivnes.
-        self._cmd = ['sudo', '-E', S.getValue('TOOLS')['qemu-system'],
+        # NOTE: affinization of main qemu process can cause hangup of 2nd VM
+        # in case of DPDK usage. It can also slow down VM response time.
+        cpumask = ",".join(S.getValue('GUEST_CORE_BINDING')[self._number])
+        self._cmd = ['sudo', '-E', 'taskset', '-c', cpumask,
+                     S.getValue('TOOLS')['qemu-system'],
                      '-m', S.getValue('GUEST_MEMORY')[self._number],
                      '-smp', str(S.getValue('GUEST_SMP')[self._number]),
                      '-cpu', 'host,migratable=off',
@@ -230,14 +237,18 @@ class IVnfQemu(IVnf):
             stdin=proc.stdout)
         proc.wait()
 
+        guest_core_binding = int(get_test_param('guest_core_binding', 0))
         for cpu in range(0, int(S.getValue('GUEST_SMP')[self._number])):
             match = None
             for line in output.decode(cur_locale).split('\n'):
                 match = re.search(thread_id % cpu, line)
                 if match:
-                    self._affinitize_pid(
-                        S.getValue('GUEST_CORE_BINDING')[self._number][cpu],
-                        match.group(1))
+                    if guest_core_binding:
+                        self._affinitize_pid(guest_core_binding, match.group(1))
+                    else:
+                        self._affinitize_pid(
+                            S.getValue('GUEST_CORE_BINDING')[self._number][cpu],
+                            match.group(1))
                     break
 
             if not match:
@@ -389,25 +400,14 @@ class IVnfQemu(IVnf):
                               '/DPDK/app/test-pmd')
         self.execute_and_wait('make clean')
         self.execute_and_wait('make')
-        if int(S.getValue('GUEST_NIC_QUEUES')[self._number]):
-            self.execute_and_wait(
-                './testpmd {} -n4 --socket-mem 512 --'.format(
-                    S.getValue('GUEST_TESTPMD_CPU_MASK')[self._number]) +
-                ' --burst=64 -i --txqflags=0xf00 ' +
-                '--nb-cores={} --rxq={} --txq={} '.format(
-                    S.getValue('GUEST_TESTPMD_NB_CORES')[self._number],
-                    S.getValue('GUEST_TESTPMD_TXQ')[self._number],
-                    S.getValue('GUEST_TESTPMD_RXQ')[self._number]) +
-                '--disable-hw-vlan', 60, "Done")
-        else:
-            self.execute_and_wait(
-                './testpmd {} -n 4 --socket-mem 512 --'.format(
-                    S.getValue('GUEST_TESTPMD_CPU_MASK')[self._number]) +
-                ' --burst=64 -i --txqflags=0xf00 ' +
-                '--disable-hw-vlan', 60, "Done")
+
+        # get testpmd settings from CLI
+        testpmd_params = get_test_param('guest_testpmd_params',
+                                        S.getValue('GUEST_TESTPMD_PARAMS')[self._number])
+
+        self.execute_and_wait( './testpmd {}'.format(testpmd_params), 60, "Done")
         self.execute('set fwd ' + self._testpmd_fwd_mode, 1)
-        self.execute_and_wait('start', 20,
-                              'TX RS bit threshold=.+ - TXQ flags=0xf00')
+        self.execute_and_wait('start', 20, 'testpmd>')
 
     def _configure_l2fwd(self):
         """