From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) by dpdk.org (Postfix) with ESMTP id 7E83BF91F for ; Thu, 12 Jan 2017 07:12:23 +0100 (CET) Received: from orsmga002.jf.intel.com ([10.7.209.21]) by orsmga101.jf.intel.com with ESMTP; 11 Jan 2017 22:12:22 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.33,348,1477983600"; d="scan'208";a="29357807" Received: from unknown (HELO dpdk-fedora20.icx.intel.com) ([10.240.176.135]) by orsmga002.jf.intel.com with ESMTP; 11 Jan 2017 22:12:21 -0800 From: "xu,gang" To: dts@dpdk.org Cc: "xu,gang" Date: Thu, 12 Jan 2017 14:13:24 +0800 Message-Id: <1484201605-41417-1-git-send-email-gangx.xu@intel.com> X-Mailer: git-send-email 1.9.3 Subject: [dts] [PATCH V1 1/2] add test suite interrupt_pmd X-BeenThere: dts@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: test suite reviews and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 12 Jan 2017 06:12:24 -0000 Signed-off-by: xu,gang --- tests/TestSuite_interrupt_pmd.py | 231 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 231 insertions(+) create mode 100644 tests/TestSuite_interrupt_pmd.py diff --git a/tests/TestSuite_interrupt_pmd.py b/tests/TestSuite_interrupt_pmd.py new file mode 100644 index 0000000..2c80cd3 --- /dev/null +++ b/tests/TestSuite_interrupt_pmd.py @@ -0,0 +1,231 @@ +# 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. + +Rx interrupt pmd test suite. +""" + +import string +import re +import time +import utils +from plotting import Plotting +from test_case import TestCase +from exception import VerifyFailure +from settings import HEADER_SIZE +from etgen import IxiaPacketGenerator +from utils import create_mask + + +class TestIntrPmd(TestCase): + + def set_up_all(self): + """ + Run before each test suite. + """ + self.dut_ports = self.dut.get_ports(self.nic) + self.verify(len(self.dut_ports) >= 2, "Insufficient ports") + + # save original nic driver + netdev = self.dut.ports_info[self.dut_ports[0]]['port'] + self.ori_driver = netdev.get_nic_driver() + + self.path = "./examples/l3fwd-power/build/l3fwd-power" + # build sample app + out = self.dut.send_expect("make -C examples/l3fwd-power", "# ") + self.verify("Error" not in out, "compilation error 1") + self.verify("No such file" not in out, "compilation error 2") + # wake up and sleep match pattern + self.wakeup = "lcore %s is waked up" + self.sleep = "lcore %s sleeps" + # max queue number + if self.nic == "niantic": + self.max_queue = 16 + else: + self.max_queue = 2 + + def set_up(self): + """ + Run before each test case. + """ + pass + + def bind_nic_driver(self, ports, driver): + # modprobe vfio driver + if driver == "vfio-pci": + self.dut.send_expect("modprobe vfio", "#", 70) + self.dut.send_expect("modprobe vfio-pci", "#", 70) + + for port in ports: + netdev = self.dut.ports_info[port]['port'] + driver = netdev.get_nic_driver() + if driver != 'vfio-pci': + netdev.bind_driver(driver='vfio-pci') + + elif driver == "igb_uio": + # igb_uio should insmod as default, no need to check + for port in ports: + netdev = self.dut.ports_info[port]['port'] + driver = netdev.get_nic_driver() + if driver != 'igb_uio': + netdev.bind_driver(driver='igb_uio') + + def test_pf_on_vfio(self): + """ + Verify interrupt pmd work fine when nic bound to vfio + """ + # bind to vfio-pci + self.bind_nic_driver(self.dut_ports[:2], "vfio-pci") + + cores = self.dut.get_core_list("1S/2C/1T") + coremask = create_mask(cores) + portmask = create_mask(self.dut_ports[:2]) + cmd = self.path + " -c %s -n %d -- -p %s -P " \ + "--config=\"(0,0,%s),(1,0,%s)\"" \ + % (coremask, self.dut.get_memory_channels(), + portmask, cores[0], cores[1]) + + # start l3fwd-power + self.dut.send_expect(cmd, "L3FWD_POWER: lcore %s sleeps until interrupt triggers" % cores[1], 60) + + # send packet from tester port0 + self.verify_core_status([cores[0]], self.dut_ports[0]) + + # send packet from tester port1 + self.verify_core_status([cores[1]], self.dut_ports[1]) + + def test_pf_multiqueue_on_vfio(self): + """ + Verify interrupt pmd work fine with multi queues when nic bound to vfio + """ + # bind to vfio-pci + + self.bind_nic_driver(self.dut_ports[:2], "vfio-pci") + + cores = self.dut.get_core_list("1S/4C/1T") + coremask = create_mask(cores) + portmask = create_mask(self.dut_ports[:2]) + cmd = self.path + " -c %s -n %d -- -p %s -P " \ + "--config=\"(0,0,%s),(0,1,%s),(1,0,%s),(1,1,%s)\"" \ + % (coremask, self.dut.get_memory_channels(), + portmask, cores[0], cores[1], cores[2], cores[3]) + + # start l3fwd-power + self.dut.send_expect(cmd, "L3FWD_POWER: lcore %s sleeps until interrupt triggers" % cores[3], 60) + # send packet from tester port0 + self.verify_core_status([cores[0], cores[1]], self.dut_ports[0], queuenum=2) + + # send packet from tester port1 + self.verify_core_status([cores[2], cores[3]], self.dut_ports[1], queuenum=2) + + def test_pf_maxqueue_on_vfio(self): + """ + Verify interrupt pmd work fine with maximum queues when nic bound to vfio + """ + # bind to vfio-pci + self.bind_nic_driver(self.dut_ports[:2], "vfio-pci") + + coreset = "2S/%dC/2T" % (self.max_queue / 2) + cores = self.dut.get_core_list(coreset) + self.verify(len(cores) == (self.max_queue * 2), "Failed to allocate cores for max queue") + + coremask = create_mask(cores) + portmask = create_mask(self.dut_ports[:2]) + + config_cmd = "--config=\"" + for idx in range(self.max_queue): + config_cmd += "(0,%d,%s)," % (idx, cores[idx]) + for idx in range(self.max_queue): + config_cmd += "(1,%d,%s)," % (idx, cores[idx + self.max_queue]) + config_cmd += "\"" + + cmd = self.path + " -c %s -n %d -- -p %s -P " % (coremask, self.dut.get_memory_channels(), + portmask) + cmd += config_cmd + # start l3fwd-power + self.dut.send_expect(cmd, "L3FWD_POWER: lcore %s sleeps until interrupt triggers" % cores[-1], 60) + + # send packet from tester port0 + self.verify_core_status(cores[0:self.max_queue], self.dut_ports[0], queuenum=self.max_queue) + + # send packet from tester port0 + self.verify_core_status(cores[self.max_queue:], self.dut_ports[1], queuenum=self.max_queue) + + def verify_core_status(self, cores, port, queuenum=1): + # send packet from tester port0 + txport = self.tester.get_local_port(port) + mac = self.dut.get_mac_address(port) + # mac="00:1e:67:ec:83:37" + txItf = self.tester.get_interface(txport) + if queuenum == 1: + self.tester.scapy_append('sendp([Ether(dst="%s")/IP()/UDP()/Raw(\'X\'*18)], iface="%s")' % (mac, txItf)) + elif queuenum == 2: + for i in range(16): + self.tester.scapy_append('sendp([Ether(dst="%s")/IP(dst="127.0.0.%d")/UDP()/Raw(\'X\'*18)], iface="%s")' % (mac, i, txItf)) + else: + for i in range(64): + self.tester.scapy_append('sendp([Ether(dst="%s")/IP(dst="127.0.0.%d")/UDP()/Raw(\'X\'*18)], iface="%s")' % (mac, i, txItf)) + self.tester.scapy_execute() + + out = self.dut.get_session_output(timeout=2) + # make sure core normally waked up + for core in cores: + wakeup_msg = self.wakeup % core + self.verify(wakeup_msg in out, "Expected core %s not waked up" % core) + print utils.GREEN("Core %s waked up as expected" % core) + # make sure core normally sleep + sleep_msg = self.sleep % core + self.verify(sleep_msg in out, "Expected core %s not sleep" % core) + print utils.GREEN("Core %s return to sleep as expected" % core) + + def test_pf_on_uio(self): + """ + Verify interrupt pmd work fine when nic bound to igb_uio + """ + pass + + def tear_down(self): + """ + Run after each test suite. + """ + self.dut.kill_all() + time.sleep(2) + pass + + def tear_down_all(self): + self.bind_nic_driver(self.dut_ports[:2], self.ori_driver) + """ + Run after each test suite. + """ + pass -- 1.9.3