test suite reviews and discussions
 help / color / mirror / Atom feed
* [dts] [PATCH V2] add test suite for vf interruot_pmd
@ 2017-09-08  2:30 xu,gang
  2017-09-08  2:30 ` [dts] [PATCH V1] modify the interrupt pmd test plan xu,gang
                   ` (2 more replies)
  0 siblings, 3 replies; 6+ messages in thread
From: xu,gang @ 2017-09-08  2:30 UTC (permalink / raw)
  To: dts; +Cc: xu,gang

Signed-off-by: xu,gang <gangx.xu@intel.com>
---
 tests/TestSuite_vf_interrupt_pmd.py | 295 ++++++++++++++++++++++++++++++++++++
 1 file changed, 295 insertions(+)
 create mode 100644 tests/TestSuite_vf_interrupt_pmd.py

diff --git a/tests/TestSuite_vf_interrupt_pmd.py b/tests/TestSuite_vf_interrupt_pmd.py
new file mode 100644
index 0000000..b78bf8f
--- /dev/null
+++ b/tests/TestSuite_vf_interrupt_pmd.py
@@ -0,0 +1,295 @@
+# BSD LICENSE
+#
+# Copyright(c) 2010-2017 Intel Corporation. All rights reserved.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+#   * Redistributions of source code must retain the above copyright
+#     notice, this list of conditions and the following disclaimer.
+#   * Redistributions in binary form must reproduce the above copyright
+#     notice, this list of conditions and the following disclaimer in
+#     the documentation and/or other materials provided with the
+#     distribution.
+#   * Neither the name of Intel Corporation nor the names of its
+#     contributors may be used to endorse or promote products derived
+#     from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+"""
+DPDK Test suite.
+Test vf_interrupt_pmd.
+"""
+
+import utils
+import string
+import time
+import re
+from pmd_output import PmdOutput
+from qemu_kvm import QEMUKvm
+from test_case import TestCase
+
+
+class TestVfInterruptPmd(TestCase):
+
+    def set_up_all(self):
+        """
+        Run at the start of each test suite.
+        """
+        self.dut_ports = self.dut.get_ports(self.nic)
+        self.verify(len(self.dut_ports) >= 2, "Insufficient ports")
+        cores = self.dut.get_core_list("1S/4C/1T")
+        self.coremask = utils.create_mask(cores)
+        self.portmask = utils.create_mask(self.dut_ports)
+
+        self.path = "./examples/l3fwd-power/build/l3fwd-power"
+
+        testport_0 = self.tester.get_local_port(self.dut_ports[0])
+        self.rx_intf_0 = self.tester.get_interface(testport_0)
+        testport_1 = self.tester.get_local_port(self.dut_ports[1])
+        self.rx_intf_1 = self.tester.get_interface(testport_1)
+
+        self.mac_port_0 = self.dut.get_mac_address(self.dut_ports[0])
+        self.mac_port_1 = self.dut.get_mac_address(self.dut_ports[1])
+
+        self.dut.virt_exit()
+
+    def build_app(self, use_dut):
+        # build sample app
+        out = use_dut.build_dpdk_apps("./examples/l3fwd-power")
+        self.verify("Error" not in out, "compilation error 1")
+        self.verify("No such file" not in out, "compilation error 2")
+
+    def set_up(self):
+        """
+        Run before each test case.
+        """
+        pass
+
+    def generate_sriov_vfport(self, use_driver):
+        """
+        generate sriov vfs by port
+        """
+        self.used_dut_port_0 = self.dut_ports[0]
+        self.used_dut_port_1 = self.dut_ports[1]
+        self.dut.generate_sriov_vfs_by_port(
+            self.used_dut_port_0, 1, driver=use_driver)
+        self.sriov_vfs_port_0 = self.dut.ports_info[
+            self.used_dut_port_0]['vfs_port']
+        self.dut.generate_sriov_vfs_by_port(
+            self.used_dut_port_1, 1, driver=use_driver)
+        self.sriov_vfs_port_1 = self.dut.ports_info[
+            self.used_dut_port_1]['vfs_port']
+
+    def bind_vfs(self, driver):
+        """
+        bind vfs to driver
+        """
+        for port in self.sriov_vfs_port_0:
+            port.bind_driver(driver)
+        time.sleep(1)
+        for port in self.sriov_vfs_port_1:
+            port.bind_driver(driver)
+        time.sleep(1)
+
+    def setup_vm_env(self):
+        """
+        Start One VM with one virtio device
+        """
+        self.dut_testpmd = PmdOutput(self.dut)
+        self.dut_testpmd.start_testpmd(
+            "Default", "--rxq=4 --txq=4 --port-topology=chained")
+        self.dut_testpmd.execute_cmd("start")
+
+        vf0_prop_1 = {'opt_host': self.sriov_vfs_port_0[0].pci}
+        vf0_prop_2 = {'opt_host': self.sriov_vfs_port_1[0].pci}
+        self.vm0 = QEMUKvm(self.dut, 'vm0', 'vf_interrupt_pmd')
+        self.vm0.set_vm_device(driver='pci-assign', **vf0_prop_1)
+        self.vm0.set_vm_device(driver='pci-assign', **vf0_prop_2)
+        try:
+            self.vm0_dut = self.vm0.start()
+            if self.vm0_dut is None:
+                raise Exception("Set up VM ENV failed")
+            else:
+                self.verify(self.vm0_dut.ports_info[
+                            0]['intf'] != 'N/A', "Not interface")
+        except Exception as e:
+            self.destroy_vm_env()
+            self.logger.error("Failure for %s" % str(e))
+
+        self.vm0_vf0_mac = self.vm0_dut.get_mac_address(0)
+        self.vm0_vf1_mac = self.vm0_dut.get_mac_address(1)
+        self.vm0_dut.send_expect("systemctl stop NetworkManager", "# ", 60)
+
+    def destroy_vm_env(self):
+        """
+        destroy vm environment
+        """
+        if getattr(self, 'vm0', None):
+            self.vm0_dut.kill_all()
+            self.vm0_dut_ports = None
+            # destroy vm0
+            self.vm0.stop()
+            self.vm0 = None
+
+        if getattr(self, 'used_dut_port_0', None) != None:
+            self.dut.destroy_sriov_vfs_by_port(self.used_dut_port_0)
+            self.used_dut_port_0 = None
+
+        if getattr(self, 'used_dut_port_1', None) != None:
+            self.dut.destroy_sriov_vfs_by_port(self.used_dut_port_1)
+            self.used_dut_port_1 = None
+
+        self.env_done = False
+
+    def change_port_conf(self, use_dut, lsc_enable=True, rxq_enable=True):
+        """
+        change interrupt enable
+        """
+        sed_cmd_fmt = "/intr_conf.*=.*{/,/\}\,$/c\    .intr_conf = {\\n\\t\\t.lsc = %d,\\n\\t\\t.rxq = %d,\\n\\t},"
+        lsc = 1
+        rxq = 1
+        if lsc_enable:
+            lsc = 0
+        if rxq_enable:
+            rxq = 1
+        sed_cmd_str = sed_cmd_fmt % (lsc, rxq)
+        out = use_dut.send_expect(
+            "sed -i '%s' examples/l3fwd-power/main.c" % sed_cmd_str, "# ", 60)
+
+    def scapy_send_packet(self, mac, testinterface, queuenum=1):
+        """
+        Send a packet to port
+        """
+        if queuenum == 1:
+            self.tester.scapy_append(
+                'sendp([Ether(dst="%s")/IP()/UDP()/Raw(\'X\'*18)], iface="%s")' % (mac, testinterface))
+        elif queuenum == 2:
+            for dst in range(16):
+                self.tester.scapy_append(
+                    'sendp([Ether(dst="%s")/IP(dst="127.0.0.%d")/UDP()/Raw(\'X\'*18)], iface="%s")' % (mac, dst, testinterface))
+        else:
+            for dst in range(256):
+                self.tester.scapy_append(
+                    'sendp([Ether(dst="%s")/IP(dst="127.0.0.%d")/UDP()/Raw(\'X\'*18)], iface="%s")' % (mac, dst, testinterface))
+        self.tester.scapy_execute()
+
+    def test_vf_VM_uio(self):
+        """
+        verify VF interrupt pmd in VM with uio
+        """
+        self.verify(self.drivername in ['igb_uio'], "NOT Support")
+        self.generate_sriov_vfport('igb_uio')
+        self.bind_vfs('pci-stub')
+        self.setup_vm_env()
+        self.change_port_conf(self.vm0_dut, lsc_enable=True, rxq_enable=False)
+        self.build_app(self.vm0_dut)
+
+        cmd = self.path + \
+            " -c f -n %d -- -p 0x3 -P --config='(0,0,1),(1,0,2)'" % (
+                self.vm0_dut.get_memory_channels())
+        self.vm0_dut.send_expect(cmd, "L3FWD_POWER", 60)
+        self.scapy_send_packet(self.vm0_vf0_mac, self.rx_intf_0)
+        self.scapy_send_packet(self.vm0_vf1_mac, self.rx_intf_1)
+        out = self.vm0_dut.get_session_output(timeout=30)
+        self.destroy_vm_env()
+        self.dut.send_expect("quit", "# ", 60)
+        self.verify(
+            "lcore 1 is waked up from rx interrupt on port 0" in out, "lcore 1 not waked up")
+        self.verify(
+            "lcore 1 sleeps until interrupt triggers" in out, "lcore 1 not sleeps")
+        self.verify(
+            "lcore 2 is waked up from rx interrupt on port 1" in out, "lcore 2 not waked up")
+        self.verify(
+            "lcore 2 sleeps until interrupt triggers" in out, "lcore 2 not sleeps")
+
+    def test_vf_host_uio(self):
+        """
+        verify VF interrupt pmd in Host with uio
+        """
+        self.verify(self.drivername in ['igb_uio'], "NOT Support")
+        self.dut.restore_interfaces()
+        self.generate_sriov_vfport('ixgbe')
+        self.bind_vfs('igb_uio')
+        self.change_port_conf(self.dut, lsc_enable=True, rxq_enable=False)
+        self.build_app(self.dut)
+
+        cmd = self.path + " -c %s -n %d -- -p %s -P --config='(0,0,1),(1,0,2)'" % (
+            self.coremask, self.dut.get_memory_channels(), self.portmask)
+        self.dut.send_expect(cmd, "L3FWD_POWER", 60)
+        self.scapy_send_packet(self.mac_port_0, self.rx_intf_0)
+        self.scapy_send_packet(self.mac_port_1, self.rx_intf_1)
+        out = self.dut.get_session_output(timeout=60)
+        self.dut.send_expect("^C", "# ", 60)
+        self.verify(
+            "lcore 1 is waked up from rx interrupt on port 0" in out, "lcore 1 not waked up")
+        self.verify(
+            "lcore 1 sleeps until interrupt triggers" in out, "lcore 1 not sleeps")
+        self.verify(
+            "lcore 2 is waked up from rx interrupt on port 1" in out, "lcore 2 not waked up")
+        self.verify(
+            "lcore 2 sleeps until interrupt triggers" in out, "lcore 2 not sleeps")
+
+    def test_vf_host_vfio(self):
+        """
+        verify VF interrupt pmd in Host with vfio
+        """
+        self.verify(self.drivername in ['vfio-pci'], "NOT Support")
+        self.dut.restore_interfaces()
+        self.generate_sriov_vfport('ixgbe')
+        self.bind_vfs('vfio-pci')
+        self.change_port_conf(self.dut, lsc_enable=True, rxq_enable=False)
+        self.build_app(self.dut)
+
+        cmd = self.path + " -c %s -n %d -- -p %s -P --config='(0,0,1),(0,1,2)(1,0,3),(1,1,4)'" % (
+            self.coremask, self.dut.get_memory_channels(), self.portmask)
+        self.dut.send_expect(cmd, "L3FWD_POWER", 60)
+        self.scapy_send_packet(self.mac_port_0, self.rx_intf_0, 2)
+        self.scapy_send_packet(self.mac_port_1, self.rx_intf_1, 2)
+        out = self.dut.get_session_output(timeout=60)
+        self.dut.send_expect("^C", "# ", 60)
+        print out
+        self.verify(
+            "lcore 1 is waked up from rx interrupt on port 0" in out, "lcore 1 not waked up")
+        self.verify(
+            "lcore 1 sleeps until interrupt triggers" in out, "lcore 1 not sleeps")
+        self.verify(
+            "lcore 2 is waked up from rx interrupt on port 0" in out, "lcore 2 not waked up")
+        self.verify(
+            "lcore 2 sleeps until interrupt triggers" in out, "lcore 2 not sleeps")
+        self.verify(
+            "lcore 3 is waked up from rx interrupt on port 1" in out, "lcore 2 not waked up")
+        self.verify(
+            "lcore 3 sleeps until interrupt triggers" in out, "lcore 2 not sleeps")
+        self.verify(
+            "lcore 4 is waked up from rx interrupt on port 1" in out, "lcore 2 not waked up")
+        self.verify(
+            "lcore 4 sleeps until interrupt triggers" in out, "lcore 2 not sleeps")
+
+    def tear_down(self):
+        """
+        Run after each test case.
+        """
+        self.dut.virt_exit()
+        self.dut.kill_all()
+        time.sleep(2)
+
+    def tear_down_all(self):
+        """
+        Run after each test suite.
+        """
+        pass
-- 
1.9.3

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [dts] [PATCH V1] modify the interrupt pmd test plan
  2017-09-08  2:30 [dts] [PATCH V2] add test suite for vf interruot_pmd xu,gang
@ 2017-09-08  2:30 ` xu,gang
  2017-10-09 11:51   ` Liu, Yong
  2017-09-08  2:30 ` [dts] [PATCH V1] add vf " xu,gang
  2017-09-08  2:30 ` [dts] [PATCH V1] add test suite vf interrupt_pmd xu,gang
  2 siblings, 1 reply; 6+ messages in thread
From: xu,gang @ 2017-09-08  2:30 UTC (permalink / raw)
  To: dts; +Cc: xu,gang

merge PF interrupt pmd test with uio vfio mode and check state with different queue in it
remove VF interrupt pmd test case to VF interrupt pmd test suite

Signed-off-by: xu,gang <gangx.xu@intel.com>
---
 test_plans/interrupt_pmd_test_plan.rst | 170 ++++-----------------------------
 1 file changed, 19 insertions(+), 151 deletions(-)

diff --git a/test_plans/interrupt_pmd_test_plan.rst b/test_plans/interrupt_pmd_test_plan.rst
index 6dfd821..7503283 100644
--- a/test_plans/interrupt_pmd_test_plan.rst
+++ b/test_plans/interrupt_pmd_test_plan.rst
@@ -57,8 +57,8 @@ Iommu pass through feature has been enabled in kernel.
 Support igb_uio and vfio driver, if used vfio, kernel need 3.6+ and enable vt-d
 in bios. When used vfio, requested to insmod two drivers vfio and vfio-pci.
 	
-Test Case1: PF interrupt pmd with uio
-=====================================
+Test Case1: PF interrupt pmd with different queue
+=================================================
 Run l3fwd-power with one queue per port::
 	l3fwd-power -c 7 -n 4 -- -p 0x3 -P --config="(0,0,1),(1,0,2)"
 
@@ -76,51 +76,29 @@ After the packet forwarded, thread on core1 and core 2 will return to sleep.
 Send packet flows to Port0 and Port1, check that thread on core1 and core2 will
 keep up awake.	
 
-Test Case2: PF interrupt pmd with vfio
-======================================
-Run l3fwd-power with one queue per port::
-	l3fwd-power -c 7 -n 4 -- -p 0x3 -P --config="(0,0,1),(1,0,2)"
+Run l3fwd-power with random number queue per port, if is 4::
+        l3fwd-power -c 7 -n 4 -- -p 0x3 -P --config="0,0,0),(0,1,1),\
+                        (0,2,2),(0,3,3),(0,4,4)"
 
-Send one packet to Port0 and Port1, check that thread on core1 and core2 
-waked up:
-	L3FWD_POWER: lcore 1 is waked up from rx interrupt on port1,rxq0
-	L3FWD_POWER: lcore 2 is waked up from rx interrupt on port1,rxq0
-	
-Check the packet has been normally forwarded.
-
-After the packet forwarded, thread on core1 and core 2 will return to sleep.
-	L3FWD_POWER: lcore 1 sleeps until interrupt on port0,rxq0 triggers
-	L3FWD_POWER: lcore 2 sleeps until interrupt on port0,rxq0 triggers
+Send packet with increased dest IP to Port0, check that all threads waked up
 
 Send packet flows to Port0 and Port1, check that thread on core1 and core2 will
-keep up awake.	
-
-Test Case3: PF interrupt pmd multi queue with vfio
-==================================================
-Run l3fwd-power with two queues per port::
-	l3fwd-power -c 1f -n 4 -- -p 0x3 \
-		--config="(0,0,1),(0,1,2)(1,0,3),(1,1,4)"
+keep up awake.
 
-Send packet with increased dest IP to Port0 and Port1, check that thread on 
-core1,core2,core3,core4 waked up:
-	L3FWD_POWER: lcore 1 is waked up from rx interrupt on port1,rxq0
-	L3FWD_POWER: lcore 2 is waked up from rx interrupt on port1,rxq1
-	L3FWD_POWER: lcore 3 is waked up from rx interrupt on port1,rxq0
-	L3FWD_POWER: lcore 4 is waked up from rx interrupt on port1,rxq1
-	
-Check the packet has been normally forwarded.
+Run l3fwd-power with 32 queues per port::
+        l3fwd-power -c ffffffff -n 4 -- -p 0x3 -P --config="(0,0,0),(0,1,1),\
+                        (0,2,2),(0,3,3),(0,4,4),(0,5,5),(0,6,6),(0,7,7),(0,8,8),
+                        (0,9,9),(0,10,10),(0,11,11),(0,12,12),(0,13,13),(0,14,14),\
+                        (0,15,15),\
+                        (1,0,16),(1,1,17),(1,2,18),(1,3,19),(1,4,20),(1,5,21),(1,6,22),\
+                        (1,7,23),(1,8,24),(1,9,25),(1,10,26),(1,11,27),(1,12,28),\
+                        (1,13,29),(1,14,30),\(1,15,31)"
+Send packet with increased dest IP to Port0, check that all threads waked up
 
-After the packet forwarded, thread on core1,core2,core3,core4 will return to 
-sleep.
-	L3FWD_POWER: lcore 1 sleeps until interrupt on port0,rxq0 triggers
-	L3FWD_POWER: lcore 2 sleeps until interrupt on port0,rxq1 triggers
-	L3FWD_POWER: lcore 3 sleeps until interrupt on port1,rxq0 triggers
-	L3FWD_POWER: lcore 4 sleeps until interrupt on port1,rxq1 triggers
+igb_uio driver only ues one queue 0
 
-Send packet flows to Port0 and Port1, check that thread on core1,core2,core3,
-core4 will keep up awake.
 
-Test Case4: PF lsc interrupt with vfio
+Test Case2: PF lsc interrupt with vfio
 ======================================
 Run l3fwd-power with one queue per port::
 	l3fwd-power -c 7 -n 4 -- -p 0x3 -P --config="(0,0,1),(1,0,2)"
@@ -137,118 +115,8 @@ driver.
 Plug in Port1 cable, check that link up interrtup captured and handled by pmd 
 driver.
 
-Test Case5: PF interrupt max Rx queues with vfio
-================================================
-Run l3fwd-power with 32 queues per port::
-	l3fwd-power -c ffffffff -n 4 -- -p 0x3 -P --config="(0,0,0),(0,1,1),\
-			(0,2,2),(0,3,3),(0,4,4),(0,5,5),(0,6,6),(0,7,7),(0,8,8),
-			(0,9,9),(0,10,10),(0,11,11),(0,12,12),(0,13,13),(0,14,14),\
-			(0,15,15),\
-			(1,0,16),(1,1,17),(1,2,18),(1,3,19),(1,4,20),(1,5,21),(1,6,22),\
-			(1,7,23),(1,8,24),(1,9,25),(1,10,26),(1,11,27),(1,12,28),\
-			(1,13,29),(1,14,30),\(1,15,31)"
-
-Send packet with increased dest IP to Port0, check that all threads waked up:
-
-Test Case6: VF interrupt pmd in VM with uio
-===========================================
-Create one VF per Port in host and add these two VFs into VM:
-	rmmod ixgbe
-	modprobe ixgbe max_vfs=1
-	virsh
-	virsh # nodedev-dettach PCI_VF1
-	virsh # nodedev-dettach PCI_VF2
-	
-Assign mac address for VF:
-	ip link set p786p1 vf 0 mac 00:11:22:33:44:55
-	ip link set p786p2 vf 0 mac 00:11:22:33:44:66
-
-Start VM and start l3fwd-power with one queue per port in VM:
-	l3fwd-power -c 7 -n 4 -- -p 0x3 -P --config="(0,0,1),(1,0,2)"
-
-Send one packet to VF0 and VF1, check that thread on core1 and core2 waked up:
-	L3FWD_POWER: lcore 1 is waked up from rx interrupt on port1,rxq0
-	L3FWD_POWER: lcore 2 is waked up from rx interrupt on port1,rxq0
-	
-Check the packet has been normally forwarded.
-
-After the packet forwarded, thread on core1 and core 2 will return to sleep.
-	L3FWD_POWER: lcore 1 sleeps until interrupt on port0,rxq0 triggers
-	L3FWD_POWER: lcore 2 sleeps until interrupt on port0,rxq0 triggers
-
-Send packet flows to VF0 and VF1, check that thread on core1 and core2 will 
-keep up awake.
-
-Test Case7: VF interrupt pmd in Host with uio
-=============================================
-Create one VF per Port in host and make sure PF interface up:
-	rmmod ixgbe
-	modprobe ixgbe max_vfs=1
-	ifconfig p786p1 up
-	ifconfig p786p2 up
-	
-Assign mac address for VF:
-	ip link set p786p1 vf 0 mac 00:11:22:33:44:55
-	ip link set p786p2 vf 0 mac 00:11:22:33:44:66
-
-Bind VF device to igb_uio:
-	./usertools/dpdk-devbind.py --bind=igb_uio 0000:08:10.0 0000:08:10.1
-	
-Start VM and start l3fwd-power with one queue per port in VM:
-	l3fwd-power -c 7 -n 4 -- -p 0x3 -P --config="(0,0,1),(1,0,2)"
-
-Send one packet to VF0 and VF1, check that thread on core1 and core2 waked up:
-	L3FWD_POWER: lcore 1 is waked up from rx interrupt on port1,rxq0
-	L3FWD_POWER: lcore 2 is waked up from rx interrupt on port1,rxq0
-	
-Check the packet has been normally forwarded.
-
-After the packet forwarded, thread on core1 and core 2 will return to sleep.
-	L3FWD_POWER: lcore 1 sleeps until interrupt on port0,rxq0 triggers
-	L3FWD_POWER: lcore 2 sleeps until interrupt on port0,rxq0 triggers
-
-Send packet flows to VF0 and VF1, check that thread on core1 and core2 will 
-keep up awake.
-
-Test Case8: VF interrupt pmd in Host with vfio
-==============================================
-Create one VF per Port in host and make sure PF interface up:
-	rmmod ixgbe
-	modprobe ixgbe max_vfs=2
-	ifconfig p786p1 up
-	ifconfig p786p2 up
-	
-Assign mac address for VF:
-	ip link set p786p1 vf 0 mac 00:11:22:33:44:55
-	ip link set p786p2 vf 0 mac 00:11:22:33:44:66
-
-Bind VF device to igb_uio:
-	./usertools/dpdk-devbind.py --bind=igb_uio 0000:08:10.0 0000:08:10.1
-	
-Start VM and start l3fwd-power with two queues per port in VM:
-	l3fwd-power -c 1f -n 4 -- -p 0x3 -P \
-		--config="(0,0,1),(0,1,2)(1,0,3),(1,1,4)"
-
-Send packets with increased dest IP to Port0 and Port1, check that thread on 
-core1,core2,core3,core4 waked up:
-	L3FWD_POWER: lcore 1 is waked up from rx interrupt on port1,rxq0
-	L3FWD_POWER: lcore 2 is waked up from rx interrupt on port1,rxq1
-	L3FWD_POWER: lcore 3 is waked up from rx interrupt on port1,rxq0
-	L3FWD_POWER: lcore 4 is waked up from rx interrupt on port1,rxq1
-	
-Check the packet has been normally forwarded.
-
-After the packet forwarded, thread on core1,core2,core3,core4 will return to 
-sleep.
-	L3FWD_POWER: lcore 1 sleeps until interrupt on port0,rxq0 triggers
-	L3FWD_POWER: lcore 2 sleeps until interrupt on port0,rxq1 triggers
-	L3FWD_POWER: lcore 3 sleeps until interrupt on port1,rxq0 triggers
-	L3FWD_POWER: lcore 4 sleeps until interrupt on port1,rxq1 triggers
-
-Send packet flows to Port0 and Port1, check that thread on core1,core2,core3,
-core4 will keep up awake.
 
-Test Case9: PF interrupt pmd latency test
+Test Case3: PF interrupt pmd latency test
 =========================================
 Setup validation scenario the case as test1
 Send burst packet flow to Port0 and Port1, use IXIA capture the maxmium 
-- 
1.9.3

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [dts] [PATCH V1] add vf interrupt pmd test plan
  2017-09-08  2:30 [dts] [PATCH V2] add test suite for vf interruot_pmd xu,gang
  2017-09-08  2:30 ` [dts] [PATCH V1] modify the interrupt pmd test plan xu,gang
@ 2017-09-08  2:30 ` xu,gang
  2017-09-08  2:30 ` [dts] [PATCH V1] add test suite vf interrupt_pmd xu,gang
  2 siblings, 0 replies; 6+ messages in thread
From: xu,gang @ 2017-09-08  2:30 UTC (permalink / raw)
  To: dts; +Cc: xu,gang

Signed-off-by: xu,gang <gangx.xu@intel.com>
---
 test_plans/vf_interrupt_pmd_test_plan.rst | 141 ++++++++++++++++++++++++++++++
 1 file changed, 141 insertions(+)
 create mode 100644 test_plans/vf_interrupt_pmd_test_plan.rst

diff --git a/test_plans/vf_interrupt_pmd_test_plan.rst b/test_plans/vf_interrupt_pmd_test_plan.rst
new file mode 100644
index 0000000..c8497d8
--- /dev/null
+++ b/test_plans/vf_interrupt_pmd_test_plan.rst
@@ -0,0 +1,141 @@
+.. Copyright (c) <2017>, Intel Corporation
+   All rights reserved.
+
+   Redistribution and use in source and binary forms, with or without
+   modification, are permitted provided that the following conditions
+   are met:
+
+   - Redistributions of source code must retain the above copyright
+     notice, this list of conditions and the following disclaimer.
+
+   - Redistributions in binary form must reproduce the above copyright
+     notice, this list of conditions and the following disclaimer in
+     the documentation and/or other materials provided with the
+     distribution.
+
+   - Neither the name of Intel Corporation nor the names of its
+     contributors may be used to endorse or promote products derived
+     from this software without specific prior written permission.
+
+   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+   FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+   COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+   INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+   (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+   SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+   HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+   STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+   ARISING IN ANY WAY OUT OF THE USE OF TH
+
+=====================
+One-shot Rx Interrupt 
+=====================
+One-shot Rx interrupt feature will split rx interrupt handling from other 
+interrupts like LSC interrupt. It implemented one handling mechanism to 
+eliminate non-deterministic DPDK polling thread wakeup latency.
+
+VFIO' multiple interrupt vectors support mechanism to enable multiple event fds
+serving per Rx queue interrupt handling.
+UIO has limited interrupt support, specifically it only support a single 
+interrupt vector, which is not suitable for enabling multi queues Rx/Tx 
+interrupt.
+
+Prerequisites
+=============
+Each of the 10Gb Ethernet* ports of the DUT is directly connected in
+full-duplex to a different port of the peer traffic generator.
+
+Assume PF port PCI addresses are 0000:04:00.0 and 0000:04:00.1, their Interfaces name are p786p1 and p786p2.
+Assume generated VF PCI address will be 0000:04:10.0, 0000:04:10.1.
+
+Iommu pass through feature has been enabled in kernel.
+	intel_iommu=on iommu=pt
+
+Support igb_uio and vfio driver, if used vfio, kernel need 3.6+ and enable vt-d
+in bios. When used vfio, requested to insmod two drivers vfio and vfio-pci.
+	
+Test Case1: VF interrupt pmd in VM with uio
+===========================================
+Create one VF per Port in host and add these two VFs into VM:
+	usertools/dpdk-devbind.py --force --bind=vfio-pci 0000:04:00.0 0000:04:00.1
+        echo 1 >/sys/bus/pci/devices/0000\:04\:00.0/max_vfs
+        echo 1 >/sys/bus/pci/devices/0000\:04\:00.1/max_vfs
+        usertools/dpdk-devbind.py --force --bind=pci-stub 0000:04:10.0 0000:04:10.1	
+	
+Start VM and start l3fwd-power with one queue per port in VM:
+	l3fwd-power -c 7 -n 4 -- -p 0x3 -P --config="(0,0,1),(1,0,2)"
+
+Send one packet to VF0 and VF1, check that thread on core1 and core2 waked up:
+	L3FWD_POWER: lcore 1 is waked up from rx interrupt on port1,rxq0
+	L3FWD_POWER: lcore 2 is waked up from rx interrupt on port1,rxq0
+	
+Check the packet has been normally forwarded.
+
+After the packet forwarded, thread on core1 and core 2 will return to sleep.
+	L3FWD_POWER: lcore 1 sleeps until interrupt on port0,rxq0 triggers
+	L3FWD_POWER: lcore 2 sleeps until interrupt on port0,rxq0 triggers
+
+Send packet flows to VF0 and VF1, check that thread on core1 and core2 will 
+keep up awake.
+
+Test Case2: VF interrupt pmd in Host with uio
+=============================================
+Create one VF per Port in host and make sure PF interface up
+ues kernel driver to create vf:        
+        echo 1 >/sys/bus/pci/devices/0000\:04\:00.1/sriov_numvf
+        echo 1 >/sys/bus/pci/devices/0000\:04\:00.1/sriov_numvf
+	
+Bind VF device to igb_uio:
+	./usertools/dpdk-devbind.py --bind=igb_uio 0000:04:10.0 0000:04:10.1
+	
+Start host and start l3fwd-power with one queue per port in host:
+	l3fwd-power -c 7 -n 4 -- -p 0x3 -P --config="(0,0,1),(1,0,2)"
+
+Send one packet to VF0 and VF1, check that thread on core1 and core2 waked up:
+	L3FWD_POWER: lcore 1 is waked up from rx interrupt on port1,rxq0
+	L3FWD_POWER: lcore 2 is waked up from rx interrupt on port1,rxq0
+	
+Check the packet has been normally forwarded.
+
+After the packet forwarded, thread on core1 and core 2 will return to sleep.
+	L3FWD_POWER: lcore 1 sleeps until interrupt on port0,rxq0 triggers
+	L3FWD_POWER: lcore 2 sleeps until interrupt on port0,rxq0 triggers
+
+Send packet flows to VF0 and VF1, check that thread on core1 and core2 will 
+keep up awake.
+
+Test Case3: VF interrupt pmd in Host with vfio
+==============================================
+Create one VF per Port in host and make sure PF interface up
+ues kernel driver to create vf:
+        echo 1 >/sys/bus/pci/devices/0000\:04\:00.1/sriov_numvf
+        echo 1 >/sys/bus/pci/devices/0000\:04\:00.1/sriov_numvf
+
+Bind VF device to host igb_uio:
+	./usertools/dpdk-devbind.py --bind=vfio-pci 0000:04:10.0 0000:04:10.1
+	
+Start VM and start l3fwd-power with two queues per port in VM:
+	l3fwd-power -c 1f -n 4 -- -p 0x3 -P \
+		--config="(0,0,1),(0,1,2)(1,0,3),(1,1,4)"
+
+Send packets with increased dest IP to Port0 and Port1, check that thread on 
+core1,core2,core3,core4 waked up:
+	L3FWD_POWER: lcore 1 is waked up from rx interrupt on port1,rxq0
+	L3FWD_POWER: lcore 2 is waked up from rx interrupt on port1,rxq1
+	L3FWD_POWER: lcore 3 is waked up from rx interrupt on port1,rxq0
+	L3FWD_POWER: lcore 4 is waked up from rx interrupt on port1,rxq1
+	
+Check the packet has been normally forwarded.
+
+After the packet forwarded, thread on core1,core2,core3,core4 will return to 
+sleep.
+	L3FWD_POWER: lcore 1 sleeps until interrupt on port0,rxq0 triggers
+	L3FWD_POWER: lcore 2 sleeps until interrupt on port0,rxq1 triggers
+	L3FWD_POWER: lcore 3 sleeps until interrupt on port1,rxq0 triggers
+	L3FWD_POWER: lcore 4 sleeps until interrupt on port1,rxq1 triggers
+
+Send packet flows to Port0 and Port1, check that thread on core1,core2,core3,
+core4 will keep up awake.
+
-- 
1.9.3

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [dts] [PATCH V1] add test suite vf interrupt_pmd
  2017-09-08  2:30 [dts] [PATCH V2] add test suite for vf interruot_pmd xu,gang
  2017-09-08  2:30 ` [dts] [PATCH V1] modify the interrupt pmd test plan xu,gang
  2017-09-08  2:30 ` [dts] [PATCH V1] add vf " xu,gang
@ 2017-09-08  2:30 ` xu,gang
  2 siblings, 0 replies; 6+ messages in thread
From: xu,gang @ 2017-09-08  2:30 UTC (permalink / raw)
  To: dts; +Cc: xu,gang

Signed-off-by: xu,gang <gangx.xu@intel.com>
---
 tests/TestSuite_vf_interrupt_pmd.py | 289 ++++++++++++++++++++++++++++++++++++
 1 file changed, 289 insertions(+)
 create mode 100644 tests/TestSuite_vf_interrupt_pmd.py

diff --git a/tests/TestSuite_vf_interrupt_pmd.py b/tests/TestSuite_vf_interrupt_pmd.py
new file mode 100644
index 0000000..613f05e
--- /dev/null
+++ b/tests/TestSuite_vf_interrupt_pmd.py
@@ -0,0 +1,289 @@
+# BSD LICENSE
+#
+# Copyright(c) 2010-2016 Intel Corporation. All rights reserved.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+#   * Redistributions of source code must retain the above copyright
+#     notice, this list of conditions and the following disclaimer.
+#   * Redistributions in binary form must reproduce the above copyright
+#     notice, this list of conditions and the following disclaimer in
+#     the documentation and/or other materials provided with the
+#     distribution.
+#   * Neither the name of Intel Corporation nor the names of its
+#     contributors may be used to endorse or promote products derived
+#     from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+"""
+DPDK Test suite.
+Test vf_interrupt_pmd.
+"""
+
+import utils
+import string
+import time
+import re
+from pmd_output import PmdOutput
+from qemu_kvm import QEMUKvm
+from test_case import TestCase
+
+
+class TestVfInterruptPmd(TestCase):
+
+    def set_up_all(self):
+        """
+        Run at the start of each test suite.
+        """
+        self.dut_ports = self.dut.get_ports(self.nic)
+        self.verify(len(self.dut_ports) >= 2, "Insufficient ports")
+        cores = self.dut.get_core_list("1S/4C/1T")
+        self.coremask = utils.create_mask(cores)
+        self.portmask = utils.create_mask(self.dut_ports)
+
+        self.path = "./examples/l3fwd-power/build/l3fwd-power"
+
+        testport_0 = self.tester.get_local_port(self.dut_ports[0])
+        self.rx_intf_0 = self.tester.get_interface(testport_0)
+        testport_1 = self.tester.get_local_port(self.dut_ports[1])
+        self.rx_intf_1 = self.tester.get_interface(testport_1)
+
+        self.mac_port_0 = self.dut.get_mac_address(self.dut_ports[0])
+        self.mac_port_1 = self.dut.get_mac_address(self.dut_ports[1])
+
+        self.dut.virt_exit()
+
+    def build_app(self, use_dut):
+        # build sample app
+        out = use_dut.build_dpdk_apps("./examples/l3fwd-power")
+        self.verify("Error" not in out, "compilation error 1")
+        self.verify("No such file" not in out, "compilation error 2")
+
+    def set_up(self):
+        """
+        Run before each test case.
+        """
+        pass
+
+    def generate_sriov_vfport(self, use_driver):
+        """
+        generate sriov vfs by port
+        """
+        self.dut.generate_sriov_vfs_by_port(
+            self.dut_ports[0], 1, driver=use_driver)
+        self.sriov_vfs_port_0 = self.dut.ports_info[
+            self.dut_ports[0]]['vfs_port']
+        self.dut.generate_sriov_vfs_by_port(
+            self.dut_ports[1], 1, driver=use_driver)
+        self.sriov_vfs_port_1 = self.dut.ports_info[
+            self.dut_ports[1]]['vfs_port']
+
+    def bind_vfs(self, driver):
+        """
+        bind vfs to driver
+        """
+        for port in self.sriov_vfs_port_0:
+            port.bind_driver(driver)
+        time.sleep(1)
+        for port in self.sriov_vfs_port_1:
+            port.bind_driver(driver)
+        time.sleep(1)
+
+    def setup_vm_env(self):
+        """
+        Start One VM with one virtio device
+        """
+        self.dut_testpmd = PmdOutput(self.dut)
+        self.dut_testpmd.start_testpmd(
+            "Default", "--rxq=4 --txq=4 --port-topology=chained")
+        self.dut_testpmd.execute_cmd("start")
+
+        vf0_prop_1 = {'opt_host': self.sriov_vfs_port_0[0].pci}
+        vf0_prop_2 = {'opt_host': self.sriov_vfs_port_1[0].pci}
+        self.vm0 = QEMUKvm(self.dut, 'vm0', 'vf_interrupt_pmd')
+        self.vm0.set_vm_device(driver='pci-assign', **vf0_prop_1)
+        self.vm0.set_vm_device(driver='pci-assign', **vf0_prop_2)
+        try:
+            self.vm0_dut = self.vm0.start()
+            if self.vm0_dut is None:
+                raise Exception("Set up VM ENV failed")
+            else:
+                self.verify(self.vm0_dut.ports_info[
+                            0]['intf'] != 'N/A', "Not interface")
+        except Exception as e:
+            self.destroy_vm_env()
+            self.logger.error("Failure for %s" % str(e))
+
+        self.vm0_vf0_mac = self.vm0_dut.get_mac_address(0)
+        self.vm0_vf1_mac = self.vm0_dut.get_mac_address(1)
+        self.vm0_dut.send_expect("systemctl stop NetworkManager", "# ", 60)
+
+    def destroy_vm_env(self):
+        """
+        destroy vm environment
+        """
+        if getattr(self, 'vm0', None):
+            self.vm0_dut.kill_all()
+            self.vm0_dut_ports = None
+            # destroy vm0
+            self.vm0.stop()
+            self.vm0 = None
+        if getattr(self, 'used_dut_port', None):
+            self.dut.destroy_sriov_vfs_by_port(self.used_dut_port)
+            port = self.dut.ports_info[self.used_dut_port]['port']
+            self.used_dut_port = None
+
+        self.env_done = False
+
+    def change_port_conf(self, use_dut, lsc_enable=True, rxq_enable=True):
+        """
+        change interrupt enable
+        """
+        sed_cmd_fmt = "/intr_conf.*=.*{/,/\}\,$/c\    .intr_conf = {\\n\\t\\t.lsc = %d,\\n\\t\\t.rxq = %d,\\n\\t},"
+        lsc = 1
+        rxq = 1
+        if lsc_enable:
+            lsc = 0
+        if rxq_enable:
+            rxq = 1
+        sed_cmd_str = sed_cmd_fmt % (lsc, rxq)
+        out = use_dut.send_expect(
+            "sed -i '%s' examples/l3fwd-power/main.c" % sed_cmd_str, "# ", 60)
+
+    def scapy_send_packet(self, mac, testinterface, queuenum=1):
+        """
+        Send a packet to port
+        """
+        if queuenum == 1:
+            self.tester.scapy_append(
+                'sendp([Ether(dst="%s")/IP()/UDP()/Raw(\'X\'*18)], iface="%s")' % (mac, testinterface))
+        elif queuenum == 2:
+            for dst in range(16):
+                self.tester.scapy_append(
+                    'sendp([Ether(dst="%s")/IP(dst="127.0.0.%d")/UDP()/Raw(\'X\'*18)], iface="%s")' % (mac, dst, testinterface))
+        else:
+            for dst in range(256):
+                self.tester.scapy_append(
+                    'sendp([Ether(dst="%s")/IP(dst="127.0.0.%d")/UDP()/Raw(\'X\'*18)], iface="%s")' % (mac, dst, testinterface))
+        self.tester.scapy_execute()
+
+    def test_vf_VM_uio(self):
+        """
+        verify VF interrupt pmd in VM with uio
+        """
+        self.verify(self.drivername in ['igb_uio'], "NOT Support")
+        self.generate_sriov_vfport('igb_uio')
+        self.bind_vfs('pci-stub')
+        self.setup_vm_env()
+        self.change_port_conf(self.vm0_dut, lsc_enable=True, rxq_enable=False)
+        self.build_app(self.vm0_dut)
+
+        cmd = self.path + \
+            " -c f -n %d -- -p 0x3 -P --config='(0,0,1),(1,0,2)'" % (
+                self.vm0_dut.get_memory_channels())
+        self.vm0_dut.send_expect(cmd, "L3FWD_POWER", 60)
+        self.scapy_send_packet(self.vm0_vf0_mac, self.rx_intf_0)
+        self.scapy_send_packet(self.vm0_vf1_mac, self.rx_intf_1)
+        out = self.vm0_dut.get_session_output(timeout=30)
+        self.destroy_vm_env()
+        self.dut.send_expect("quit", "# ", 60)
+        self.verify(
+            "lcore 1 is waked up from rx interrupt on port 0" in out, "lcore 1 not waked up")
+        self.verify(
+            "lcore 1 sleeps until interrupt triggers" in out, "lcore 1 not sleeps")
+        self.verify(
+            "lcore 2 is waked up from rx interrupt on port 1" in out, "lcore 2 not waked up")
+        self.verify(
+            "lcore 2 sleeps until interrupt triggers" in out, "lcore 2 not sleeps")
+
+    def test_vf_host_uio(self):
+        """
+        verify VF interrupt pmd in Host with uio
+        """
+        self.verify(self.drivername in ['igb_uio'], "NOT Support")
+        self.dut.restore_interfaces()
+        self.generate_sriov_vfport('ixgbe')
+        self.bind_vfs('igb_uio')
+        self.change_port_conf(self.dut, lsc_enable=True, rxq_enable=False)
+        self.build_app(self.dut)
+
+        cmd = self.path + " -c %s -n %d -- -p %s -P --config='(0,0,1),(1,0,2)'" % (
+            self.coremask, self.dut.get_memory_channels(), self.portmask)
+        self.dut.send_expect(cmd, "L3FWD_POWER", 60)
+        self.scapy_send_packet(self.mac_port_0, self.rx_intf_0)
+        self.scapy_send_packet(self.mac_port_1, self.rx_intf_1)
+        out = self.dut.get_session_output(timeout=60)
+        self.dut.send_expect("^C", "# ", 60)
+        self.verify(
+            "lcore 1 is waked up from rx interrupt on port 0" in out, "lcore 1 not waked up")
+        self.verify(
+            "lcore 1 sleeps until interrupt triggers" in out, "lcore 1 not sleeps")
+        self.verify(
+            "lcore 2 is waked up from rx interrupt on port 1" in out, "lcore 2 not waked up")
+        self.verify(
+            "lcore 2 sleeps until interrupt triggers" in out, "lcore 2 not sleeps")
+
+    def test_vf_host_vfio(self):
+        """
+        verify VF interrupt pmd in Host with vfio
+        """
+        self.verify(self.drivername in ['vfio-pci'], "NOT Support")
+        self.dut.restore_interfaces()
+        self.generate_sriov_vfport('ixgbe')
+        self.bind_vfs('vfio-pci')
+        self.change_port_conf(self.dut, lsc_enable=True, rxq_enable=False)
+        self.build_app(self.dut)
+
+        cmd = self.path + " -c %s -n %d -- -p %s -P --config='(0,0,1),(0,1,2)(1,0,3),(1,1,4)'" % (
+            self.coremask, self.dut.get_memory_channels(), self.portmask)
+        self.dut.send_expect(cmd, "L3FWD_POWER", 60)
+        self.scapy_send_packet(self.mac_port_0, self.rx_intf_0, 2)
+        self.scapy_send_packet(self.mac_port_1, self.rx_intf_1, 2)
+        out = self.dut.get_session_output(timeout=60)
+        self.dut.send_expect("^C", "# ", 60)
+        print out
+        self.verify(
+            "lcore 1 is waked up from rx interrupt on port 0" in out, "lcore 1 not waked up")
+        self.verify(
+            "lcore 1 sleeps until interrupt triggers" in out, "lcore 1 not sleeps")
+        self.verify(
+            "lcore 2 is waked up from rx interrupt on port 0" in out, "lcore 2 not waked up")
+        self.verify(
+            "lcore 2 sleeps until interrupt triggers" in out, "lcore 2 not sleeps")
+        self.verify(
+            "lcore 3 is waked up from rx interrupt on port 1" in out, "lcore 2 not waked up")
+        self.verify(
+            "lcore 3 sleeps until interrupt triggers" in out, "lcore 2 not sleeps")
+        self.verify(
+            "lcore 4 is waked up from rx interrupt on port 1" in out, "lcore 2 not waked up")
+        self.verify(
+            "lcore 4 sleeps until interrupt triggers" in out, "lcore 2 not sleeps")
+
+    def tear_down(self):
+        """
+        Run after each test case.
+        """
+        self.dut.virt_exit()
+        self.dut.kill_all()
+        time.sleep(2)
+
+    def tear_down_all(self):
+        """
+        Run after each test suite.
+        """
+        pass
-- 
1.9.3

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [dts] [PATCH V1] modify the interrupt pmd test plan
  2017-09-08  2:30 ` [dts] [PATCH V1] modify the interrupt pmd test plan xu,gang
@ 2017-10-09 11:51   ` Liu, Yong
  0 siblings, 0 replies; 6+ messages in thread
From: Liu, Yong @ 2017-10-09 11:51 UTC (permalink / raw)
  To: xu,gang, dts

Gang,
Look like this patch has been included in previous patch. Will ignore 
this patch.

Thanks,
Marvin

On 09/08/2017 10:30 AM, xu,gang wrote:
> merge PF interrupt pmd test with uio vfio mode and check state with different queue in it
> remove VF interrupt pmd test case to VF interrupt pmd test suite
>
> Signed-off-by: xu,gang<gangx.xu@intel.com>

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [dts] [PATCH V2] add test suite for vf interruot_pmd
@ 2017-06-09  7:37 xu,gang
  0 siblings, 0 replies; 6+ messages in thread
From: xu,gang @ 2017-06-09  7:37 UTC (permalink / raw)
  To: dts; +Cc: xu,gang

Signed-off-by: xu,gang <gangx.xu@intel.com>
---
 tests/TestSuite_vf_interrupt_pmd.py | 295 ++++++++++++++++++++++++++++++++++++
 1 file changed, 295 insertions(+)
 create mode 100644 tests/TestSuite_vf_interrupt_pmd.py

diff --git a/tests/TestSuite_vf_interrupt_pmd.py b/tests/TestSuite_vf_interrupt_pmd.py
new file mode 100644
index 0000000..b78bf8f
--- /dev/null
+++ b/tests/TestSuite_vf_interrupt_pmd.py
@@ -0,0 +1,295 @@
+# BSD LICENSE
+#
+# Copyright(c) 2010-2017 Intel Corporation. All rights reserved.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+#   * Redistributions of source code must retain the above copyright
+#     notice, this list of conditions and the following disclaimer.
+#   * Redistributions in binary form must reproduce the above copyright
+#     notice, this list of conditions and the following disclaimer in
+#     the documentation and/or other materials provided with the
+#     distribution.
+#   * Neither the name of Intel Corporation nor the names of its
+#     contributors may be used to endorse or promote products derived
+#     from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+"""
+DPDK Test suite.
+Test vf_interrupt_pmd.
+"""
+
+import utils
+import string
+import time
+import re
+from pmd_output import PmdOutput
+from qemu_kvm import QEMUKvm
+from test_case import TestCase
+
+
+class TestVfInterruptPmd(TestCase):
+
+    def set_up_all(self):
+        """
+        Run at the start of each test suite.
+        """
+        self.dut_ports = self.dut.get_ports(self.nic)
+        self.verify(len(self.dut_ports) >= 2, "Insufficient ports")
+        cores = self.dut.get_core_list("1S/4C/1T")
+        self.coremask = utils.create_mask(cores)
+        self.portmask = utils.create_mask(self.dut_ports)
+
+        self.path = "./examples/l3fwd-power/build/l3fwd-power"
+
+        testport_0 = self.tester.get_local_port(self.dut_ports[0])
+        self.rx_intf_0 = self.tester.get_interface(testport_0)
+        testport_1 = self.tester.get_local_port(self.dut_ports[1])
+        self.rx_intf_1 = self.tester.get_interface(testport_1)
+
+        self.mac_port_0 = self.dut.get_mac_address(self.dut_ports[0])
+        self.mac_port_1 = self.dut.get_mac_address(self.dut_ports[1])
+
+        self.dut.virt_exit()
+
+    def build_app(self, use_dut):
+        # build sample app
+        out = use_dut.build_dpdk_apps("./examples/l3fwd-power")
+        self.verify("Error" not in out, "compilation error 1")
+        self.verify("No such file" not in out, "compilation error 2")
+
+    def set_up(self):
+        """
+        Run before each test case.
+        """
+        pass
+
+    def generate_sriov_vfport(self, use_driver):
+        """
+        generate sriov vfs by port
+        """
+        self.used_dut_port_0 = self.dut_ports[0]
+        self.used_dut_port_1 = self.dut_ports[1]
+        self.dut.generate_sriov_vfs_by_port(
+            self.used_dut_port_0, 1, driver=use_driver)
+        self.sriov_vfs_port_0 = self.dut.ports_info[
+            self.used_dut_port_0]['vfs_port']
+        self.dut.generate_sriov_vfs_by_port(
+            self.used_dut_port_1, 1, driver=use_driver)
+        self.sriov_vfs_port_1 = self.dut.ports_info[
+            self.used_dut_port_1]['vfs_port']
+
+    def bind_vfs(self, driver):
+        """
+        bind vfs to driver
+        """
+        for port in self.sriov_vfs_port_0:
+            port.bind_driver(driver)
+        time.sleep(1)
+        for port in self.sriov_vfs_port_1:
+            port.bind_driver(driver)
+        time.sleep(1)
+
+    def setup_vm_env(self):
+        """
+        Start One VM with one virtio device
+        """
+        self.dut_testpmd = PmdOutput(self.dut)
+        self.dut_testpmd.start_testpmd(
+            "Default", "--rxq=4 --txq=4 --port-topology=chained")
+        self.dut_testpmd.execute_cmd("start")
+
+        vf0_prop_1 = {'opt_host': self.sriov_vfs_port_0[0].pci}
+        vf0_prop_2 = {'opt_host': self.sriov_vfs_port_1[0].pci}
+        self.vm0 = QEMUKvm(self.dut, 'vm0', 'vf_interrupt_pmd')
+        self.vm0.set_vm_device(driver='pci-assign', **vf0_prop_1)
+        self.vm0.set_vm_device(driver='pci-assign', **vf0_prop_2)
+        try:
+            self.vm0_dut = self.vm0.start()
+            if self.vm0_dut is None:
+                raise Exception("Set up VM ENV failed")
+            else:
+                self.verify(self.vm0_dut.ports_info[
+                            0]['intf'] != 'N/A', "Not interface")
+        except Exception as e:
+            self.destroy_vm_env()
+            self.logger.error("Failure for %s" % str(e))
+
+        self.vm0_vf0_mac = self.vm0_dut.get_mac_address(0)
+        self.vm0_vf1_mac = self.vm0_dut.get_mac_address(1)
+        self.vm0_dut.send_expect("systemctl stop NetworkManager", "# ", 60)
+
+    def destroy_vm_env(self):
+        """
+        destroy vm environment
+        """
+        if getattr(self, 'vm0', None):
+            self.vm0_dut.kill_all()
+            self.vm0_dut_ports = None
+            # destroy vm0
+            self.vm0.stop()
+            self.vm0 = None
+
+        if getattr(self, 'used_dut_port_0', None) != None:
+            self.dut.destroy_sriov_vfs_by_port(self.used_dut_port_0)
+            self.used_dut_port_0 = None
+
+        if getattr(self, 'used_dut_port_1', None) != None:
+            self.dut.destroy_sriov_vfs_by_port(self.used_dut_port_1)
+            self.used_dut_port_1 = None
+
+        self.env_done = False
+
+    def change_port_conf(self, use_dut, lsc_enable=True, rxq_enable=True):
+        """
+        change interrupt enable
+        """
+        sed_cmd_fmt = "/intr_conf.*=.*{/,/\}\,$/c\    .intr_conf = {\\n\\t\\t.lsc = %d,\\n\\t\\t.rxq = %d,\\n\\t},"
+        lsc = 1
+        rxq = 1
+        if lsc_enable:
+            lsc = 0
+        if rxq_enable:
+            rxq = 1
+        sed_cmd_str = sed_cmd_fmt % (lsc, rxq)
+        out = use_dut.send_expect(
+            "sed -i '%s' examples/l3fwd-power/main.c" % sed_cmd_str, "# ", 60)
+
+    def scapy_send_packet(self, mac, testinterface, queuenum=1):
+        """
+        Send a packet to port
+        """
+        if queuenum == 1:
+            self.tester.scapy_append(
+                'sendp([Ether(dst="%s")/IP()/UDP()/Raw(\'X\'*18)], iface="%s")' % (mac, testinterface))
+        elif queuenum == 2:
+            for dst in range(16):
+                self.tester.scapy_append(
+                    'sendp([Ether(dst="%s")/IP(dst="127.0.0.%d")/UDP()/Raw(\'X\'*18)], iface="%s")' % (mac, dst, testinterface))
+        else:
+            for dst in range(256):
+                self.tester.scapy_append(
+                    'sendp([Ether(dst="%s")/IP(dst="127.0.0.%d")/UDP()/Raw(\'X\'*18)], iface="%s")' % (mac, dst, testinterface))
+        self.tester.scapy_execute()
+
+    def test_vf_VM_uio(self):
+        """
+        verify VF interrupt pmd in VM with uio
+        """
+        self.verify(self.drivername in ['igb_uio'], "NOT Support")
+        self.generate_sriov_vfport('igb_uio')
+        self.bind_vfs('pci-stub')
+        self.setup_vm_env()
+        self.change_port_conf(self.vm0_dut, lsc_enable=True, rxq_enable=False)
+        self.build_app(self.vm0_dut)
+
+        cmd = self.path + \
+            " -c f -n %d -- -p 0x3 -P --config='(0,0,1),(1,0,2)'" % (
+                self.vm0_dut.get_memory_channels())
+        self.vm0_dut.send_expect(cmd, "L3FWD_POWER", 60)
+        self.scapy_send_packet(self.vm0_vf0_mac, self.rx_intf_0)
+        self.scapy_send_packet(self.vm0_vf1_mac, self.rx_intf_1)
+        out = self.vm0_dut.get_session_output(timeout=30)
+        self.destroy_vm_env()
+        self.dut.send_expect("quit", "# ", 60)
+        self.verify(
+            "lcore 1 is waked up from rx interrupt on port 0" in out, "lcore 1 not waked up")
+        self.verify(
+            "lcore 1 sleeps until interrupt triggers" in out, "lcore 1 not sleeps")
+        self.verify(
+            "lcore 2 is waked up from rx interrupt on port 1" in out, "lcore 2 not waked up")
+        self.verify(
+            "lcore 2 sleeps until interrupt triggers" in out, "lcore 2 not sleeps")
+
+    def test_vf_host_uio(self):
+        """
+        verify VF interrupt pmd in Host with uio
+        """
+        self.verify(self.drivername in ['igb_uio'], "NOT Support")
+        self.dut.restore_interfaces()
+        self.generate_sriov_vfport('ixgbe')
+        self.bind_vfs('igb_uio')
+        self.change_port_conf(self.dut, lsc_enable=True, rxq_enable=False)
+        self.build_app(self.dut)
+
+        cmd = self.path + " -c %s -n %d -- -p %s -P --config='(0,0,1),(1,0,2)'" % (
+            self.coremask, self.dut.get_memory_channels(), self.portmask)
+        self.dut.send_expect(cmd, "L3FWD_POWER", 60)
+        self.scapy_send_packet(self.mac_port_0, self.rx_intf_0)
+        self.scapy_send_packet(self.mac_port_1, self.rx_intf_1)
+        out = self.dut.get_session_output(timeout=60)
+        self.dut.send_expect("^C", "# ", 60)
+        self.verify(
+            "lcore 1 is waked up from rx interrupt on port 0" in out, "lcore 1 not waked up")
+        self.verify(
+            "lcore 1 sleeps until interrupt triggers" in out, "lcore 1 not sleeps")
+        self.verify(
+            "lcore 2 is waked up from rx interrupt on port 1" in out, "lcore 2 not waked up")
+        self.verify(
+            "lcore 2 sleeps until interrupt triggers" in out, "lcore 2 not sleeps")
+
+    def test_vf_host_vfio(self):
+        """
+        verify VF interrupt pmd in Host with vfio
+        """
+        self.verify(self.drivername in ['vfio-pci'], "NOT Support")
+        self.dut.restore_interfaces()
+        self.generate_sriov_vfport('ixgbe')
+        self.bind_vfs('vfio-pci')
+        self.change_port_conf(self.dut, lsc_enable=True, rxq_enable=False)
+        self.build_app(self.dut)
+
+        cmd = self.path + " -c %s -n %d -- -p %s -P --config='(0,0,1),(0,1,2)(1,0,3),(1,1,4)'" % (
+            self.coremask, self.dut.get_memory_channels(), self.portmask)
+        self.dut.send_expect(cmd, "L3FWD_POWER", 60)
+        self.scapy_send_packet(self.mac_port_0, self.rx_intf_0, 2)
+        self.scapy_send_packet(self.mac_port_1, self.rx_intf_1, 2)
+        out = self.dut.get_session_output(timeout=60)
+        self.dut.send_expect("^C", "# ", 60)
+        print out
+        self.verify(
+            "lcore 1 is waked up from rx interrupt on port 0" in out, "lcore 1 not waked up")
+        self.verify(
+            "lcore 1 sleeps until interrupt triggers" in out, "lcore 1 not sleeps")
+        self.verify(
+            "lcore 2 is waked up from rx interrupt on port 0" in out, "lcore 2 not waked up")
+        self.verify(
+            "lcore 2 sleeps until interrupt triggers" in out, "lcore 2 not sleeps")
+        self.verify(
+            "lcore 3 is waked up from rx interrupt on port 1" in out, "lcore 2 not waked up")
+        self.verify(
+            "lcore 3 sleeps until interrupt triggers" in out, "lcore 2 not sleeps")
+        self.verify(
+            "lcore 4 is waked up from rx interrupt on port 1" in out, "lcore 2 not waked up")
+        self.verify(
+            "lcore 4 sleeps until interrupt triggers" in out, "lcore 2 not sleeps")
+
+    def tear_down(self):
+        """
+        Run after each test case.
+        """
+        self.dut.virt_exit()
+        self.dut.kill_all()
+        time.sleep(2)
+
+    def tear_down_all(self):
+        """
+        Run after each test suite.
+        """
+        pass
-- 
1.9.3

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2017-10-09  3:09 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-09-08  2:30 [dts] [PATCH V2] add test suite for vf interruot_pmd xu,gang
2017-09-08  2:30 ` [dts] [PATCH V1] modify the interrupt pmd test plan xu,gang
2017-10-09 11:51   ` Liu, Yong
2017-09-08  2:30 ` [dts] [PATCH V1] add vf " xu,gang
2017-09-08  2:30 ` [dts] [PATCH V1] add test suite vf interrupt_pmd xu,gang
  -- strict thread matches above, loose matches on Subject: below --
2017-06-09  7:37 [dts] [PATCH V2] add test suite for vf interruot_pmd xu,gang

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).