* [dts] [PATCH V1 1/2] add test suite interrupt_pmd @ 2017-01-12 6:13 xu,gang 2017-01-12 6:13 ` [dts] [PATCH V1 2/2] add test plan interrupt_pmd xu,gang 0 siblings, 1 reply; 3+ messages in thread From: xu,gang @ 2017-01-12 6:13 UTC (permalink / raw) To: dts; +Cc: xu,gang Signed-off-by: xu,gang <gangx.xu@intel.com> --- 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 ^ permalink raw reply [flat|nested] 3+ messages in thread
* [dts] [PATCH V1 2/2] add test plan interrupt_pmd 2017-01-12 6:13 [dts] [PATCH V1 1/2] add test suite interrupt_pmd xu,gang @ 2017-01-12 6:13 ` xu,gang 2017-01-13 1:08 ` Liu, Yong 0 siblings, 1 reply; 3+ messages in thread From: xu,gang @ 2017-01-12 6:13 UTC (permalink / raw) To: dts; +Cc: xu,gang Signed-off-by: xu,gang <gangx.xu@intel.com> --- test_plans/interrupt_pmd_test_plan.rst | 259 +++++++++++++++++++++++++++++++++ 1 file changed, 259 insertions(+) create mode 100644 test_plans/interrupt_pmd_test_plan.rst diff --git a/test_plans/interrupt_pmd_test_plan.rst b/test_plans/interrupt_pmd_test_plan.rst new file mode 100644 index 0000000..42c319c --- /dev/null +++ b/test_plans/interrupt_pmd_test_plan.rst @@ -0,0 +1,259 @@ +.. Copyright (c) <2016>, 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. + +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: PF interrupt pmd with uio +===================================== +Run l3fwd-power with one queue per port:: + l3fwd-power -c 7 -n 4 -- -p 0x3 -P --config="(0,0,1),(1,0,2)" + +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 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)" + +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 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)" + +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. + +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 Case4: 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)" + +Plug out Port0 cable, check that link down interrtup captured and handled by +pmd driver. + +Plug out Port1 cable, check that link down interrtup captured and handled by +pmd driver. + +Plug in Port0 cable, check that link up interrtup captured and handled by pmd +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: + ./tools/dpdk_nic_bind.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: + ./tools/dpdk_nic_bind.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 +========================================= +Setup validation scenario the case as test1 +Send burst packet flow to Port0 and Port1, use IXIA capture the maxmium +latecny. + +Compare latency(l3fwd-power PF interrupt pmd with uio) with l3fwd latency. + +Setup validation scenario the case as test2 +Send burst packet flow to Port0 and Port1, use IXIA capture the maxmium +latecny. + +Compare latency(l3fwd-power PF interrupt pmd with vfio) with l3fwd latency. \ No newline at end of file -- 1.9.3 ^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [dts] [PATCH V1 2/2] add test plan interrupt_pmd 2017-01-12 6:13 ` [dts] [PATCH V1 2/2] add test plan interrupt_pmd xu,gang @ 2017-01-13 1:08 ` Liu, Yong 0 siblings, 0 replies; 3+ messages in thread From: Liu, Yong @ 2017-01-13 1:08 UTC (permalink / raw) To: Xu, GangX, dts; +Cc: Xu, GangX Gang, Some comments below. > -----Original Message----- > From: dts [mailto:dts-bounces@dpdk.org] On Behalf Of xu,gang > Sent: Thursday, January 12, 2017 2:13 PM > To: dts@dpdk.org > Cc: Xu, GangX <gangx.xu@intel.com> > Subject: [dts] [PATCH V1 2/2] add test plan interrupt_pmd > > Signed-off-by: xu,gang <gangx.xu@intel.com> > --- > test_plans/interrupt_pmd_test_plan.rst | 259 > +++++++++++++++++++++++++++++++++ > 1 file changed, 259 insertions(+) > create mode 100644 test_plans/interrupt_pmd_test_plan.rst > > diff --git a/test_plans/interrupt_pmd_test_plan.rst > b/test_plans/interrupt_pmd_test_plan.rst > new file mode 100644 > index 0000000..42c319c > --- /dev/null > +++ b/test_plans/interrupt_pmd_test_plan.rst > @@ -0,0 +1,259 @@ > +.. Copyright (c) <2016>, Intel Corporation Please update copyright to 2017. > + 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. Please add more description as below: Assume PF port PCI addresses are 0000:08:00.0 and 0000:08:00.1, their Interfaces name are p786p1 and p786p2. Assume generated VF PCI address will be 0000:08:10.0, 0000:08: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: PF interrupt pmd with uio > +===================================== > +Run l3fwd-power with one queue per port:: > + l3fwd-power -c 7 -n 4 -- -p 0x3 -P --config="(0,0,1),(1,0,2)" > + > +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 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)" > + > +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 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)" > + > +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. > + > +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 Case4: 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)" > + > +Plug out Port0 cable, check that link down interrtup captured and > +handled by pmd driver. > + > +Plug out Port1 cable, check that link down interrtup captured and > +handled by pmd driver. > + > +Plug in Port0 cable, check that link up interrtup captured and handled > +by pmd 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: > + ./tools/dpdk_nic_bind.py --bind=igb_uio 0000:08:10.0 0000:08:10.1 > + Tools folder has been changed, currently folder name is usertools. > +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: > + ./tools/dpdk_nic_bind.py --bind=igb_uio 0000:08:10.0 0000:08:10.1 Same as previous. > + > +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 > +========================================= > +Setup validation scenario the case as test1 Send burst packet flow to > +Port0 and Port1, use IXIA capture the maxmium latecny. > + > +Compare latency(l3fwd-power PF interrupt pmd with uio) with l3fwd latency. > + > +Setup validation scenario the case as test2 Send burst packet flow to > +Port0 and Port1, use IXIA capture the maxmium latecny. > + > +Compare latency(l3fwd-power PF interrupt pmd with vfio) with l3fwd latency. > \ No newline at end of file I'm not sure about the format, but the last line should not be here. > -- > 1.9.3 ^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2017-01-13 1:08 UTC | newest] Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2017-01-12 6:13 [dts] [PATCH V1 1/2] add test suite interrupt_pmd xu,gang 2017-01-12 6:13 ` [dts] [PATCH V1 2/2] add test plan interrupt_pmd xu,gang 2017-01-13 1:08 ` Liu, Yong
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).