Hi Marcin, Thanks for this patch on testing! I have applied it to the latest master and done some testing. Please find some feedback from my testing below: I have both an ixgbe and an i40e device on my platform, and was able to test with both. I can confirm that all three tests in this initial testsuite are passing on my platform when either an ixgbe, i40e or both devices are bound to DPDK (bound to igb_uio). When no devices are bound to DPDK, the first test passes, while the second two are skipped. One question I have with this behavior is about whether the "Add vhost-user-client port" test should be skipped when there are no devices bound to DPDK? Could this test still run regardless of there being no physical devices available? Maybe this doesn't make sense, since it is mentioned in the documentation for this patch that a DPDK supported NIC is required, but I was just wondering if there was a hard dependency here?
I also have one comment, inline below, on the documentation. Let me know what you think. Thanks, Cian > -----Original Message----- > From: [email protected] [mailto:ovs-dev- > [email protected]] On Behalf Of [email protected] > Sent: 14 December 2017 09:07 > To: [email protected] > Cc: Rybka, MarcinX <[email protected]> > Subject: [ovs-dev] [PATCH] tests: Add system-dpdk-testsuite > > From: Marcin Rybka <[email protected]> > > New OVS-DPDK testsuite, which can be launched via `make check-dpdk`, > tests OVS using a DPDK datapath. The testsuite contains already initial tests: > 1. EAL init > 2. Add standard DPDK PHY port > 3. Add vhost-user-client port > > Signed-off-by: Marcin Rybka <[email protected]> > --- > Documentation/topics/testing.rst | 19 ++++++++++++ > tests/automake.mk | 17 +++++++++++ > tests/system-dpdk-macros.at | 54 > ++++++++++++++++++++++++++++++++ > tests/system-dpdk-testsuite.at | 25 +++++++++++++++ > tests/system-dpdk.at | 66 > ++++++++++++++++++++++++++++++++++++++++ > 5 files changed, 181 insertions(+) > create mode 100644 tests/system-dpdk-macros.at create mode 100644 > tests/system-dpdk-testsuite.at create mode 100644 tests/system-dpdk.at > > diff --git a/Documentation/topics/testing.rst > b/Documentation/topics/testing.rst > index 1ecda00..e197a4c 100644 > --- a/Documentation/topics/testing.rst > +++ b/Documentation/topics/testing.rst > @@ -293,6 +293,25 @@ To invoke the datapath testsuite with the userspace > datapath, run:: > > The results of the testsuite are in ``tests/system-userspace-testsuite.dir``. > > +DPDK datapath > +''''''''''''' > + > +To test :doc:`/intro/install/dpdk` (i.e., the build was configured with > +``--with-dpdk``,the ``DPDK`` is installed), run the testsuite and > +generate a report by using the ``check-dpdk`` target:: > + > + $ make check-dpdk > + > +To see a list of all the available tests, run:: > + > + $ make check-dpdk TESTSUITEFLAGS=--list > + > +These tests require a `DPDK supported NIC`_ and proper DPDK variables > +(``DPDK_DIR`` and ``DPDK_BUILD``). Moreover you need to load the > +required modules and bind the NIC to the kernel driver. [Cian Ferriter] In my testing it looks like the NIC had to be bound to the DPDK driver (igb_uio). Should the above be changed to mention this? > + > +.. _DPDK supported NIC: http://dpdk.org/doc/nics > + > Kernel datapath > ''''''''''''''' > > diff --git a/tests/automake.mk b/tests/automake.mk index ad5362f..90c9b15 > 100644 > --- a/tests/automake.mk > +++ b/tests/automake.mk > @@ -5,10 +5,12 @@ EXTRA_DIST += \ > $(SYSTEM_KMOD_TESTSUITE_AT) \ > $(SYSTEM_USERSPACE_TESTSUITE_AT) \ > $(SYSTEM_OFFLOADS_TESTSUITE_AT) \ > + $(SYSTEM_DPDK_TESTSUITE_AT) \ > $(TESTSUITE) \ > $(SYSTEM_KMOD_TESTSUITE) \ > $(SYSTEM_USERSPACE_TESTSUITE) \ > $(SYSTEM_OFFLOADS_TESTSUITE) \ > + $(SYSTEM_DPDK_TESTSUITE) \ > tests/atlocal.in \ > $(srcdir)/package.m4 \ > $(srcdir)/tests/testsuite \ > @@ -125,6 +127,12 @@ SYSTEM_OFFLOADS_TESTSUITE_AT = \ > tests/system-offloads-traffic.at \ > tests/system-offloads-testsuite.at > > +SYSTEM_DPDK_TESTSUITE_AT = \ > + tests/system-common-macros.at \ > + tests/system-dpdk-macros.at \ > + tests/system-dpdk-testsuite.at \ > + tests/system-dpdk.at > + > check_SCRIPTS += tests/atlocal > > TESTSUITE = $(srcdir)/tests/testsuite > @@ -132,6 +140,7 @@ TESTSUITE_PATCH = $(srcdir)/tests/testsuite.patch > SYSTEM_KMOD_TESTSUITE = $(srcdir)/tests/system-kmod-testsuite > SYSTEM_USERSPACE_TESTSUITE = $(srcdir)/tests/system-userspace- > testsuite > SYSTEM_OFFLOADS_TESTSUITE = $(srcdir)/tests/system-offloads-testsuite > +SYSTEM_DPDK_TESTSUITE = $(srcdir)/tests/system-dpdk-testsuite > DISTCLEANFILES += tests/atconfig tests/atlocal > > AUTOTEST_PATH = > utilities:vswitchd:ovsdb:vtep:tests:$(PTHREAD_WIN32_DIR_DLL):ovn/control > ler-vtep:ovn/northd:ovn/utilities:ovn/controller > @@ -248,6 +257,10 @@ check-offloads: all > set $(SHELL) '$(SYSTEM_OFFLOADS_TESTSUITE)' -C tests > AUTOTEST_PATH='$(AUTOTEST_PATH)' $(TESTSUITEFLAGS) -j1; \ > "$$@" || (test X'$(RECHECK)' = Xyes && "$$@" --recheck) > > +check-dpdk: all > + set $(SHELL) '$(SYSTEM_DPDK_TESTSUITE)' -C tests > AUTOTEST_PATH='$(AUTOTEST_PATH)' $(TESTSUITEFLAGS) -j1; \ > + "$$@" || (test X'$(RECHECK)' = Xyes && "$$@" --recheck) > + > clean-local: > test ! -f '$(TESTSUITE)' || $(SHELL) '$(TESTSUITE)' -C tests --clean > > @@ -276,6 +289,10 @@ $(SYSTEM_OFFLOADS_TESTSUITE): package.m4 > $(SYSTEM_TESTSUITE_AT) $(SYSTEM_OFFLOAD > $(AM_V_GEN)$(AUTOTEST) -I '$(srcdir)' -o [email protected] [email protected] > $(AM_V_at)mv [email protected] $@ > > +$(SYSTEM_DPDK_TESTSUITE): package.m4 $(SYSTEM_TESTSUITE_AT) > $(SYSTEM_DPDK_TESTSUITE_AT) $(COMMON_MACROS_AT) > + $(AM_V_GEN)$(AUTOTEST) -I '$(srcdir)' -o [email protected] [email protected] > + $(AM_V_at)mv [email protected] $@ > + > # The `:;' works around a Bash 3.2 bug when the output is not writeable. > $(srcdir)/package.m4: $(top_srcdir)/configure.ac > $(AM_V_GEN):;{ \ > diff --git a/tests/system-dpdk-macros.at b/tests/system-dpdk-macros.at > new file mode 100644 index 0000000..cbd0f69 > --- /dev/null > +++ b/tests/system-dpdk-macros.at > @@ -0,0 +1,54 @@ > +# OVS_DPDK_PRE_CHECK() > +# > +# Check prerequisites for DPDK tests. Following settings are checked: > +# - Hugepages > +# - UIO driver > +# > +m4_define([OVS_DPDK_PRE_CHECK], > + [dnl Check Hugepages > + AT_CHECK([cat /proc/meminfo], [], [stdout]) > + AT_CHECK([grep HugePages_ stdout], [], [stdout]) > + AT_CHECK([mount], [], [stdout]) > + AT_CHECK([grep 'hugetlbfs' stdout], [], [stdout], []) > + > + dnl Check if VFIO or UIO driver is loaded > + AT_CHECK([lsmod | grep -E "igb_uio|vfio"], [], [stdout]) > + > + dnl Find PCI address candidate, skip if there is no DPDK-compatible NIC > + AT_CHECK([$DPDK_DIR/usertools/dpdk-devbind.py -s | head -n +4 | tail - > 1], [], [stdout]) > + AT_CHECK([cat stdout | cut -d" " -s -f1 > PCI_ADDR]) > + AT_CHECK([test -s PCI_ADDR || exit 77]) > +]) > + > + > +# OVS_DPDK_START() > +# > +# Create an empty database and start ovsdb-server. Add special > +configuration # dpdk-init to enable DPDK functionality. Start > +ovs-vswitchd connected to that # database using system devices (no > dummies). > +# > +m4_define([OVS_DPDK_START], > + [dnl Create database. > + AT_CHECK([touch .conf.db.~lock~]) > + AT_CHECK([ovsdb-tool create conf.db > +$abs_top_srcdir/vswitchd/vswitch.ovsschema]) > + > + dnl Start ovsdb-server. > + AT_CHECK([ovsdb-server --detach --no-chdir --pidfile --log-file -- > remote=punix:$OVS_RUNDIR/db.sock], [0], [stdout], [stderr]) > + on_exit "kill `cat ovsdb-server.pid`" > + AT_CHECK([[sed < stderr ' > +/vlog|INFO|opened log file/d > +/ovsdb_server|INFO|ovsdb-server (Open vSwitch)/d']]) > + AT_CAPTURE_FILE([ovsdb-server.log]) > + > + dnl Initialize database. > + AT_CHECK([ovs-vsctl --no-wait init]) > + > + dnl Enable DPDK functionality > + AT_CHECK([ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk- > init=true]) > + AT_CHECK([ovs-vsctl --no-wait set Open_vSwitch . > + other_config:dpdk-socket-mem="1024,1024"]) > + > + dnl Start ovs-vswitchd. > + AT_CHECK([ovs-vswitchd --detach --no-chdir --pidfile --log-file -vvconn - > vofproto_dpif -vunixctl], [0], [stdout], [stderr]) > + AT_CAPTURE_FILE([ovs-vswitchd.log]) > + on_exit "kill_ovs_vswitchd `cat ovs-vswitchd.pid`" > +]) > diff --git a/tests/system-dpdk-testsuite.at b/tests/system-dpdk-testsuite.at > new file mode 100644 index 0000000..382f09e > --- /dev/null > +++ b/tests/system-dpdk-testsuite.at > @@ -0,0 +1,25 @@ > +AT_INIT > + > +AT_COPYRIGHT([Copyright (c) 2017 Intel Corporation > + > +Licensed under the Apache License, Version 2.0 (the "License"); you may > +not use this file except in compliance with the License. > +You may obtain a copy of the License at: > + > + http://www.apache.org/licenses/LICENSE-2.0 > + > +Unless required by applicable law or agreed to in writing, software > +distributed under the License is distributed on an "AS IS" BASIS, > +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or > implied. > +See the License for the specific language governing permissions and > +limitations under the License.]) > + > +m4_ifdef([AT_COLOR_TESTS], [AT_COLOR_TESTS]) > + > +m4_include([tests/ovs-macros.at]) > +m4_include([tests/ovsdb-macros.at]) > +m4_include([tests/ofproto-macros.at]) > +m4_include([tests/system-common-macros.at]) > +m4_include([tests/system-dpdk-macros.at]) > + > +m4_include([tests/system-dpdk.at]) > diff --git a/tests/system-dpdk.at b/tests/system-dpdk.at new file mode > 100644 index 0000000..624f966 > --- /dev/null > +++ b/tests/system-dpdk.at > @@ -0,0 +1,66 @@ > +AT_BANNER([OVS-DPDK unit tests]) > + > +dnl > +----------------------------------------------------------------------- > +--- > +dnl Check if EAL init is successfull > +AT_SETUP([OVS-DPDK datapath - EAL init]) > +AT_KEYWORDS([dpdk]) > +dnl OVS_DPDK_PRE_CHECK() > +OVS_DPDK_START() > +AT_CHECK([grep "DPDK Enabled - initializing..." ovs-vswitchd.log], [], > +[stdout]) AT_CHECK([grep "EAL" ovs-vswitchd.log], [], [stdout]) > +AT_CHECK([grep "DPDK Enabled - initialized" ovs-vswitchd.log], [], > +[stdout]) > +OVS_VSWITCHD_STOP() > +AT_CLEANUP > +dnl > +----------------------------------------------------------------------- > +--- > + > + > + > +dnl > +----------------------------------------------------------------------- > +--- > +dnl Add standard DPDK PHY port > +AT_SETUP([OVS-DPDK datapath - add standard DPDK port]) > +AT_KEYWORDS([dpdk]) > + > +OVS_DPDK_PRE_CHECK() > +OVS_DPDK_START() > + > +dnl Add userspace bridge and attach it to OVS AT_CHECK([ovs-vsctl > +add-br br10 -- set bridge br10 datapath_type=netdev]) > +AT_CHECK([ovs-vsctl add-port br10 phy0 -- set Interface phy0 type=dpdk > +options:dpdk-devargs=$(cat PCI_ADDR)], [], [stdout], [stderr]) > +AT_CHECK([ovs-vsctl show], [], [stdout]) sleep 2 > + > +dnl Clean up > +AT_CHECK([ovs-vsctl del-port br10 phy0], [], [stdout], [stderr]) > +OVS_VSWITCHD_STOP("/does not exist. The Open vSwitch kernel module > is > +probably not loaded./d /Failed to enable flow control/d") AT_CLEANUP > +dnl > +----------------------------------------------------------------------- > +--- > + > + > + > +dnl > +----------------------------------------------------------------------- > +--- > +dnl Add vhost-user-client port > +AT_SETUP([OVS-DPDK datapath - add vhost-user-client port]) > +AT_KEYWORDS([dpdk]) > + > +OVS_DPDK_PRE_CHECK() > +OVS_DPDK_START() > + > +dnl Add userspace bridge and attach it to OVS AT_CHECK([ovs-vsctl > +add-br br10 -- set bridge br10 datapath_type=netdev]) > +AT_CHECK([ovs-vsctl add-port br10 dpdkvhostuserclient0 -- set Interface > +dpdkvhostuserclient0 type=dpdkvhostuserclient > +options:vhost-server-path=/tmp/dpdkvhostclient0], [], [stdout], > +[stderr]) AT_CHECK([ovs-vsctl show], [], [stdout]) sleep 2 > + > +dnl Parse log file > +AT_CHECK([grep "VHOST_CONFIG: vhost-user client: socket created" > +ovs-vswitchd.log], [], [stdout]) AT_CHECK([grep "vHost User device > +'dpdkvhostuserclient0' created in 'client' mode, using client socket" > +ovs-vswitchd.log], [], [stdout]) AT_CHECK([grep "VHOST_CONFIG: > +/tmp/dpdkvhostclient0: reconnecting..." ovs-vswitchd.log], [], > +[stdout]) > + > +dnl Clean up > +AT_CHECK([ovs-vsctl del-port br10 dpdkvhostuserclient0], [], [stdout], > +[stderr]) OVS_VSWITCHD_STOP("/does not exist. The Open vSwitch kernel > +module is probably not loaded./d /Failed to enable flow control/d > +/failed to connect to \/tmp\/dpdkvhostclient0: No such file or > +directory/d") AT_CLEANUP dnl > +----------------------------------------------------------------------- > +--- > -- > 1.9.3 > > -------------------------------------------------------------- > Intel Research and Development Ireland Limited Registered in Ireland > Registered Office: Collinstown Industrial Park, Leixlip, County Kildare > Registered Number: 308263 > > > This e-mail and any attachments may contain confidential material for the > sole use of the intended recipient(s). Any review or distribution by others is > strictly prohibited. If you are not the intended recipient, please contact the > sender and delete all copies. > > _______________________________________________ > dev mailing list > [email protected] > https://mail.openvswitch.org/mailman/listinfo/ovs-dev _______________________________________________ dev mailing list [email protected] https://mail.openvswitch.org/mailman/listinfo/ovs-dev
