[Pkg-ofed-commits] [perftest] 01/05: Imported Upstream version 2.3+0.12.gcb5b746
Ana Beatriz Guerrero López
ana at moszumanska.debian.org
Thu Sep 4 12:10:24 UTC 2014
This is an automated email from the git hooks/post-receive script.
ana pushed a commit to branch master
in repository perftest.
commit 662f3497811a39dc68aa6805e25ef4e242658785
Author: Ana Guerrero López <ana at ekaia.org>
Date: Thu Sep 4 11:27:05 2014 +0200
Imported Upstream version 2.3+0.12.gcb5b746
---
Makefile.am | 18 +-
Makefile.in | 38 +--
README | 7 +-
autom4te.cache/output.0 | 172 +++++++++-
autom4te.cache/output.1 | 172 +++++++++-
autom4te.cache/traces.0 | 188 ++++++-----
autom4te.cache/traces.1 | 374 +++++++++++----------
config.h.in | 6 +
configure | 212 ++++++++++--
configure.ac | 24 +-
perftest.spec | 6 +-
src/atomic_bw.c | 24 +-
src/atomic_lat.c | 18 +
src/get_clock.c | 3 +
src/perftest_communication.c | 152 ++++++++-
src/perftest_communication.h | 16 +-
src/perftest_parameters.c | 161 ++++++++-
src/perftest_parameters.h | 157 +++++----
src/perftest_resources.c | 766 ++++++++++++++++++++++++++++++-------------
src/perftest_resources.h | 49 +--
src/raw_ethernet_resources.c | 103 +++---
src/raw_ethernet_resources.h | 10 +-
src/raw_ethernet_send_bw.c | 165 ++++++++--
src/raw_ethernet_send_lat.c | 31 +-
src/read_bw.c | 42 ++-
src/read_lat.c | 12 +
src/send_bw.c | 46 ++-
src/send_lat.c | 12 +
src/write_bw.c | 41 ++-
src/write_lat.c | 12 +
30 files changed, 2234 insertions(+), 803 deletions(-)
diff --git a/Makefile.am b/Makefile.am
index 13d73f3..37e9aff 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -13,8 +13,6 @@
ACLOCAL_AMFLAGS= -I m4
AUTOMAKE_OPTIONS= subdir-objects
-AM_CFLAGS = -g -Wall -O3
-AM_CPPFLAGS = -D_GNU_SOURCE
noinst_LIBRARIES = libperftest.a
libperftest_a_SOURCES = src/get_clock.c src/perftest_communication.c src/perftest_parameters.c src/perftest_resources.c
@@ -39,29 +37,29 @@ ib_send_lat_SOURCES = src/send_lat.c src/multicast_resources.c src/multicast_res
ib_send_lat_LDADD = libperftest.a $(LIBUMAD) $(LIBMATH)
ib_write_lat_SOURCES = src/write_lat.c
-ib_write_lat_LDADD = libperftest.a
+ib_write_lat_LDADD = libperftest.a $(LIBMATH)
ib_write_bw_SOURCES = src/write_bw.c
-ib_write_bw_LDADD = libperftest.a
+ib_write_bw_LDADD = libperftest.a $(LIBMATH)
ib_read_lat_SOURCES = src/read_lat.c
-ib_read_lat_LDADD = libperftest.a
+ib_read_lat_LDADD = libperftest.a $(LIBMATH)
ib_read_bw_SOURCES = src/read_bw.c
-ib_read_bw_LDADD = libperftest.a
+ib_read_bw_LDADD = libperftest.a $(LIBMATH)
ib_atomic_lat_SOURCES = src/atomic_lat.c
-ib_atomic_lat_LDADD = libperftest.a
+ib_atomic_lat_LDADD = libperftest.a $(LIBMATH)
ib_atomic_bw_SOURCES = src/atomic_bw.c
-ib_atomic_bw_LDADD = libperftest.a
+ib_atomic_bw_LDADD = libperftest.a $(LIBMATH)
if HAVE_RAW_ETH
raw_ethernet_bw_SOURCES = src/raw_ethernet_send_bw.c
-raw_ethernet_bw_LDADD = libperftest.a
+raw_ethernet_bw_LDADD = libperftest.a $(LIBMATH)
raw_ethernet_lat_SOURCES = src/raw_ethernet_send_lat.c
-raw_ethernet_lat_LDADD = libperftest.a
+raw_ethernet_lat_LDADD = libperftest.a $(LIBMATH)
else
raw_ethernet_bw_SOURCES =
diff --git a/Makefile.in b/Makefile.in
index 3f898e0..ac8e8d6 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -106,23 +106,23 @@ am__installdirs = "$(DESTDIR)$(bindir)"
PROGRAMS = $(bin_PROGRAMS)
am_ib_atomic_bw_OBJECTS = src/atomic_bw.$(OBJEXT)
ib_atomic_bw_OBJECTS = $(am_ib_atomic_bw_OBJECTS)
-ib_atomic_bw_DEPENDENCIES = libperftest.a
+am__DEPENDENCIES_1 =
+ib_atomic_bw_DEPENDENCIES = libperftest.a $(am__DEPENDENCIES_1)
AM_V_lt = $(am__v_lt_$(V))
am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
am__v_lt_0 = --silent
am_ib_atomic_lat_OBJECTS = src/atomic_lat.$(OBJEXT)
ib_atomic_lat_OBJECTS = $(am_ib_atomic_lat_OBJECTS)
-ib_atomic_lat_DEPENDENCIES = libperftest.a
+ib_atomic_lat_DEPENDENCIES = libperftest.a $(am__DEPENDENCIES_1)
am_ib_read_bw_OBJECTS = src/read_bw.$(OBJEXT)
ib_read_bw_OBJECTS = $(am_ib_read_bw_OBJECTS)
-ib_read_bw_DEPENDENCIES = libperftest.a
+ib_read_bw_DEPENDENCIES = libperftest.a $(am__DEPENDENCIES_1)
am_ib_read_lat_OBJECTS = src/read_lat.$(OBJEXT)
ib_read_lat_OBJECTS = $(am_ib_read_lat_OBJECTS)
-ib_read_lat_DEPENDENCIES = libperftest.a
+ib_read_lat_DEPENDENCIES = libperftest.a $(am__DEPENDENCIES_1)
am_ib_send_bw_OBJECTS = src/send_bw.$(OBJEXT) \
src/multicast_resources.$(OBJEXT)
ib_send_bw_OBJECTS = $(am_ib_send_bw_OBJECTS)
-am__DEPENDENCIES_1 =
ib_send_bw_DEPENDENCIES = libperftest.a $(am__DEPENDENCIES_1) \
$(am__DEPENDENCIES_1)
am_ib_send_lat_OBJECTS = src/send_lat.$(OBJEXT) \
@@ -132,20 +132,22 @@ ib_send_lat_DEPENDENCIES = libperftest.a $(am__DEPENDENCIES_1) \
$(am__DEPENDENCIES_1)
am_ib_write_bw_OBJECTS = src/write_bw.$(OBJEXT)
ib_write_bw_OBJECTS = $(am_ib_write_bw_OBJECTS)
-ib_write_bw_DEPENDENCIES = libperftest.a
+ib_write_bw_DEPENDENCIES = libperftest.a $(am__DEPENDENCIES_1)
am_ib_write_lat_OBJECTS = src/write_lat.$(OBJEXT)
ib_write_lat_OBJECTS = $(am_ib_write_lat_OBJECTS)
-ib_write_lat_DEPENDENCIES = libperftest.a
+ib_write_lat_DEPENDENCIES = libperftest.a $(am__DEPENDENCIES_1)
am__raw_ethernet_bw_SOURCES_DIST = src/raw_ethernet_send_bw.c
@HAVE_RAW_ETH_TRUE at am_raw_ethernet_bw_OBJECTS = \
@HAVE_RAW_ETH_TRUE@ src/raw_ethernet_send_bw.$(OBJEXT)
raw_ethernet_bw_OBJECTS = $(am_raw_ethernet_bw_OBJECTS)
- at HAVE_RAW_ETH_TRUE@raw_ethernet_bw_DEPENDENCIES = libperftest.a
+ at HAVE_RAW_ETH_TRUE@raw_ethernet_bw_DEPENDENCIES = libperftest.a \
+ at HAVE_RAW_ETH_TRUE@ $(am__DEPENDENCIES_1)
am__raw_ethernet_lat_SOURCES_DIST = src/raw_ethernet_send_lat.c
@HAVE_RAW_ETH_TRUE at am_raw_ethernet_lat_OBJECTS = \
@HAVE_RAW_ETH_TRUE@ src/raw_ethernet_send_lat.$(OBJEXT)
raw_ethernet_lat_OBJECTS = $(am_raw_ethernet_lat_OBJECTS)
- at HAVE_RAW_ETH_TRUE@raw_ethernet_lat_DEPENDENCIES = libperftest.a
+ at HAVE_RAW_ETH_TRUE@raw_ethernet_lat_DEPENDENCIES = libperftest.a \
+ at HAVE_RAW_ETH_TRUE@ $(am__DEPENDENCIES_1)
DEFAULT_INCLUDES = -I. at am__isrc@
depcomp = $(SHELL) $(top_srcdir)/config/depcomp
am__depfiles_maybe = depfiles
@@ -325,8 +327,6 @@ top_builddir = @top_builddir@
top_srcdir = @top_srcdir@
ACLOCAL_AMFLAGS = -I m4
AUTOMAKE_OPTIONS = subdir-objects
-AM_CFLAGS = -g -Wall -O3
-AM_CPPFLAGS = -D_GNU_SOURCE
noinst_LIBRARIES = libperftest.a
libperftest_a_SOURCES = src/get_clock.c src/perftest_communication.c \
src/perftest_parameters.c src/perftest_resources.c \
@@ -339,25 +339,25 @@ ib_send_bw_LDADD = libperftest.a $(LIBUMAD) $(LIBMATH)
ib_send_lat_SOURCES = src/send_lat.c src/multicast_resources.c src/multicast_resources.h
ib_send_lat_LDADD = libperftest.a $(LIBUMAD) $(LIBMATH)
ib_write_lat_SOURCES = src/write_lat.c
-ib_write_lat_LDADD = libperftest.a
+ib_write_lat_LDADD = libperftest.a $(LIBMATH)
ib_write_bw_SOURCES = src/write_bw.c
-ib_write_bw_LDADD = libperftest.a
+ib_write_bw_LDADD = libperftest.a $(LIBMATH)
ib_read_lat_SOURCES = src/read_lat.c
-ib_read_lat_LDADD = libperftest.a
+ib_read_lat_LDADD = libperftest.a $(LIBMATH)
ib_read_bw_SOURCES = src/read_bw.c
-ib_read_bw_LDADD = libperftest.a
+ib_read_bw_LDADD = libperftest.a $(LIBMATH)
ib_atomic_lat_SOURCES = src/atomic_lat.c
-ib_atomic_lat_LDADD = libperftest.a
+ib_atomic_lat_LDADD = libperftest.a $(LIBMATH)
ib_atomic_bw_SOURCES = src/atomic_bw.c
-ib_atomic_bw_LDADD = libperftest.a
+ib_atomic_bw_LDADD = libperftest.a $(LIBMATH)
@HAVE_RAW_ETH_FALSE at raw_ethernet_bw_SOURCES =
@HAVE_RAW_ETH_TRUE at raw_ethernet_bw_SOURCES = src/raw_ethernet_send_bw.c
@HAVE_RAW_ETH_FALSE at raw_ethernet_bw_LDADD =
- at HAVE_RAW_ETH_TRUE@raw_ethernet_bw_LDADD = libperftest.a
+ at HAVE_RAW_ETH_TRUE@raw_ethernet_bw_LDADD = libperftest.a $(LIBMATH)
@HAVE_RAW_ETH_FALSE at raw_ethernet_lat_SOURCES =
@HAVE_RAW_ETH_TRUE at raw_ethernet_lat_SOURCES = src/raw_ethernet_send_lat.c
@HAVE_RAW_ETH_FALSE at raw_ethernet_lat_LDADD =
- at HAVE_RAW_ETH_TRUE@raw_ethernet_lat_LDADD = libperftest.a
+ at HAVE_RAW_ETH_TRUE@raw_ethernet_lat_LDADD = libperftest.a $(LIBMATH)
all: config.h
$(MAKE) $(AM_MAKEFLAGS) all-am
diff --git a/README b/README
index ac6c9c8..c60fd46 100644
--- a/README
+++ b/README
@@ -1,5 +1,5 @@
Open Fabrics Enterprise Distribution (OFED)
- Performance Tests README for OFED 2.2
+ Performance Tests README for OFED 2.3
April 2014
@@ -230,7 +230,7 @@ Special feature detailed explanation in tests:
3. Different versions of perftest may not be compatible with each other.
Please use the same perftest version on both sides to ensure consistency of benchmark results.
- 4. This version (5.2) won't work with previous versions of perftest.
+ 4. Version 5.2 won't work with previous versions of perftest.
5. This perftest package won't compile on MLNX_OFED-2.1 due to API changes in MLNX_OFED-2.2
In order to compile it properly, please do:
@@ -239,3 +239,6 @@ Special feature detailed explanation in tests:
6. In te x390x platform virtualized environment the results shown by package test applications can be incorrect.
+ 7. This release includes support for dualport VPI test - port1-Ethernet , port2-IB. (in addition to Eth:Eth, IB:IB)
+ Currently, running dualport when port1-IB , port2-Ethernet still not working.
+
diff --git a/autom4te.cache/output.0 b/autom4te.cache/output.0
index d64b841..9118a7d 100644
--- a/autom4te.cache/output.0
+++ b/autom4te.cache/output.0
@@ -1,6 +1,6 @@
@%:@! /bin/sh
@%:@ Guess values for system-dependent variables and create Makefiles.
-@%:@ Generated by GNU Autoconf 2.63 for perftest 5.2.
+@%:@ Generated by GNU Autoconf 2.63 for perftest 5.33.
@%:@
@%:@ Report bugs to <linux-rdma at vger.kernel.org>.
@%:@
@@ -745,8 +745,8 @@ SHELL=${CONFIG_SHELL-/bin/sh}
# Identity of this package.
PACKAGE_NAME='perftest'
PACKAGE_TARNAME='perftest'
-PACKAGE_VERSION='5.2'
-PACKAGE_STRING='perftest 5.2'
+PACKAGE_VERSION='5.33'
+PACKAGE_STRING='perftest 5.33'
PACKAGE_BUGREPORT='linux-rdma at vger.kernel.org'
# Factoring default headers for most tests.
@@ -795,6 +795,8 @@ HAVE_DC_FALSE
HAVE_DC_TRUE
HAVE_RSS_EXP_FALSE
HAVE_RSS_EXP_TRUE
+HAVE_MASKED_ATOMICS_FALSE
+HAVE_MASKED_ATOMICS_TRUE
HAVE_VERBS_EXP_FALSE
HAVE_VERBS_EXP_TRUE
HAVE_SCIF_FALSE
@@ -809,6 +811,8 @@ HAVE_RAW_ETH_REG_FALSE
HAVE_RAW_ETH_REG_TRUE
HAVE_RAW_ETH_EXP_FALSE
HAVE_RAW_ETH_EXP_TRUE
+HAVE_ODP_FALSE
+HAVE_ODP_TRUE
CXXCPP
CPP
OTOOL64
@@ -1511,7 +1515,7 @@ if test "$ac_init_help" = "long"; then
# Omit some internal or obsolete options to make the list less imposing.
# This message is too long to be a string in the A/UX 3.1 sh.
cat <<_ACEOF
-\`configure' configures perftest 5.2 to adapt to many kinds of systems.
+\`configure' configures perftest 5.33 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]...
@@ -1581,7 +1585,7 @@ fi
if test -n "$ac_init_help"; then
case $ac_init_help in
- short | recursive ) echo "Configuration of perftest 5.2:";;
+ short | recursive ) echo "Configuration of perftest 5.33:";;
esac
cat <<\_ACEOF
@@ -1689,7 +1693,7 @@ fi
test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then
cat <<\_ACEOF
-perftest configure 5.2
+perftest configure 5.33
generated by GNU Autoconf 2.63
Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
@@ -1703,7 +1707,7 @@ cat >config.log <<_ACEOF
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.
-It was created by perftest $as_me 5.2, which was
+It was created by perftest $as_me 5.33, which was
generated by GNU Autoconf 2.63. Invocation command line was
$ $0 $@
@@ -2555,7 +2559,7 @@ fi
# Define the identity of the package.
PACKAGE='perftest'
- VERSION='5.2'
+ VERSION='5.33'
cat >>confdefs.h <<_ACEOF
@@ -16182,6 +16186,73 @@ _ACEOF
cat confdefs.h >>conftest.$ac_ext
cat >>conftest.$ac_ext <<_ACEOF
/* end confdefs.h. */
+
+#include <infiniband/verbs.h>
+#include <infiniband/verbs_exp.h>
+int
+main ()
+{
+int x = IBV_EXP_ACCESS_ON_DEMAND;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext && {
+ test "$cross_compiling" = yes ||
+ $as_test_x conftest$ac_exeext
+ }; then
+ HAVE_ODP=yes
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ HAVE_ODP=no
+fi
+
+rm -rf conftest.dSYM
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+ conftest$ac_exeext conftest.$ac_ext
+ if test "x$HAVE_ODP" = "xyes"; then
+ HAVE_ODP_TRUE=
+ HAVE_ODP_FALSE='#'
+else
+ HAVE_ODP_TRUE='#'
+ HAVE_ODP_FALSE=
+fi
+
+if test $HAVE_ODP = yes && test $HAVE_ODP = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+@%:@define HAVE_ODP 1
+_ACEOF
+
+fi
+
+
+
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
#include <infiniband/verbs.h>
int
main ()
@@ -16616,6 +16687,71 @@ cat >>conftest.$ac_ext <<_ACEOF
int
main ()
{
+int x = IBV_EXP_DEVICE_ATTR_EXT_ATOMIC_ARGS;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext && {
+ test "$cross_compiling" = yes ||
+ $as_test_x conftest$ac_exeext
+ }; then
+ HAVE_MASKED_ATOMICS=yes
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ HAVE_MASKED_ATOMICS=no
+fi
+
+rm -rf conftest.dSYM
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+ conftest$ac_exeext conftest.$ac_ext
+ if test "x$HAVE_MASKED_ATOMICS" = "xyes"; then
+ HAVE_MASKED_ATOMICS_TRUE=
+ HAVE_MASKED_ATOMICS_FALSE='#'
+else
+ HAVE_MASKED_ATOMICS_TRUE='#'
+ HAVE_MASKED_ATOMICS_FALSE=
+fi
+
+if test $HAVE_MASKED_ATOMICS = yes && test $HAVE_VERBS_EXP = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+@%:@define HAVE_MASKED_ATOMICS 1
+_ACEOF
+
+fi
+
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+#include <infiniband/verbs.h>
+#include <infiniband/verbs_exp.h>
+int
+main ()
+{
int x = IBV_EXP_DEVICE_ATTR_RSS_TBL_SZ;
;
return 0;
@@ -16748,7 +16884,7 @@ _ACEOF
LIBS=$LIBS" -lcuda"
fi
-
+CFLAGS="-g -Wall -D_GNU_SOURCE -O3"
ac_config_files="$ac_config_files Makefile"
@@ -16893,6 +17029,13 @@ $as_echo "$as_me: error: conditional \"am__fastdepCXX\" was never defined.
Usually this means the macro was only invoked conditionally." >&2;}
{ (exit 1); exit 1; }; }
fi
+if test -z "${HAVE_ODP_TRUE}" && test -z "${HAVE_ODP_FALSE}"; then
+ { { $as_echo "$as_me:$LINENO: error: conditional \"HAVE_ODP\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+$as_echo "$as_me: error: conditional \"HAVE_ODP\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
if test -z "${HAVE_RAW_ETH_EXP_TRUE}" && test -z "${HAVE_RAW_ETH_EXP_FALSE}"; then
{ { $as_echo "$as_me:$LINENO: error: conditional \"HAVE_RAW_ETH_EXP\" was never defined.
Usually this means the macro was only invoked conditionally." >&5
@@ -16949,6 +17092,13 @@ $as_echo "$as_me: error: conditional \"HAVE_VERBS_EXP\" was never defined.
Usually this means the macro was only invoked conditionally." >&2;}
{ (exit 1); exit 1; }; }
fi
+if test -z "${HAVE_MASKED_ATOMICS_TRUE}" && test -z "${HAVE_MASKED_ATOMICS_FALSE}"; then
+ { { $as_echo "$as_me:$LINENO: error: conditional \"HAVE_MASKED_ATOMICS\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+$as_echo "$as_me: error: conditional \"HAVE_MASKED_ATOMICS\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
if test -z "${HAVE_RSS_EXP_TRUE}" && test -z "${HAVE_RSS_EXP_FALSE}"; then
{ { $as_echo "$as_me:$LINENO: error: conditional \"HAVE_RSS_EXP\" was never defined.
Usually this means the macro was only invoked conditionally." >&5
@@ -17285,7 +17435,7 @@ exec 6>&1
# report actual input values of CONFIG_FILES etc. instead of their
# values after options handling.
ac_log="
-This file was extended by perftest $as_me 5.2, which was
+This file was extended by perftest $as_me 5.33, which was
generated by GNU Autoconf 2.63. Invocation command line was
CONFIG_FILES = $CONFIG_FILES
@@ -17348,7 +17498,7 @@ Report bugs to <bug-autoconf at gnu.org>."
_ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_cs_version="\\
-perftest config.status 5.2
+perftest config.status 5.33
configured by $0, generated by GNU Autoconf 2.63,
with options \\"`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\"
diff --git a/autom4te.cache/output.1 b/autom4te.cache/output.1
index 5ed1e4f..ce03beb 100644
--- a/autom4te.cache/output.1
+++ b/autom4te.cache/output.1
@@ -1,6 +1,6 @@
@%:@! /bin/sh
@%:@ Guess values for system-dependent variables and create Makefiles.
-@%:@ Generated by GNU Autoconf 2.63 for perftest 5.2.
+@%:@ Generated by GNU Autoconf 2.63 for perftest 5.33.
@%:@
@%:@ Report bugs to <linux-rdma at vger.kernel.org>.
@%:@
@@ -745,8 +745,8 @@ SHELL=${CONFIG_SHELL-/bin/sh}
# Identity of this package.
PACKAGE_NAME='perftest'
PACKAGE_TARNAME='perftest'
-PACKAGE_VERSION='5.2'
-PACKAGE_STRING='perftest 5.2'
+PACKAGE_VERSION='5.33'
+PACKAGE_STRING='perftest 5.33'
PACKAGE_BUGREPORT='linux-rdma at vger.kernel.org'
# Factoring default headers for most tests.
@@ -795,6 +795,8 @@ HAVE_DC_FALSE
HAVE_DC_TRUE
HAVE_RSS_EXP_FALSE
HAVE_RSS_EXP_TRUE
+HAVE_MASKED_ATOMICS_FALSE
+HAVE_MASKED_ATOMICS_TRUE
HAVE_VERBS_EXP_FALSE
HAVE_VERBS_EXP_TRUE
HAVE_SCIF_FALSE
@@ -809,6 +811,8 @@ HAVE_RAW_ETH_REG_FALSE
HAVE_RAW_ETH_REG_TRUE
HAVE_RAW_ETH_EXP_FALSE
HAVE_RAW_ETH_EXP_TRUE
+HAVE_ODP_FALSE
+HAVE_ODP_TRUE
CXXCPP
CPP
OTOOL64
@@ -1511,7 +1515,7 @@ if test "$ac_init_help" = "long"; then
# Omit some internal or obsolete options to make the list less imposing.
# This message is too long to be a string in the A/UX 3.1 sh.
cat <<_ACEOF
-\`configure' configures perftest 5.2 to adapt to many kinds of systems.
+\`configure' configures perftest 5.33 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]...
@@ -1581,7 +1585,7 @@ fi
if test -n "$ac_init_help"; then
case $ac_init_help in
- short | recursive ) echo "Configuration of perftest 5.2:";;
+ short | recursive ) echo "Configuration of perftest 5.33:";;
esac
cat <<\_ACEOF
@@ -1689,7 +1693,7 @@ fi
test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then
cat <<\_ACEOF
-perftest configure 5.2
+perftest configure 5.33
generated by GNU Autoconf 2.63
Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
@@ -1703,7 +1707,7 @@ cat >config.log <<_ACEOF
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.
-It was created by perftest $as_me 5.2, which was
+It was created by perftest $as_me 5.33, which was
generated by GNU Autoconf 2.63. Invocation command line was
$ $0 $@
@@ -2555,7 +2559,7 @@ fi
# Define the identity of the package.
PACKAGE='perftest'
- VERSION='5.2'
+ VERSION='5.33'
cat >>confdefs.h <<_ACEOF
@@ -16178,6 +16182,73 @@ _ACEOF
cat confdefs.h >>conftest.$ac_ext
cat >>conftest.$ac_ext <<_ACEOF
/* end confdefs.h. */
+
+#include <infiniband/verbs.h>
+#include <infiniband/verbs_exp.h>
+int
+main ()
+{
+int x = IBV_EXP_ACCESS_ON_DEMAND;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext && {
+ test "$cross_compiling" = yes ||
+ $as_test_x conftest$ac_exeext
+ }; then
+ HAVE_ODP=yes
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ HAVE_ODP=no
+fi
+
+rm -rf conftest.dSYM
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+ conftest$ac_exeext conftest.$ac_ext
+ if test "x$HAVE_ODP" = "xyes"; then
+ HAVE_ODP_TRUE=
+ HAVE_ODP_FALSE='#'
+else
+ HAVE_ODP_TRUE='#'
+ HAVE_ODP_FALSE=
+fi
+
+if test $HAVE_ODP = yes && test $HAVE_ODP = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+@%:@define HAVE_ODP 1
+_ACEOF
+
+fi
+
+
+
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
#include <infiniband/verbs.h>
int
main ()
@@ -16612,6 +16683,71 @@ cat >>conftest.$ac_ext <<_ACEOF
int
main ()
{
+int x = IBV_EXP_DEVICE_ATTR_EXT_ATOMIC_ARGS;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext && {
+ test "$cross_compiling" = yes ||
+ $as_test_x conftest$ac_exeext
+ }; then
+ HAVE_MASKED_ATOMICS=yes
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ HAVE_MASKED_ATOMICS=no
+fi
+
+rm -rf conftest.dSYM
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+ conftest$ac_exeext conftest.$ac_ext
+ if test "x$HAVE_MASKED_ATOMICS" = "xyes"; then
+ HAVE_MASKED_ATOMICS_TRUE=
+ HAVE_MASKED_ATOMICS_FALSE='#'
+else
+ HAVE_MASKED_ATOMICS_TRUE='#'
+ HAVE_MASKED_ATOMICS_FALSE=
+fi
+
+if test $HAVE_MASKED_ATOMICS = yes && test $HAVE_VERBS_EXP = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+@%:@define HAVE_MASKED_ATOMICS 1
+_ACEOF
+
+fi
+
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+#include <infiniband/verbs.h>
+#include <infiniband/verbs_exp.h>
+int
+main ()
+{
int x = IBV_EXP_DEVICE_ATTR_RSS_TBL_SZ;
;
return 0;
@@ -16744,7 +16880,7 @@ _ACEOF
LIBS=$LIBS" -lcuda"
fi
-
+CFLAGS="-g -Wall -D_GNU_SOURCE -O3"
ac_config_files="$ac_config_files Makefile"
@@ -16889,6 +17025,13 @@ $as_echo "$as_me: error: conditional \"am__fastdepCXX\" was never defined.
Usually this means the macro was only invoked conditionally." >&2;}
{ (exit 1); exit 1; }; }
fi
+if test -z "${HAVE_ODP_TRUE}" && test -z "${HAVE_ODP_FALSE}"; then
+ { { $as_echo "$as_me:$LINENO: error: conditional \"HAVE_ODP\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+$as_echo "$as_me: error: conditional \"HAVE_ODP\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
if test -z "${HAVE_RAW_ETH_EXP_TRUE}" && test -z "${HAVE_RAW_ETH_EXP_FALSE}"; then
{ { $as_echo "$as_me:$LINENO: error: conditional \"HAVE_RAW_ETH_EXP\" was never defined.
Usually this means the macro was only invoked conditionally." >&5
@@ -16945,6 +17088,13 @@ $as_echo "$as_me: error: conditional \"HAVE_VERBS_EXP\" was never defined.
Usually this means the macro was only invoked conditionally." >&2;}
{ (exit 1); exit 1; }; }
fi
+if test -z "${HAVE_MASKED_ATOMICS_TRUE}" && test -z "${HAVE_MASKED_ATOMICS_FALSE}"; then
+ { { $as_echo "$as_me:$LINENO: error: conditional \"HAVE_MASKED_ATOMICS\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+$as_echo "$as_me: error: conditional \"HAVE_MASKED_ATOMICS\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
if test -z "${HAVE_RSS_EXP_TRUE}" && test -z "${HAVE_RSS_EXP_FALSE}"; then
{ { $as_echo "$as_me:$LINENO: error: conditional \"HAVE_RSS_EXP\" was never defined.
Usually this means the macro was only invoked conditionally." >&5
@@ -17281,7 +17431,7 @@ exec 6>&1
# report actual input values of CONFIG_FILES etc. instead of their
# values after options handling.
ac_log="
-This file was extended by perftest $as_me 5.2, which was
+This file was extended by perftest $as_me 5.33, which was
generated by GNU Autoconf 2.63. Invocation command line was
CONFIG_FILES = $CONFIG_FILES
@@ -17344,7 +17494,7 @@ Report bugs to <bug-autoconf at gnu.org>."
_ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_cs_version="\\
-perftest config.status 5.2
+perftest config.status 5.33
configured by $0, generated by GNU Autoconf 2.63,
with options \\"`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\"
diff --git a/autom4te.cache/traces.0 b/autom4te.cache/traces.0
index 307130a..026045d 100644
--- a/autom4te.cache/traces.0
+++ b/autom4te.cache/traces.0
@@ -2389,94 +2389,112 @@ m4trace:configure.ac:43: -1- m4_pattern_allow([^HAVE_LIBRDMACM$])
m4trace:configure.ac:46: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
You should run autoupdate.], [../../lib/autoconf/general.m4:2527: AC_TRY_LINK is expanded from...
configure.ac:46: the top level])
-m4trace:configure.ac:49: -1- AM_CONDITIONAL([HAVE_RAW_ETH_EXP], [test "x$HAVE_RAW_ETH_EXP" = "xyes"])
-m4trace:configure.ac:49: -1- m4_pattern_allow([^HAVE_RAW_ETH_EXP_TRUE$])
-m4trace:configure.ac:49: -1- m4_pattern_allow([^HAVE_RAW_ETH_EXP_FALSE$])
-m4trace:configure.ac:49: -1- _AM_SUBST_NOTMAKE([HAVE_RAW_ETH_EXP_TRUE])
-m4trace:configure.ac:49: -1- _AM_SUBST_NOTMAKE([HAVE_RAW_ETH_EXP_FALSE])
-m4trace:configure.ac:51: -1- m4_pattern_allow([^HAVE_RAW_ETH_EXP$])
-m4trace:configure.ac:54: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
+m4trace:configure.ac:50: -1- AM_CONDITIONAL([HAVE_ODP], [test "x$HAVE_ODP" = "xyes"])
+m4trace:configure.ac:50: -1- m4_pattern_allow([^HAVE_ODP_TRUE$])
+m4trace:configure.ac:50: -1- m4_pattern_allow([^HAVE_ODP_FALSE$])
+m4trace:configure.ac:50: -1- _AM_SUBST_NOTMAKE([HAVE_ODP_TRUE])
+m4trace:configure.ac:50: -1- _AM_SUBST_NOTMAKE([HAVE_ODP_FALSE])
+m4trace:configure.ac:52: -1- m4_pattern_allow([^HAVE_ODP$])
+m4trace:configure.ac:57: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
You should run autoupdate.], [../../lib/autoconf/general.m4:2527: AC_TRY_LINK is expanded from...
-configure.ac:54: the top level])
-m4trace:configure.ac:57: -1- AM_CONDITIONAL([HAVE_RAW_ETH_REG], [test "x$HAVE_RAW_ETH_REG" = "xyes"])
-m4trace:configure.ac:57: -1- m4_pattern_allow([^HAVE_RAW_ETH_REG_TRUE$])
-m4trace:configure.ac:57: -1- m4_pattern_allow([^HAVE_RAW_ETH_REG_FALSE$])
-m4trace:configure.ac:57: -1- _AM_SUBST_NOTMAKE([HAVE_RAW_ETH_REG_TRUE])
-m4trace:configure.ac:57: -1- _AM_SUBST_NOTMAKE([HAVE_RAW_ETH_REG_FALSE])
-m4trace:configure.ac:59: -1- m4_pattern_allow([^HAVE_RAW_ETH_REG$])
-m4trace:configure.ac:62: -1- AM_CONDITIONAL([HAVE_RAW_ETH], [true])
-m4trace:configure.ac:62: -1- m4_pattern_allow([^HAVE_RAW_ETH_TRUE$])
-m4trace:configure.ac:62: -1- m4_pattern_allow([^HAVE_RAW_ETH_FALSE$])
-m4trace:configure.ac:62: -1- _AM_SUBST_NOTMAKE([HAVE_RAW_ETH_TRUE])
-m4trace:configure.ac:62: -1- _AM_SUBST_NOTMAKE([HAVE_RAW_ETH_FALSE])
-m4trace:configure.ac:64: -1- m4_pattern_allow([^HAVE_RAW_ETH$])
-m4trace:configure.ac:66: -1- AM_CONDITIONAL([HAVE_RAW_ETH], [false])
-m4trace:configure.ac:66: -1- m4_pattern_allow([^HAVE_RAW_ETH_TRUE$])
-m4trace:configure.ac:66: -1- m4_pattern_allow([^HAVE_RAW_ETH_FALSE$])
-m4trace:configure.ac:66: -1- _AM_SUBST_NOTMAKE([HAVE_RAW_ETH_TRUE])
-m4trace:configure.ac:66: -1- _AM_SUBST_NOTMAKE([HAVE_RAW_ETH_FALSE])
-m4trace:configure.ac:70: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
+configure.ac:57: the top level])
+m4trace:configure.ac:60: -1- AM_CONDITIONAL([HAVE_RAW_ETH_EXP], [test "x$HAVE_RAW_ETH_EXP" = "xyes"])
+m4trace:configure.ac:60: -1- m4_pattern_allow([^HAVE_RAW_ETH_EXP_TRUE$])
+m4trace:configure.ac:60: -1- m4_pattern_allow([^HAVE_RAW_ETH_EXP_FALSE$])
+m4trace:configure.ac:60: -1- _AM_SUBST_NOTMAKE([HAVE_RAW_ETH_EXP_TRUE])
+m4trace:configure.ac:60: -1- _AM_SUBST_NOTMAKE([HAVE_RAW_ETH_EXP_FALSE])
+m4trace:configure.ac:62: -1- m4_pattern_allow([^HAVE_RAW_ETH_EXP$])
+m4trace:configure.ac:65: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
You should run autoupdate.], [../../lib/autoconf/general.m4:2527: AC_TRY_LINK is expanded from...
-configure.ac:70: the top level])
-m4trace:configure.ac:73: -1- AM_CONDITIONAL([HAVE_XRCD], [test "x$HAVE_XRCD" = "xyes"])
-m4trace:configure.ac:73: -1- m4_pattern_allow([^HAVE_XRCD_TRUE$])
-m4trace:configure.ac:73: -1- m4_pattern_allow([^HAVE_XRCD_FALSE$])
-m4trace:configure.ac:73: -1- _AM_SUBST_NOTMAKE([HAVE_XRCD_TRUE])
-m4trace:configure.ac:73: -1- _AM_SUBST_NOTMAKE([HAVE_XRCD_FALSE])
-m4trace:configure.ac:75: -1- m4_pattern_allow([^HAVE_XRCD$])
-m4trace:configure.ac:78: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
+configure.ac:65: the top level])
+m4trace:configure.ac:68: -1- AM_CONDITIONAL([HAVE_RAW_ETH_REG], [test "x$HAVE_RAW_ETH_REG" = "xyes"])
+m4trace:configure.ac:68: -1- m4_pattern_allow([^HAVE_RAW_ETH_REG_TRUE$])
+m4trace:configure.ac:68: -1- m4_pattern_allow([^HAVE_RAW_ETH_REG_FALSE$])
+m4trace:configure.ac:68: -1- _AM_SUBST_NOTMAKE([HAVE_RAW_ETH_REG_TRUE])
+m4trace:configure.ac:68: -1- _AM_SUBST_NOTMAKE([HAVE_RAW_ETH_REG_FALSE])
+m4trace:configure.ac:70: -1- m4_pattern_allow([^HAVE_RAW_ETH_REG$])
+m4trace:configure.ac:73: -1- AM_CONDITIONAL([HAVE_RAW_ETH], [true])
+m4trace:configure.ac:73: -1- m4_pattern_allow([^HAVE_RAW_ETH_TRUE$])
+m4trace:configure.ac:73: -1- m4_pattern_allow([^HAVE_RAW_ETH_FALSE$])
+m4trace:configure.ac:73: -1- _AM_SUBST_NOTMAKE([HAVE_RAW_ETH_TRUE])
+m4trace:configure.ac:73: -1- _AM_SUBST_NOTMAKE([HAVE_RAW_ETH_FALSE])
+m4trace:configure.ac:75: -1- m4_pattern_allow([^HAVE_RAW_ETH$])
+m4trace:configure.ac:77: -1- AM_CONDITIONAL([HAVE_RAW_ETH], [false])
+m4trace:configure.ac:77: -1- m4_pattern_allow([^HAVE_RAW_ETH_TRUE$])
+m4trace:configure.ac:77: -1- m4_pattern_allow([^HAVE_RAW_ETH_FALSE$])
+m4trace:configure.ac:77: -1- _AM_SUBST_NOTMAKE([HAVE_RAW_ETH_TRUE])
+m4trace:configure.ac:77: -1- _AM_SUBST_NOTMAKE([HAVE_RAW_ETH_FALSE])
+m4trace:configure.ac:81: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
You should run autoupdate.], [../../lib/autoconf/general.m4:2527: AC_TRY_LINK is expanded from...
-configure.ac:78: the top level])
-m4trace:configure.ac:81: -1- AM_CONDITIONAL([HAVE_ENDIAN], [test "x$HAVE_ENDIAN" = "xyes"])
-m4trace:configure.ac:81: -1- m4_pattern_allow([^HAVE_ENDIAN_TRUE$])
-m4trace:configure.ac:81: -1- m4_pattern_allow([^HAVE_ENDIAN_FALSE$])
-m4trace:configure.ac:81: -1- _AM_SUBST_NOTMAKE([HAVE_ENDIAN_TRUE])
-m4trace:configure.ac:81: -1- _AM_SUBST_NOTMAKE([HAVE_ENDIAN_FALSE])
-m4trace:configure.ac:83: -1- m4_pattern_allow([^HAVE_ENDIAN$])
-m4trace:configure.ac:86: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
+configure.ac:81: the top level])
+m4trace:configure.ac:84: -1- AM_CONDITIONAL([HAVE_XRCD], [test "x$HAVE_XRCD" = "xyes"])
+m4trace:configure.ac:84: -1- m4_pattern_allow([^HAVE_XRCD_TRUE$])
+m4trace:configure.ac:84: -1- m4_pattern_allow([^HAVE_XRCD_FALSE$])
+m4trace:configure.ac:84: -1- _AM_SUBST_NOTMAKE([HAVE_XRCD_TRUE])
+m4trace:configure.ac:84: -1- _AM_SUBST_NOTMAKE([HAVE_XRCD_FALSE])
+m4trace:configure.ac:86: -1- m4_pattern_allow([^HAVE_XRCD$])
+m4trace:configure.ac:89: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
You should run autoupdate.], [../../lib/autoconf/general.m4:2527: AC_TRY_LINK is expanded from...
-configure.ac:86: the top level])
-m4trace:configure.ac:89: -1- AM_CONDITIONAL([HAVE_SCIF], [test "x$HAVE_SCIF" = "xyes"])
-m4trace:configure.ac:89: -1- m4_pattern_allow([^HAVE_SCIF_TRUE$])
-m4trace:configure.ac:89: -1- m4_pattern_allow([^HAVE_SCIF_FALSE$])
-m4trace:configure.ac:89: -1- _AM_SUBST_NOTMAKE([HAVE_SCIF_TRUE])
-m4trace:configure.ac:89: -1- _AM_SUBST_NOTMAKE([HAVE_SCIF_FALSE])
-m4trace:configure.ac:91: -1- m4_pattern_allow([^HAVE_SCIF$])
-m4trace:configure.ac:95: -1- AM_CONDITIONAL([HAVE_VERBS_EXP], [test "x$HAVE_VERBS_EXP" = "xyes"])
-m4trace:configure.ac:95: -1- m4_pattern_allow([^HAVE_VERBS_EXP_TRUE$])
-m4trace:configure.ac:95: -1- m4_pattern_allow([^HAVE_VERBS_EXP_FALSE$])
-m4trace:configure.ac:95: -1- _AM_SUBST_NOTMAKE([HAVE_VERBS_EXP_TRUE])
-m4trace:configure.ac:95: -1- _AM_SUBST_NOTMAKE([HAVE_VERBS_EXP_FALSE])
-m4trace:configure.ac:97: -1- m4_pattern_allow([^HAVE_VERBS_EXP$])
-m4trace:configure.ac:102: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
+configure.ac:89: the top level])
+m4trace:configure.ac:92: -1- AM_CONDITIONAL([HAVE_ENDIAN], [test "x$HAVE_ENDIAN" = "xyes"])
+m4trace:configure.ac:92: -1- m4_pattern_allow([^HAVE_ENDIAN_TRUE$])
+m4trace:configure.ac:92: -1- m4_pattern_allow([^HAVE_ENDIAN_FALSE$])
+m4trace:configure.ac:92: -1- _AM_SUBST_NOTMAKE([HAVE_ENDIAN_TRUE])
+m4trace:configure.ac:92: -1- _AM_SUBST_NOTMAKE([HAVE_ENDIAN_FALSE])
+m4trace:configure.ac:94: -1- m4_pattern_allow([^HAVE_ENDIAN$])
+m4trace:configure.ac:97: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
You should run autoupdate.], [../../lib/autoconf/general.m4:2527: AC_TRY_LINK is expanded from...
-configure.ac:102: the top level])
-m4trace:configure.ac:106: -1- AM_CONDITIONAL([HAVE_RSS_EXP], [test "x$HAVE_RSS_EXP" = "xyes"])
-m4trace:configure.ac:106: -1- m4_pattern_allow([^HAVE_RSS_EXP_TRUE$])
-m4trace:configure.ac:106: -1- m4_pattern_allow([^HAVE_RSS_EXP_FALSE$])
-m4trace:configure.ac:106: -1- _AM_SUBST_NOTMAKE([HAVE_RSS_EXP_TRUE])
-m4trace:configure.ac:106: -1- _AM_SUBST_NOTMAKE([HAVE_RSS_EXP_FALSE])
-m4trace:configure.ac:108: -1- m4_pattern_allow([^HAVE_RSS_EXP$])
-m4trace:configure.ac:111: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
+configure.ac:97: the top level])
+m4trace:configure.ac:100: -1- AM_CONDITIONAL([HAVE_SCIF], [test "x$HAVE_SCIF" = "xyes"])
+m4trace:configure.ac:100: -1- m4_pattern_allow([^HAVE_SCIF_TRUE$])
+m4trace:configure.ac:100: -1- m4_pattern_allow([^HAVE_SCIF_FALSE$])
+m4trace:configure.ac:100: -1- _AM_SUBST_NOTMAKE([HAVE_SCIF_TRUE])
+m4trace:configure.ac:100: -1- _AM_SUBST_NOTMAKE([HAVE_SCIF_FALSE])
+m4trace:configure.ac:102: -1- m4_pattern_allow([^HAVE_SCIF$])
+m4trace:configure.ac:106: -1- AM_CONDITIONAL([HAVE_VERBS_EXP], [test "x$HAVE_VERBS_EXP" = "xyes"])
+m4trace:configure.ac:106: -1- m4_pattern_allow([^HAVE_VERBS_EXP_TRUE$])
+m4trace:configure.ac:106: -1- m4_pattern_allow([^HAVE_VERBS_EXP_FALSE$])
+m4trace:configure.ac:106: -1- _AM_SUBST_NOTMAKE([HAVE_VERBS_EXP_TRUE])
+m4trace:configure.ac:106: -1- _AM_SUBST_NOTMAKE([HAVE_VERBS_EXP_FALSE])
+m4trace:configure.ac:108: -1- m4_pattern_allow([^HAVE_VERBS_EXP$])
+m4trace:configure.ac:113: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
You should run autoupdate.], [../../lib/autoconf/general.m4:2527: AC_TRY_LINK is expanded from...
-configure.ac:111: the top level])
-m4trace:configure.ac:115: -1- AM_CONDITIONAL([HAVE_DC], [test "x$HAVE_DC" = "xyes"])
-m4trace:configure.ac:115: -1- m4_pattern_allow([^HAVE_DC_TRUE$])
-m4trace:configure.ac:115: -1- m4_pattern_allow([^HAVE_DC_FALSE$])
-m4trace:configure.ac:115: -1- _AM_SUBST_NOTMAKE([HAVE_DC_TRUE])
-m4trace:configure.ac:115: -1- _AM_SUBST_NOTMAKE([HAVE_DC_FALSE])
-m4trace:configure.ac:117: -1- m4_pattern_allow([^HAVE_DC$])
-m4trace:configure.ac:121: -1- m4_pattern_allow([^HAVE_CUDA$])
-m4trace:configure.ac:122: -1- m4_pattern_allow([^CUDA_PATH$])
-m4trace:configure.ac:127: -1- m4_pattern_allow([^LIBUMAD$])
-m4trace:configure.ac:128: -1- m4_pattern_allow([^LIBMATH$])
-m4trace:configure.ac:130: -1- m4_pattern_allow([^LIB@&t at OBJS$])
-m4trace:configure.ac:130: -1- m4_pattern_allow([^LTLIBOBJS$])
-m4trace:configure.ac:130: -1- AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])
-m4trace:configure.ac:130: -1- m4_pattern_allow([^am__EXEEXT_TRUE$])
-m4trace:configure.ac:130: -1- m4_pattern_allow([^am__EXEEXT_FALSE$])
-m4trace:configure.ac:130: -1- _AM_SUBST_NOTMAKE([am__EXEEXT_TRUE])
-m4trace:configure.ac:130: -1- _AM_SUBST_NOTMAKE([am__EXEEXT_FALSE])
-m4trace:configure.ac:130: -1- _AC_AM_CONFIG_HEADER_HOOK(["$ac_file"])
-m4trace:configure.ac:130: -1- _AM_OUTPUT_DEPENDENCY_COMMANDS
-m4trace:configure.ac:130: -1- _LT_PROG_LTMAIN
+configure.ac:113: the top level])
+m4trace:configure.ac:117: -1- AM_CONDITIONAL([HAVE_MASKED_ATOMICS], [test "x$HAVE_MASKED_ATOMICS" = "xyes"])
+m4trace:configure.ac:117: -1- m4_pattern_allow([^HAVE_MASKED_ATOMICS_TRUE$])
+m4trace:configure.ac:117: -1- m4_pattern_allow([^HAVE_MASKED_ATOMICS_FALSE$])
+m4trace:configure.ac:117: -1- _AM_SUBST_NOTMAKE([HAVE_MASKED_ATOMICS_TRUE])
+m4trace:configure.ac:117: -1- _AM_SUBST_NOTMAKE([HAVE_MASKED_ATOMICS_FALSE])
+m4trace:configure.ac:119: -1- m4_pattern_allow([^HAVE_MASKED_ATOMICS$])
+m4trace:configure.ac:122: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
+You should run autoupdate.], [../../lib/autoconf/general.m4:2527: AC_TRY_LINK is expanded from...
+configure.ac:122: the top level])
+m4trace:configure.ac:126: -1- AM_CONDITIONAL([HAVE_RSS_EXP], [test "x$HAVE_RSS_EXP" = "xyes"])
+m4trace:configure.ac:126: -1- m4_pattern_allow([^HAVE_RSS_EXP_TRUE$])
+m4trace:configure.ac:126: -1- m4_pattern_allow([^HAVE_RSS_EXP_FALSE$])
+m4trace:configure.ac:126: -1- _AM_SUBST_NOTMAKE([HAVE_RSS_EXP_TRUE])
+m4trace:configure.ac:126: -1- _AM_SUBST_NOTMAKE([HAVE_RSS_EXP_FALSE])
+m4trace:configure.ac:128: -1- m4_pattern_allow([^HAVE_RSS_EXP$])
+m4trace:configure.ac:131: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
+You should run autoupdate.], [../../lib/autoconf/general.m4:2527: AC_TRY_LINK is expanded from...
+configure.ac:131: the top level])
+m4trace:configure.ac:135: -1- AM_CONDITIONAL([HAVE_DC], [test "x$HAVE_DC" = "xyes"])
+m4trace:configure.ac:135: -1- m4_pattern_allow([^HAVE_DC_TRUE$])
+m4trace:configure.ac:135: -1- m4_pattern_allow([^HAVE_DC_FALSE$])
+m4trace:configure.ac:135: -1- _AM_SUBST_NOTMAKE([HAVE_DC_TRUE])
+m4trace:configure.ac:135: -1- _AM_SUBST_NOTMAKE([HAVE_DC_FALSE])
+m4trace:configure.ac:137: -1- m4_pattern_allow([^HAVE_DC$])
+m4trace:configure.ac:141: -1- m4_pattern_allow([^HAVE_CUDA$])
+m4trace:configure.ac:142: -1- m4_pattern_allow([^CUDA_PATH$])
+m4trace:configure.ac:147: -1- m4_pattern_allow([^LIBUMAD$])
+m4trace:configure.ac:148: -1- m4_pattern_allow([^LIBMATH$])
+m4trace:configure.ac:150: -1- m4_pattern_allow([^LIB@&t at OBJS$])
+m4trace:configure.ac:150: -1- m4_pattern_allow([^LTLIBOBJS$])
+m4trace:configure.ac:150: -1- AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])
+m4trace:configure.ac:150: -1- m4_pattern_allow([^am__EXEEXT_TRUE$])
+m4trace:configure.ac:150: -1- m4_pattern_allow([^am__EXEEXT_FALSE$])
+m4trace:configure.ac:150: -1- _AM_SUBST_NOTMAKE([am__EXEEXT_TRUE])
+m4trace:configure.ac:150: -1- _AM_SUBST_NOTMAKE([am__EXEEXT_FALSE])
+m4trace:configure.ac:150: -1- _AC_AM_CONFIG_HEADER_HOOK(["$ac_file"])
+m4trace:configure.ac:150: -1- _AM_OUTPUT_DEPENDENCY_COMMANDS
+m4trace:configure.ac:150: -1- _LT_PROG_LTMAIN
diff --git a/autom4te.cache/traces.1 b/autom4te.cache/traces.1
index 4393f99..4eededc 100644
--- a/autom4te.cache/traces.1
+++ b/autom4te.cache/traces.1
@@ -1,4 +1,4 @@
-m4trace:configure.ac:14: -1- AC_INIT([perftest], [5.2], [linux-rdma at vger.kernel.org])
+m4trace:configure.ac:14: -1- AC_INIT([perftest], [5.33], [linux-rdma at vger.kernel.org])
m4trace:configure.ac:14: -1- m4_pattern_forbid([^_?A[CHUM]_])
m4trace:configure.ac:14: -1- m4_pattern_forbid([_AC_])
m4trace:configure.ac:14: -1- m4_pattern_forbid([^LIBOBJS$], [do not use LIBOBJS directly, use AC_LIBOBJ (see section `AC_LIBOBJ vs LIBOBJS'])
@@ -589,191 +589,223 @@ m4trace:configure.ac:43: -1- m4_pattern_allow([^HAVE_LIBRDMACM$])
m4trace:configure.ac:46: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
You should run autoupdate.], [../../lib/autoconf/general.m4:2527: AC_TRY_LINK is expanded from...
configure.ac:46: the top level])
-m4trace:configure.ac:49: -1- AM_CONDITIONAL([HAVE_RAW_ETH_EXP], [test "x$HAVE_RAW_ETH_EXP" = "xyes"])
-m4trace:configure.ac:49: -1- AC_SUBST([HAVE_RAW_ETH_EXP_TRUE])
-m4trace:configure.ac:49: -1- AC_SUBST_TRACE([HAVE_RAW_ETH_EXP_TRUE])
-m4trace:configure.ac:49: -1- m4_pattern_allow([^HAVE_RAW_ETH_EXP_TRUE$])
-m4trace:configure.ac:49: -1- AC_SUBST([HAVE_RAW_ETH_EXP_FALSE])
-m4trace:configure.ac:49: -1- AC_SUBST_TRACE([HAVE_RAW_ETH_EXP_FALSE])
-m4trace:configure.ac:49: -1- m4_pattern_allow([^HAVE_RAW_ETH_EXP_FALSE$])
-m4trace:configure.ac:49: -1- _AM_SUBST_NOTMAKE([HAVE_RAW_ETH_EXP_TRUE])
-m4trace:configure.ac:49: -1- _AM_SUBST_NOTMAKE([HAVE_RAW_ETH_EXP_FALSE])
-m4trace:configure.ac:51: -1- AC_DEFINE_TRACE_LITERAL([HAVE_RAW_ETH_EXP])
-m4trace:configure.ac:51: -1- m4_pattern_allow([^HAVE_RAW_ETH_EXP$])
-m4trace:configure.ac:51: -1- AH_OUTPUT([HAVE_RAW_ETH_EXP], [/* Enable RAW_ETH_TEST_EXP */
+m4trace:configure.ac:50: -1- AM_CONDITIONAL([HAVE_ODP], [test "x$HAVE_ODP" = "xyes"])
+m4trace:configure.ac:50: -1- AC_SUBST([HAVE_ODP_TRUE])
+m4trace:configure.ac:50: -1- AC_SUBST_TRACE([HAVE_ODP_TRUE])
+m4trace:configure.ac:50: -1- m4_pattern_allow([^HAVE_ODP_TRUE$])
+m4trace:configure.ac:50: -1- AC_SUBST([HAVE_ODP_FALSE])
+m4trace:configure.ac:50: -1- AC_SUBST_TRACE([HAVE_ODP_FALSE])
+m4trace:configure.ac:50: -1- m4_pattern_allow([^HAVE_ODP_FALSE$])
+m4trace:configure.ac:50: -1- _AM_SUBST_NOTMAKE([HAVE_ODP_TRUE])
+m4trace:configure.ac:50: -1- _AM_SUBST_NOTMAKE([HAVE_ODP_FALSE])
+m4trace:configure.ac:52: -1- AC_DEFINE_TRACE_LITERAL([HAVE_ODP])
+m4trace:configure.ac:52: -1- m4_pattern_allow([^HAVE_ODP$])
+m4trace:configure.ac:52: -1- AH_OUTPUT([HAVE_ODP], [/* Have ODP support */
+#undef HAVE_ODP])
+m4trace:configure.ac:57: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
+You should run autoupdate.], [../../lib/autoconf/general.m4:2527: AC_TRY_LINK is expanded from...
+configure.ac:57: the top level])
+m4trace:configure.ac:60: -1- AM_CONDITIONAL([HAVE_RAW_ETH_EXP], [test "x$HAVE_RAW_ETH_EXP" = "xyes"])
+m4trace:configure.ac:60: -1- AC_SUBST([HAVE_RAW_ETH_EXP_TRUE])
+m4trace:configure.ac:60: -1- AC_SUBST_TRACE([HAVE_RAW_ETH_EXP_TRUE])
+m4trace:configure.ac:60: -1- m4_pattern_allow([^HAVE_RAW_ETH_EXP_TRUE$])
+m4trace:configure.ac:60: -1- AC_SUBST([HAVE_RAW_ETH_EXP_FALSE])
+m4trace:configure.ac:60: -1- AC_SUBST_TRACE([HAVE_RAW_ETH_EXP_FALSE])
+m4trace:configure.ac:60: -1- m4_pattern_allow([^HAVE_RAW_ETH_EXP_FALSE$])
+m4trace:configure.ac:60: -1- _AM_SUBST_NOTMAKE([HAVE_RAW_ETH_EXP_TRUE])
+m4trace:configure.ac:60: -1- _AM_SUBST_NOTMAKE([HAVE_RAW_ETH_EXP_FALSE])
+m4trace:configure.ac:62: -1- AC_DEFINE_TRACE_LITERAL([HAVE_RAW_ETH_EXP])
+m4trace:configure.ac:62: -1- m4_pattern_allow([^HAVE_RAW_ETH_EXP$])
+m4trace:configure.ac:62: -1- AH_OUTPUT([HAVE_RAW_ETH_EXP], [/* Enable RAW_ETH_TEST_EXP */
#undef HAVE_RAW_ETH_EXP])
-m4trace:configure.ac:54: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
+m4trace:configure.ac:65: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
You should run autoupdate.], [../../lib/autoconf/general.m4:2527: AC_TRY_LINK is expanded from...
-configure.ac:54: the top level])
-m4trace:configure.ac:57: -1- AM_CONDITIONAL([HAVE_RAW_ETH_REG], [test "x$HAVE_RAW_ETH_REG" = "xyes"])
-m4trace:configure.ac:57: -1- AC_SUBST([HAVE_RAW_ETH_REG_TRUE])
-m4trace:configure.ac:57: -1- AC_SUBST_TRACE([HAVE_RAW_ETH_REG_TRUE])
-m4trace:configure.ac:57: -1- m4_pattern_allow([^HAVE_RAW_ETH_REG_TRUE$])
-m4trace:configure.ac:57: -1- AC_SUBST([HAVE_RAW_ETH_REG_FALSE])
-m4trace:configure.ac:57: -1- AC_SUBST_TRACE([HAVE_RAW_ETH_REG_FALSE])
-m4trace:configure.ac:57: -1- m4_pattern_allow([^HAVE_RAW_ETH_REG_FALSE$])
-m4trace:configure.ac:57: -1- _AM_SUBST_NOTMAKE([HAVE_RAW_ETH_REG_TRUE])
-m4trace:configure.ac:57: -1- _AM_SUBST_NOTMAKE([HAVE_RAW_ETH_REG_FALSE])
-m4trace:configure.ac:59: -1- AC_DEFINE_TRACE_LITERAL([HAVE_RAW_ETH_REG])
-m4trace:configure.ac:59: -1- m4_pattern_allow([^HAVE_RAW_ETH_REG$])
-m4trace:configure.ac:59: -1- AH_OUTPUT([HAVE_RAW_ETH_REG], [/* Enable RAW_ETH_TEST_REG */
+configure.ac:65: the top level])
+m4trace:configure.ac:68: -1- AM_CONDITIONAL([HAVE_RAW_ETH_REG], [test "x$HAVE_RAW_ETH_REG" = "xyes"])
+m4trace:configure.ac:68: -1- AC_SUBST([HAVE_RAW_ETH_REG_TRUE])
+m4trace:configure.ac:68: -1- AC_SUBST_TRACE([HAVE_RAW_ETH_REG_TRUE])
+m4trace:configure.ac:68: -1- m4_pattern_allow([^HAVE_RAW_ETH_REG_TRUE$])
+m4trace:configure.ac:68: -1- AC_SUBST([HAVE_RAW_ETH_REG_FALSE])
+m4trace:configure.ac:68: -1- AC_SUBST_TRACE([HAVE_RAW_ETH_REG_FALSE])
+m4trace:configure.ac:68: -1- m4_pattern_allow([^HAVE_RAW_ETH_REG_FALSE$])
+m4trace:configure.ac:68: -1- _AM_SUBST_NOTMAKE([HAVE_RAW_ETH_REG_TRUE])
+m4trace:configure.ac:68: -1- _AM_SUBST_NOTMAKE([HAVE_RAW_ETH_REG_FALSE])
+m4trace:configure.ac:70: -1- AC_DEFINE_TRACE_LITERAL([HAVE_RAW_ETH_REG])
+m4trace:configure.ac:70: -1- m4_pattern_allow([^HAVE_RAW_ETH_REG$])
+m4trace:configure.ac:70: -1- AH_OUTPUT([HAVE_RAW_ETH_REG], [/* Enable RAW_ETH_TEST_REG */
#undef HAVE_RAW_ETH_REG])
-m4trace:configure.ac:62: -1- AM_CONDITIONAL([HAVE_RAW_ETH], [true])
-m4trace:configure.ac:62: -1- AC_SUBST([HAVE_RAW_ETH_TRUE])
-m4trace:configure.ac:62: -1- AC_SUBST_TRACE([HAVE_RAW_ETH_TRUE])
-m4trace:configure.ac:62: -1- m4_pattern_allow([^HAVE_RAW_ETH_TRUE$])
-m4trace:configure.ac:62: -1- AC_SUBST([HAVE_RAW_ETH_FALSE])
-m4trace:configure.ac:62: -1- AC_SUBST_TRACE([HAVE_RAW_ETH_FALSE])
-m4trace:configure.ac:62: -1- m4_pattern_allow([^HAVE_RAW_ETH_FALSE$])
-m4trace:configure.ac:62: -1- _AM_SUBST_NOTMAKE([HAVE_RAW_ETH_TRUE])
-m4trace:configure.ac:62: -1- _AM_SUBST_NOTMAKE([HAVE_RAW_ETH_FALSE])
-m4trace:configure.ac:64: -1- AC_DEFINE_TRACE_LITERAL([HAVE_RAW_ETH])
-m4trace:configure.ac:64: -1- m4_pattern_allow([^HAVE_RAW_ETH$])
-m4trace:configure.ac:64: -1- AH_OUTPUT([HAVE_RAW_ETH], [/* Enable RAW_ETH_TEST */
+m4trace:configure.ac:73: -1- AM_CONDITIONAL([HAVE_RAW_ETH], [true])
+m4trace:configure.ac:73: -1- AC_SUBST([HAVE_RAW_ETH_TRUE])
+m4trace:configure.ac:73: -1- AC_SUBST_TRACE([HAVE_RAW_ETH_TRUE])
+m4trace:configure.ac:73: -1- m4_pattern_allow([^HAVE_RAW_ETH_TRUE$])
+m4trace:configure.ac:73: -1- AC_SUBST([HAVE_RAW_ETH_FALSE])
+m4trace:configure.ac:73: -1- AC_SUBST_TRACE([HAVE_RAW_ETH_FALSE])
+m4trace:configure.ac:73: -1- m4_pattern_allow([^HAVE_RAW_ETH_FALSE$])
+m4trace:configure.ac:73: -1- _AM_SUBST_NOTMAKE([HAVE_RAW_ETH_TRUE])
+m4trace:configure.ac:73: -1- _AM_SUBST_NOTMAKE([HAVE_RAW_ETH_FALSE])
+m4trace:configure.ac:75: -1- AC_DEFINE_TRACE_LITERAL([HAVE_RAW_ETH])
+m4trace:configure.ac:75: -1- m4_pattern_allow([^HAVE_RAW_ETH$])
+m4trace:configure.ac:75: -1- AH_OUTPUT([HAVE_RAW_ETH], [/* Enable RAW_ETH_TEST */
#undef HAVE_RAW_ETH])
-m4trace:configure.ac:66: -1- AM_CONDITIONAL([HAVE_RAW_ETH], [false])
-m4trace:configure.ac:66: -1- AC_SUBST([HAVE_RAW_ETH_TRUE])
-m4trace:configure.ac:66: -1- AC_SUBST_TRACE([HAVE_RAW_ETH_TRUE])
-m4trace:configure.ac:66: -1- m4_pattern_allow([^HAVE_RAW_ETH_TRUE$])
-m4trace:configure.ac:66: -1- AC_SUBST([HAVE_RAW_ETH_FALSE])
-m4trace:configure.ac:66: -1- AC_SUBST_TRACE([HAVE_RAW_ETH_FALSE])
-m4trace:configure.ac:66: -1- m4_pattern_allow([^HAVE_RAW_ETH_FALSE$])
-m4trace:configure.ac:66: -1- _AM_SUBST_NOTMAKE([HAVE_RAW_ETH_TRUE])
-m4trace:configure.ac:66: -1- _AM_SUBST_NOTMAKE([HAVE_RAW_ETH_FALSE])
-m4trace:configure.ac:70: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
+m4trace:configure.ac:77: -1- AM_CONDITIONAL([HAVE_RAW_ETH], [false])
+m4trace:configure.ac:77: -1- AC_SUBST([HAVE_RAW_ETH_TRUE])
+m4trace:configure.ac:77: -1- AC_SUBST_TRACE([HAVE_RAW_ETH_TRUE])
+m4trace:configure.ac:77: -1- m4_pattern_allow([^HAVE_RAW_ETH_TRUE$])
+m4trace:configure.ac:77: -1- AC_SUBST([HAVE_RAW_ETH_FALSE])
+m4trace:configure.ac:77: -1- AC_SUBST_TRACE([HAVE_RAW_ETH_FALSE])
+m4trace:configure.ac:77: -1- m4_pattern_allow([^HAVE_RAW_ETH_FALSE$])
+m4trace:configure.ac:77: -1- _AM_SUBST_NOTMAKE([HAVE_RAW_ETH_TRUE])
+m4trace:configure.ac:77: -1- _AM_SUBST_NOTMAKE([HAVE_RAW_ETH_FALSE])
+m4trace:configure.ac:81: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
You should run autoupdate.], [../../lib/autoconf/general.m4:2527: AC_TRY_LINK is expanded from...
-configure.ac:70: the top level])
-m4trace:configure.ac:73: -1- AM_CONDITIONAL([HAVE_XRCD], [test "x$HAVE_XRCD" = "xyes"])
-m4trace:configure.ac:73: -1- AC_SUBST([HAVE_XRCD_TRUE])
-m4trace:configure.ac:73: -1- AC_SUBST_TRACE([HAVE_XRCD_TRUE])
-m4trace:configure.ac:73: -1- m4_pattern_allow([^HAVE_XRCD_TRUE$])
-m4trace:configure.ac:73: -1- AC_SUBST([HAVE_XRCD_FALSE])
-m4trace:configure.ac:73: -1- AC_SUBST_TRACE([HAVE_XRCD_FALSE])
-m4trace:configure.ac:73: -1- m4_pattern_allow([^HAVE_XRCD_FALSE$])
-m4trace:configure.ac:73: -1- _AM_SUBST_NOTMAKE([HAVE_XRCD_TRUE])
-m4trace:configure.ac:73: -1- _AM_SUBST_NOTMAKE([HAVE_XRCD_FALSE])
-m4trace:configure.ac:75: -1- AC_DEFINE_TRACE_LITERAL([HAVE_XRCD])
-m4trace:configure.ac:75: -1- m4_pattern_allow([^HAVE_XRCD$])
-m4trace:configure.ac:75: -1- AH_OUTPUT([HAVE_XRCD], [/* Enable XRCD feature */
+configure.ac:81: the top level])
+m4trace:configure.ac:84: -1- AM_CONDITIONAL([HAVE_XRCD], [test "x$HAVE_XRCD" = "xyes"])
+m4trace:configure.ac:84: -1- AC_SUBST([HAVE_XRCD_TRUE])
+m4trace:configure.ac:84: -1- AC_SUBST_TRACE([HAVE_XRCD_TRUE])
+m4trace:configure.ac:84: -1- m4_pattern_allow([^HAVE_XRCD_TRUE$])
+m4trace:configure.ac:84: -1- AC_SUBST([HAVE_XRCD_FALSE])
+m4trace:configure.ac:84: -1- AC_SUBST_TRACE([HAVE_XRCD_FALSE])
+m4trace:configure.ac:84: -1- m4_pattern_allow([^HAVE_XRCD_FALSE$])
+m4trace:configure.ac:84: -1- _AM_SUBST_NOTMAKE([HAVE_XRCD_TRUE])
+m4trace:configure.ac:84: -1- _AM_SUBST_NOTMAKE([HAVE_XRCD_FALSE])
+m4trace:configure.ac:86: -1- AC_DEFINE_TRACE_LITERAL([HAVE_XRCD])
+m4trace:configure.ac:86: -1- m4_pattern_allow([^HAVE_XRCD$])
+m4trace:configure.ac:86: -1- AH_OUTPUT([HAVE_XRCD], [/* Enable XRCD feature */
#undef HAVE_XRCD])
-m4trace:configure.ac:78: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
+m4trace:configure.ac:89: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
You should run autoupdate.], [../../lib/autoconf/general.m4:2527: AC_TRY_LINK is expanded from...
-configure.ac:78: the top level])
-m4trace:configure.ac:81: -1- AM_CONDITIONAL([HAVE_ENDIAN], [test "x$HAVE_ENDIAN" = "xyes"])
-m4trace:configure.ac:81: -1- AC_SUBST([HAVE_ENDIAN_TRUE])
-m4trace:configure.ac:81: -1- AC_SUBST_TRACE([HAVE_ENDIAN_TRUE])
-m4trace:configure.ac:81: -1- m4_pattern_allow([^HAVE_ENDIAN_TRUE$])
-m4trace:configure.ac:81: -1- AC_SUBST([HAVE_ENDIAN_FALSE])
-m4trace:configure.ac:81: -1- AC_SUBST_TRACE([HAVE_ENDIAN_FALSE])
-m4trace:configure.ac:81: -1- m4_pattern_allow([^HAVE_ENDIAN_FALSE$])
-m4trace:configure.ac:81: -1- _AM_SUBST_NOTMAKE([HAVE_ENDIAN_TRUE])
-m4trace:configure.ac:81: -1- _AM_SUBST_NOTMAKE([HAVE_ENDIAN_FALSE])
-m4trace:configure.ac:83: -1- AC_DEFINE_TRACE_LITERAL([HAVE_ENDIAN])
-m4trace:configure.ac:83: -1- m4_pattern_allow([^HAVE_ENDIAN$])
-m4trace:configure.ac:83: -1- AH_OUTPUT([HAVE_ENDIAN], [/* Enable endian conversion */
+configure.ac:89: the top level])
+m4trace:configure.ac:92: -1- AM_CONDITIONAL([HAVE_ENDIAN], [test "x$HAVE_ENDIAN" = "xyes"])
+m4trace:configure.ac:92: -1- AC_SUBST([HAVE_ENDIAN_TRUE])
+m4trace:configure.ac:92: -1- AC_SUBST_TRACE([HAVE_ENDIAN_TRUE])
+m4trace:configure.ac:92: -1- m4_pattern_allow([^HAVE_ENDIAN_TRUE$])
+m4trace:configure.ac:92: -1- AC_SUBST([HAVE_ENDIAN_FALSE])
+m4trace:configure.ac:92: -1- AC_SUBST_TRACE([HAVE_ENDIAN_FALSE])
+m4trace:configure.ac:92: -1- m4_pattern_allow([^HAVE_ENDIAN_FALSE$])
+m4trace:configure.ac:92: -1- _AM_SUBST_NOTMAKE([HAVE_ENDIAN_TRUE])
+m4trace:configure.ac:92: -1- _AM_SUBST_NOTMAKE([HAVE_ENDIAN_FALSE])
+m4trace:configure.ac:94: -1- AC_DEFINE_TRACE_LITERAL([HAVE_ENDIAN])
+m4trace:configure.ac:94: -1- m4_pattern_allow([^HAVE_ENDIAN$])
+m4trace:configure.ac:94: -1- AH_OUTPUT([HAVE_ENDIAN], [/* Enable endian conversion */
#undef HAVE_ENDIAN])
-m4trace:configure.ac:86: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
+m4trace:configure.ac:97: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
You should run autoupdate.], [../../lib/autoconf/general.m4:2527: AC_TRY_LINK is expanded from...
-configure.ac:86: the top level])
-m4trace:configure.ac:89: -1- AM_CONDITIONAL([HAVE_SCIF], [test "x$HAVE_SCIF" = "xyes"])
-m4trace:configure.ac:89: -1- AC_SUBST([HAVE_SCIF_TRUE])
-m4trace:configure.ac:89: -1- AC_SUBST_TRACE([HAVE_SCIF_TRUE])
-m4trace:configure.ac:89: -1- m4_pattern_allow([^HAVE_SCIF_TRUE$])
-m4trace:configure.ac:89: -1- AC_SUBST([HAVE_SCIF_FALSE])
-m4trace:configure.ac:89: -1- AC_SUBST_TRACE([HAVE_SCIF_FALSE])
-m4trace:configure.ac:89: -1- m4_pattern_allow([^HAVE_SCIF_FALSE$])
-m4trace:configure.ac:89: -1- _AM_SUBST_NOTMAKE([HAVE_SCIF_TRUE])
-m4trace:configure.ac:89: -1- _AM_SUBST_NOTMAKE([HAVE_SCIF_FALSE])
-m4trace:configure.ac:91: -1- AC_DEFINE_TRACE_LITERAL([HAVE_SCIF])
-m4trace:configure.ac:91: -1- m4_pattern_allow([^HAVE_SCIF$])
-m4trace:configure.ac:91: -1- AH_OUTPUT([HAVE_SCIF], [/* Enable SCIF link Layer */
+configure.ac:97: the top level])
+m4trace:configure.ac:100: -1- AM_CONDITIONAL([HAVE_SCIF], [test "x$HAVE_SCIF" = "xyes"])
+m4trace:configure.ac:100: -1- AC_SUBST([HAVE_SCIF_TRUE])
+m4trace:configure.ac:100: -1- AC_SUBST_TRACE([HAVE_SCIF_TRUE])
+m4trace:configure.ac:100: -1- m4_pattern_allow([^HAVE_SCIF_TRUE$])
+m4trace:configure.ac:100: -1- AC_SUBST([HAVE_SCIF_FALSE])
+m4trace:configure.ac:100: -1- AC_SUBST_TRACE([HAVE_SCIF_FALSE])
+m4trace:configure.ac:100: -1- m4_pattern_allow([^HAVE_SCIF_FALSE$])
+m4trace:configure.ac:100: -1- _AM_SUBST_NOTMAKE([HAVE_SCIF_TRUE])
+m4trace:configure.ac:100: -1- _AM_SUBST_NOTMAKE([HAVE_SCIF_FALSE])
+m4trace:configure.ac:102: -1- AC_DEFINE_TRACE_LITERAL([HAVE_SCIF])
+m4trace:configure.ac:102: -1- m4_pattern_allow([^HAVE_SCIF$])
+m4trace:configure.ac:102: -1- AH_OUTPUT([HAVE_SCIF], [/* Enable SCIF link Layer */
#undef HAVE_SCIF])
-m4trace:configure.ac:94: -1- AH_OUTPUT([HAVE_INFINIBAND_VERBS_EXP_H], [/* Define to 1 if you have the <infiniband/verbs_exp.h> header file. */
+m4trace:configure.ac:105: -1- AH_OUTPUT([HAVE_INFINIBAND_VERBS_EXP_H], [/* Define to 1 if you have the <infiniband/verbs_exp.h> header file. */
#undef HAVE_INFINIBAND_VERBS_EXP_H])
-m4trace:configure.ac:95: -1- AM_CONDITIONAL([HAVE_VERBS_EXP], [test "x$HAVE_VERBS_EXP" = "xyes"])
-m4trace:configure.ac:95: -1- AC_SUBST([HAVE_VERBS_EXP_TRUE])
-m4trace:configure.ac:95: -1- AC_SUBST_TRACE([HAVE_VERBS_EXP_TRUE])
-m4trace:configure.ac:95: -1- m4_pattern_allow([^HAVE_VERBS_EXP_TRUE$])
-m4trace:configure.ac:95: -1- AC_SUBST([HAVE_VERBS_EXP_FALSE])
-m4trace:configure.ac:95: -1- AC_SUBST_TRACE([HAVE_VERBS_EXP_FALSE])
-m4trace:configure.ac:95: -1- m4_pattern_allow([^HAVE_VERBS_EXP_FALSE$])
-m4trace:configure.ac:95: -1- _AM_SUBST_NOTMAKE([HAVE_VERBS_EXP_TRUE])
-m4trace:configure.ac:95: -1- _AM_SUBST_NOTMAKE([HAVE_VERBS_EXP_FALSE])
-m4trace:configure.ac:97: -1- AC_DEFINE_TRACE_LITERAL([HAVE_VERBS_EXP])
-m4trace:configure.ac:97: -1- m4_pattern_allow([^HAVE_VERBS_EXP$])
-m4trace:configure.ac:97: -1- AH_OUTPUT([HAVE_VERBS_EXP], [/* Have verbs_exp header */
+m4trace:configure.ac:106: -1- AM_CONDITIONAL([HAVE_VERBS_EXP], [test "x$HAVE_VERBS_EXP" = "xyes"])
+m4trace:configure.ac:106: -1- AC_SUBST([HAVE_VERBS_EXP_TRUE])
+m4trace:configure.ac:106: -1- AC_SUBST_TRACE([HAVE_VERBS_EXP_TRUE])
+m4trace:configure.ac:106: -1- m4_pattern_allow([^HAVE_VERBS_EXP_TRUE$])
+m4trace:configure.ac:106: -1- AC_SUBST([HAVE_VERBS_EXP_FALSE])
+m4trace:configure.ac:106: -1- AC_SUBST_TRACE([HAVE_VERBS_EXP_FALSE])
+m4trace:configure.ac:106: -1- m4_pattern_allow([^HAVE_VERBS_EXP_FALSE$])
+m4trace:configure.ac:106: -1- _AM_SUBST_NOTMAKE([HAVE_VERBS_EXP_TRUE])
+m4trace:configure.ac:106: -1- _AM_SUBST_NOTMAKE([HAVE_VERBS_EXP_FALSE])
+m4trace:configure.ac:108: -1- AC_DEFINE_TRACE_LITERAL([HAVE_VERBS_EXP])
+m4trace:configure.ac:108: -1- m4_pattern_allow([^HAVE_VERBS_EXP$])
+m4trace:configure.ac:108: -1- AH_OUTPUT([HAVE_VERBS_EXP], [/* Have verbs_exp header */
#undef HAVE_VERBS_EXP])
-m4trace:configure.ac:102: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
+m4trace:configure.ac:113: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
+You should run autoupdate.], [../../lib/autoconf/general.m4:2527: AC_TRY_LINK is expanded from...
+configure.ac:113: the top level])
+m4trace:configure.ac:117: -1- AM_CONDITIONAL([HAVE_MASKED_ATOMICS], [test "x$HAVE_MASKED_ATOMICS" = "xyes"])
+m4trace:configure.ac:117: -1- AC_SUBST([HAVE_MASKED_ATOMICS_TRUE])
+m4trace:configure.ac:117: -1- AC_SUBST_TRACE([HAVE_MASKED_ATOMICS_TRUE])
+m4trace:configure.ac:117: -1- m4_pattern_allow([^HAVE_MASKED_ATOMICS_TRUE$])
+m4trace:configure.ac:117: -1- AC_SUBST([HAVE_MASKED_ATOMICS_FALSE])
+m4trace:configure.ac:117: -1- AC_SUBST_TRACE([HAVE_MASKED_ATOMICS_FALSE])
+m4trace:configure.ac:117: -1- m4_pattern_allow([^HAVE_MASKED_ATOMICS_FALSE$])
+m4trace:configure.ac:117: -1- _AM_SUBST_NOTMAKE([HAVE_MASKED_ATOMICS_TRUE])
+m4trace:configure.ac:117: -1- _AM_SUBST_NOTMAKE([HAVE_MASKED_ATOMICS_FALSE])
+m4trace:configure.ac:119: -1- AC_DEFINE_TRACE_LITERAL([HAVE_MASKED_ATOMICS])
+m4trace:configure.ac:119: -1- m4_pattern_allow([^HAVE_MASKED_ATOMICS$])
+m4trace:configure.ac:119: -1- AH_OUTPUT([HAVE_MASKED_ATOMICS], [/* Have MASKED ATOMICS in verbs_exp header */
+#undef HAVE_MASKED_ATOMICS])
+m4trace:configure.ac:122: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
You should run autoupdate.], [../../lib/autoconf/general.m4:2527: AC_TRY_LINK is expanded from...
-configure.ac:102: the top level])
-m4trace:configure.ac:106: -1- AM_CONDITIONAL([HAVE_RSS_EXP], [test "x$HAVE_RSS_EXP" = "xyes"])
-m4trace:configure.ac:106: -1- AC_SUBST([HAVE_RSS_EXP_TRUE])
-m4trace:configure.ac:106: -1- AC_SUBST_TRACE([HAVE_RSS_EXP_TRUE])
-m4trace:configure.ac:106: -1- m4_pattern_allow([^HAVE_RSS_EXP_TRUE$])
-m4trace:configure.ac:106: -1- AC_SUBST([HAVE_RSS_EXP_FALSE])
-m4trace:configure.ac:106: -1- AC_SUBST_TRACE([HAVE_RSS_EXP_FALSE])
-m4trace:configure.ac:106: -1- m4_pattern_allow([^HAVE_RSS_EXP_FALSE$])
-m4trace:configure.ac:106: -1- _AM_SUBST_NOTMAKE([HAVE_RSS_EXP_TRUE])
-m4trace:configure.ac:106: -1- _AM_SUBST_NOTMAKE([HAVE_RSS_EXP_FALSE])
-m4trace:configure.ac:108: -1- AC_DEFINE_TRACE_LITERAL([HAVE_RSS_EXP])
-m4trace:configure.ac:108: -1- m4_pattern_allow([^HAVE_RSS_EXP$])
-m4trace:configure.ac:108: -1- AH_OUTPUT([HAVE_RSS_EXP], [/* Have RSS in verbs_exp header */
+configure.ac:122: the top level])
+m4trace:configure.ac:126: -1- AM_CONDITIONAL([HAVE_RSS_EXP], [test "x$HAVE_RSS_EXP" = "xyes"])
+m4trace:configure.ac:126: -1- AC_SUBST([HAVE_RSS_EXP_TRUE])
+m4trace:configure.ac:126: -1- AC_SUBST_TRACE([HAVE_RSS_EXP_TRUE])
+m4trace:configure.ac:126: -1- m4_pattern_allow([^HAVE_RSS_EXP_TRUE$])
+m4trace:configure.ac:126: -1- AC_SUBST([HAVE_RSS_EXP_FALSE])
+m4trace:configure.ac:126: -1- AC_SUBST_TRACE([HAVE_RSS_EXP_FALSE])
+m4trace:configure.ac:126: -1- m4_pattern_allow([^HAVE_RSS_EXP_FALSE$])
+m4trace:configure.ac:126: -1- _AM_SUBST_NOTMAKE([HAVE_RSS_EXP_TRUE])
+m4trace:configure.ac:126: -1- _AM_SUBST_NOTMAKE([HAVE_RSS_EXP_FALSE])
+m4trace:configure.ac:128: -1- AC_DEFINE_TRACE_LITERAL([HAVE_RSS_EXP])
+m4trace:configure.ac:128: -1- m4_pattern_allow([^HAVE_RSS_EXP$])
+m4trace:configure.ac:128: -1- AH_OUTPUT([HAVE_RSS_EXP], [/* Have RSS in verbs_exp header */
#undef HAVE_RSS_EXP])
-m4trace:configure.ac:111: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
+m4trace:configure.ac:131: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
You should run autoupdate.], [../../lib/autoconf/general.m4:2527: AC_TRY_LINK is expanded from...
-configure.ac:111: the top level])
-m4trace:configure.ac:115: -1- AM_CONDITIONAL([HAVE_DC], [test "x$HAVE_DC" = "xyes"])
-m4trace:configure.ac:115: -1- AC_SUBST([HAVE_DC_TRUE])
-m4trace:configure.ac:115: -1- AC_SUBST_TRACE([HAVE_DC_TRUE])
-m4trace:configure.ac:115: -1- m4_pattern_allow([^HAVE_DC_TRUE$])
-m4trace:configure.ac:115: -1- AC_SUBST([HAVE_DC_FALSE])
-m4trace:configure.ac:115: -1- AC_SUBST_TRACE([HAVE_DC_FALSE])
-m4trace:configure.ac:115: -1- m4_pattern_allow([^HAVE_DC_FALSE$])
-m4trace:configure.ac:115: -1- _AM_SUBST_NOTMAKE([HAVE_DC_TRUE])
-m4trace:configure.ac:115: -1- _AM_SUBST_NOTMAKE([HAVE_DC_FALSE])
-m4trace:configure.ac:117: -1- AC_DEFINE_TRACE_LITERAL([HAVE_DC])
-m4trace:configure.ac:117: -1- m4_pattern_allow([^HAVE_DC$])
-m4trace:configure.ac:117: -1- AH_OUTPUT([HAVE_DC], [/* Enable DC feature */
+configure.ac:131: the top level])
+m4trace:configure.ac:135: -1- AM_CONDITIONAL([HAVE_DC], [test "x$HAVE_DC" = "xyes"])
+m4trace:configure.ac:135: -1- AC_SUBST([HAVE_DC_TRUE])
+m4trace:configure.ac:135: -1- AC_SUBST_TRACE([HAVE_DC_TRUE])
+m4trace:configure.ac:135: -1- m4_pattern_allow([^HAVE_DC_TRUE$])
+m4trace:configure.ac:135: -1- AC_SUBST([HAVE_DC_FALSE])
+m4trace:configure.ac:135: -1- AC_SUBST_TRACE([HAVE_DC_FALSE])
+m4trace:configure.ac:135: -1- m4_pattern_allow([^HAVE_DC_FALSE$])
+m4trace:configure.ac:135: -1- _AM_SUBST_NOTMAKE([HAVE_DC_TRUE])
+m4trace:configure.ac:135: -1- _AM_SUBST_NOTMAKE([HAVE_DC_FALSE])
+m4trace:configure.ac:137: -1- AC_DEFINE_TRACE_LITERAL([HAVE_DC])
+m4trace:configure.ac:137: -1- m4_pattern_allow([^HAVE_DC$])
+m4trace:configure.ac:137: -1- AH_OUTPUT([HAVE_DC], [/* Enable DC feature */
#undef HAVE_DC])
-m4trace:configure.ac:121: -1- AC_DEFINE_TRACE_LITERAL([HAVE_CUDA])
-m4trace:configure.ac:121: -1- m4_pattern_allow([^HAVE_CUDA$])
-m4trace:configure.ac:121: -1- AH_OUTPUT([HAVE_CUDA], [/* Enable CUDA feature */
+m4trace:configure.ac:141: -1- AC_DEFINE_TRACE_LITERAL([HAVE_CUDA])
+m4trace:configure.ac:141: -1- m4_pattern_allow([^HAVE_CUDA$])
+m4trace:configure.ac:141: -1- AH_OUTPUT([HAVE_CUDA], [/* Enable CUDA feature */
#undef HAVE_CUDA])
-m4trace:configure.ac:122: -1- AC_DEFINE_TRACE_LITERAL([CUDA_PATH])
-m4trace:configure.ac:122: -1- m4_pattern_allow([^CUDA_PATH$])
-m4trace:configure.ac:122: -1- AH_OUTPUT([CUDA_PATH], [/* Enable CUDA feature */
+m4trace:configure.ac:142: -1- AC_DEFINE_TRACE_LITERAL([CUDA_PATH])
+m4trace:configure.ac:142: -1- m4_pattern_allow([^CUDA_PATH$])
+m4trace:configure.ac:142: -1- AH_OUTPUT([CUDA_PATH], [/* Enable CUDA feature */
#undef CUDA_PATH])
-m4trace:configure.ac:127: -1- AC_SUBST([LIBUMAD])
-m4trace:configure.ac:127: -1- AC_SUBST_TRACE([LIBUMAD])
-m4trace:configure.ac:127: -1- m4_pattern_allow([^LIBUMAD$])
-m4trace:configure.ac:128: -1- AC_SUBST([LIBMATH])
-m4trace:configure.ac:128: -1- AC_SUBST_TRACE([LIBMATH])
-m4trace:configure.ac:128: -1- m4_pattern_allow([^LIBMATH$])
-m4trace:configure.ac:129: -1- AC_CONFIG_FILES([Makefile])
-m4trace:configure.ac:130: -1- AC_SUBST([LIB@&t at OBJS], [$ac_libobjs])
-m4trace:configure.ac:130: -1- AC_SUBST_TRACE([LIB@&t at OBJS])
-m4trace:configure.ac:130: -1- m4_pattern_allow([^LIB@&t at OBJS$])
-m4trace:configure.ac:130: -1- AC_SUBST([LTLIBOBJS], [$ac_ltlibobjs])
-m4trace:configure.ac:130: -1- AC_SUBST_TRACE([LTLIBOBJS])
-m4trace:configure.ac:130: -1- m4_pattern_allow([^LTLIBOBJS$])
-m4trace:configure.ac:130: -1- AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])
-m4trace:configure.ac:130: -1- AC_SUBST([am__EXEEXT_TRUE])
-m4trace:configure.ac:130: -1- AC_SUBST_TRACE([am__EXEEXT_TRUE])
-m4trace:configure.ac:130: -1- m4_pattern_allow([^am__EXEEXT_TRUE$])
-m4trace:configure.ac:130: -1- AC_SUBST([am__EXEEXT_FALSE])
-m4trace:configure.ac:130: -1- AC_SUBST_TRACE([am__EXEEXT_FALSE])
-m4trace:configure.ac:130: -1- m4_pattern_allow([^am__EXEEXT_FALSE$])
-m4trace:configure.ac:130: -1- _AM_SUBST_NOTMAKE([am__EXEEXT_TRUE])
-m4trace:configure.ac:130: -1- _AM_SUBST_NOTMAKE([am__EXEEXT_FALSE])
-m4trace:configure.ac:130: -1- AC_SUBST_TRACE([top_builddir])
-m4trace:configure.ac:130: -1- AC_SUBST_TRACE([top_build_prefix])
-m4trace:configure.ac:130: -1- AC_SUBST_TRACE([srcdir])
-m4trace:configure.ac:130: -1- AC_SUBST_TRACE([abs_srcdir])
-m4trace:configure.ac:130: -1- AC_SUBST_TRACE([top_srcdir])
-m4trace:configure.ac:130: -1- AC_SUBST_TRACE([abs_top_srcdir])
-m4trace:configure.ac:130: -1- AC_SUBST_TRACE([builddir])
-m4trace:configure.ac:130: -1- AC_SUBST_TRACE([abs_builddir])
-m4trace:configure.ac:130: -1- AC_SUBST_TRACE([abs_top_builddir])
-m4trace:configure.ac:130: -1- AC_SUBST_TRACE([INSTALL])
-m4trace:configure.ac:130: -1- AC_SUBST_TRACE([MKDIR_P])
-m4trace:configure.ac:130: -1- AC_REQUIRE_AUX_FILE([ltmain.sh])
+m4trace:configure.ac:147: -1- AC_SUBST([LIBUMAD])
+m4trace:configure.ac:147: -1- AC_SUBST_TRACE([LIBUMAD])
+m4trace:configure.ac:147: -1- m4_pattern_allow([^LIBUMAD$])
+m4trace:configure.ac:148: -1- AC_SUBST([LIBMATH])
+m4trace:configure.ac:148: -1- AC_SUBST_TRACE([LIBMATH])
+m4trace:configure.ac:148: -1- m4_pattern_allow([^LIBMATH$])
+m4trace:configure.ac:149: -1- AC_CONFIG_FILES([Makefile])
+m4trace:configure.ac:150: -1- AC_SUBST([LIB@&t at OBJS], [$ac_libobjs])
+m4trace:configure.ac:150: -1- AC_SUBST_TRACE([LIB@&t at OBJS])
+m4trace:configure.ac:150: -1- m4_pattern_allow([^LIB@&t at OBJS$])
+m4trace:configure.ac:150: -1- AC_SUBST([LTLIBOBJS], [$ac_ltlibobjs])
+m4trace:configure.ac:150: -1- AC_SUBST_TRACE([LTLIBOBJS])
+m4trace:configure.ac:150: -1- m4_pattern_allow([^LTLIBOBJS$])
+m4trace:configure.ac:150: -1- AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])
+m4trace:configure.ac:150: -1- AC_SUBST([am__EXEEXT_TRUE])
+m4trace:configure.ac:150: -1- AC_SUBST_TRACE([am__EXEEXT_TRUE])
+m4trace:configure.ac:150: -1- m4_pattern_allow([^am__EXEEXT_TRUE$])
+m4trace:configure.ac:150: -1- AC_SUBST([am__EXEEXT_FALSE])
+m4trace:configure.ac:150: -1- AC_SUBST_TRACE([am__EXEEXT_FALSE])
+m4trace:configure.ac:150: -1- m4_pattern_allow([^am__EXEEXT_FALSE$])
+m4trace:configure.ac:150: -1- _AM_SUBST_NOTMAKE([am__EXEEXT_TRUE])
+m4trace:configure.ac:150: -1- _AM_SUBST_NOTMAKE([am__EXEEXT_FALSE])
+m4trace:configure.ac:150: -1- AC_SUBST_TRACE([top_builddir])
+m4trace:configure.ac:150: -1- AC_SUBST_TRACE([top_build_prefix])
+m4trace:configure.ac:150: -1- AC_SUBST_TRACE([srcdir])
+m4trace:configure.ac:150: -1- AC_SUBST_TRACE([abs_srcdir])
+m4trace:configure.ac:150: -1- AC_SUBST_TRACE([top_srcdir])
+m4trace:configure.ac:150: -1- AC_SUBST_TRACE([abs_top_srcdir])
+m4trace:configure.ac:150: -1- AC_SUBST_TRACE([builddir])
+m4trace:configure.ac:150: -1- AC_SUBST_TRACE([abs_builddir])
+m4trace:configure.ac:150: -1- AC_SUBST_TRACE([abs_top_builddir])
+m4trace:configure.ac:150: -1- AC_SUBST_TRACE([INSTALL])
+m4trace:configure.ac:150: -1- AC_SUBST_TRACE([MKDIR_P])
+m4trace:configure.ac:150: -1- AC_REQUIRE_AUX_FILE([ltmain.sh])
diff --git a/config.h.in b/config.h.in
index 41646c4..15c938b 100644
--- a/config.h.in
+++ b/config.h.in
@@ -30,9 +30,15 @@
/* Define to 1 if you have the `rdmacm' library (-lrdmacm). */
#undef HAVE_LIBRDMACM
+/* Have MASKED ATOMICS in verbs_exp header */
+#undef HAVE_MASKED_ATOMICS
+
/* Define to 1 if you have the <memory.h> header file. */
#undef HAVE_MEMORY_H
+/* Have ODP support */
+#undef HAVE_ODP
+
/* Enable RAW_ETH_TEST */
#undef HAVE_RAW_ETH
diff --git a/configure b/configure
index 07f4544..b774fcc 100755
--- a/configure
+++ b/configure
@@ -1,6 +1,6 @@
#! /bin/sh
# Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.63 for perftest 5.2.
+# Generated by GNU Autoconf 2.63 for perftest 5.33.
#
# Report bugs to <linux-rdma at vger.kernel.org>.
#
@@ -745,8 +745,8 @@ SHELL=${CONFIG_SHELL-/bin/sh}
# Identity of this package.
PACKAGE_NAME='perftest'
PACKAGE_TARNAME='perftest'
-PACKAGE_VERSION='5.2'
-PACKAGE_STRING='perftest 5.2'
+PACKAGE_VERSION='5.33'
+PACKAGE_STRING='perftest 5.33'
PACKAGE_BUGREPORT='linux-rdma at vger.kernel.org'
# Factoring default headers for most tests.
@@ -795,6 +795,8 @@ HAVE_DC_FALSE
HAVE_DC_TRUE
HAVE_RSS_EXP_FALSE
HAVE_RSS_EXP_TRUE
+HAVE_MASKED_ATOMICS_FALSE
+HAVE_MASKED_ATOMICS_TRUE
HAVE_VERBS_EXP_FALSE
HAVE_VERBS_EXP_TRUE
HAVE_SCIF_FALSE
@@ -809,6 +811,8 @@ HAVE_RAW_ETH_REG_FALSE
HAVE_RAW_ETH_REG_TRUE
HAVE_RAW_ETH_EXP_FALSE
HAVE_RAW_ETH_EXP_TRUE
+HAVE_ODP_FALSE
+HAVE_ODP_TRUE
CXXCPP
CPP
OTOOL64
@@ -1511,7 +1515,7 @@ if test "$ac_init_help" = "long"; then
# Omit some internal or obsolete options to make the list less imposing.
# This message is too long to be a string in the A/UX 3.1 sh.
cat <<_ACEOF
-\`configure' configures perftest 5.2 to adapt to many kinds of systems.
+\`configure' configures perftest 5.33 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]...
@@ -1581,7 +1585,7 @@ fi
if test -n "$ac_init_help"; then
case $ac_init_help in
- short | recursive ) echo "Configuration of perftest 5.2:";;
+ short | recursive ) echo "Configuration of perftest 5.33:";;
esac
cat <<\_ACEOF
@@ -1689,7 +1693,7 @@ fi
test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then
cat <<\_ACEOF
-perftest configure 5.2
+perftest configure 5.33
generated by GNU Autoconf 2.63
Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
@@ -1703,7 +1707,7 @@ cat >config.log <<_ACEOF
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.
-It was created by perftest $as_me 5.2, which was
+It was created by perftest $as_me 5.33, which was
generated by GNU Autoconf 2.63. Invocation command line was
$ $0 $@
@@ -2555,7 +2559,7 @@ fi
# Define the identity of the package.
PACKAGE='perftest'
- VERSION='5.2'
+ VERSION='5.33'
cat >>confdefs.h <<_ACEOF
@@ -5176,13 +5180,13 @@ if test "${lt_cv_nm_interface+set}" = set; then
else
lt_cv_nm_interface="BSD nm"
echo "int some_variable = 0;" > conftest.$ac_ext
- (eval echo "\"\$as_me:5179: $ac_compile\"" >&5)
+ (eval echo "\"\$as_me:5183: $ac_compile\"" >&5)
(eval "$ac_compile" 2>conftest.err)
cat conftest.err >&5
- (eval echo "\"\$as_me:5182: $NM \\\"conftest.$ac_objext\\\"\"" >&5)
+ (eval echo "\"\$as_me:5186: $NM \\\"conftest.$ac_objext\\\"\"" >&5)
(eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out)
cat conftest.err >&5
- (eval echo "\"\$as_me:5185: output\"" >&5)
+ (eval echo "\"\$as_me:5189: output\"" >&5)
cat conftest.out >&5
if $GREP 'External.*some_variable' conftest.out > /dev/null; then
lt_cv_nm_interface="MS dumpbin"
@@ -6388,7 +6392,7 @@ ia64-*-hpux*)
;;
*-*-irix6*)
# Find out which ABI we are using.
- echo '#line 6391 "configure"' > conftest.$ac_ext
+ echo '#line 6395 "configure"' > conftest.$ac_ext
if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
@@ -8979,11 +8983,11 @@ else
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-e 's:$: $lt_compiler_flag:'`
- (eval echo "\"\$as_me:8982: $lt_compile\"" >&5)
+ (eval echo "\"\$as_me:8986: $lt_compile\"" >&5)
(eval "$lt_compile" 2>conftest.err)
ac_status=$?
cat conftest.err >&5
- echo "$as_me:8986: \$? = $ac_status" >&5
+ echo "$as_me:8990: \$? = $ac_status" >&5
if (exit $ac_status) && test -s "$ac_outfile"; then
# The compiler can only warn and ignore the option if not recognized
# So say no if there are warnings other than the usual output.
@@ -9318,11 +9322,11 @@ else
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-e 's:$: $lt_compiler_flag:'`
- (eval echo "\"\$as_me:9321: $lt_compile\"" >&5)
+ (eval echo "\"\$as_me:9325: $lt_compile\"" >&5)
(eval "$lt_compile" 2>conftest.err)
ac_status=$?
cat conftest.err >&5
- echo "$as_me:9325: \$? = $ac_status" >&5
+ echo "$as_me:9329: \$? = $ac_status" >&5
if (exit $ac_status) && test -s "$ac_outfile"; then
# The compiler can only warn and ignore the option if not recognized
# So say no if there are warnings other than the usual output.
@@ -9423,11 +9427,11 @@ else
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-e 's:$: $lt_compiler_flag:'`
- (eval echo "\"\$as_me:9426: $lt_compile\"" >&5)
+ (eval echo "\"\$as_me:9430: $lt_compile\"" >&5)
(eval "$lt_compile" 2>out/conftest.err)
ac_status=$?
cat out/conftest.err >&5
- echo "$as_me:9430: \$? = $ac_status" >&5
+ echo "$as_me:9434: \$? = $ac_status" >&5
if (exit $ac_status) && test -s out/conftest2.$ac_objext
then
# The compiler can only warn and ignore the option if not recognized
@@ -9478,11 +9482,11 @@ else
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-e 's:$: $lt_compiler_flag:'`
- (eval echo "\"\$as_me:9481: $lt_compile\"" >&5)
+ (eval echo "\"\$as_me:9485: $lt_compile\"" >&5)
(eval "$lt_compile" 2>out/conftest.err)
ac_status=$?
cat out/conftest.err >&5
- echo "$as_me:9485: \$? = $ac_status" >&5
+ echo "$as_me:9489: \$? = $ac_status" >&5
if (exit $ac_status) && test -s out/conftest2.$ac_objext
then
# The compiler can only warn and ignore the option if not recognized
@@ -12281,7 +12285,7 @@ else
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
lt_status=$lt_dlunknown
cat > conftest.$ac_ext <<_LT_EOF
-#line 12284 "configure"
+#line 12288 "configure"
#include "confdefs.h"
#if HAVE_DLFCN_H
@@ -12377,7 +12381,7 @@ else
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
lt_status=$lt_dlunknown
cat > conftest.$ac_ext <<_LT_EOF
-#line 12380 "configure"
+#line 12384 "configure"
#include "confdefs.h"
#if HAVE_DLFCN_H
@@ -14397,11 +14401,11 @@ else
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-e 's:$: $lt_compiler_flag:'`
- (eval echo "\"\$as_me:14400: $lt_compile\"" >&5)
+ (eval echo "\"\$as_me:14404: $lt_compile\"" >&5)
(eval "$lt_compile" 2>conftest.err)
ac_status=$?
cat conftest.err >&5
- echo "$as_me:14404: \$? = $ac_status" >&5
+ echo "$as_me:14408: \$? = $ac_status" >&5
if (exit $ac_status) && test -s "$ac_outfile"; then
# The compiler can only warn and ignore the option if not recognized
# So say no if there are warnings other than the usual output.
@@ -14496,11 +14500,11 @@ else
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-e 's:$: $lt_compiler_flag:'`
- (eval echo "\"\$as_me:14499: $lt_compile\"" >&5)
+ (eval echo "\"\$as_me:14503: $lt_compile\"" >&5)
(eval "$lt_compile" 2>out/conftest.err)
ac_status=$?
cat out/conftest.err >&5
- echo "$as_me:14503: \$? = $ac_status" >&5
+ echo "$as_me:14507: \$? = $ac_status" >&5
if (exit $ac_status) && test -s out/conftest2.$ac_objext
then
# The compiler can only warn and ignore the option if not recognized
@@ -14548,11 +14552,11 @@ else
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-e 's:$: $lt_compiler_flag:'`
- (eval echo "\"\$as_me:14551: $lt_compile\"" >&5)
+ (eval echo "\"\$as_me:14555: $lt_compile\"" >&5)
(eval "$lt_compile" 2>out/conftest.err)
ac_status=$?
cat out/conftest.err >&5
- echo "$as_me:14555: \$? = $ac_status" >&5
+ echo "$as_me:14559: \$? = $ac_status" >&5
if (exit $ac_status) && test -s out/conftest2.$ac_objext
then
# The compiler can only warn and ignore the option if not recognized
@@ -16178,6 +16182,73 @@ _ACEOF
cat confdefs.h >>conftest.$ac_ext
cat >>conftest.$ac_ext <<_ACEOF
/* end confdefs.h. */
+
+#include <infiniband/verbs.h>
+#include <infiniband/verbs_exp.h>
+int
+main ()
+{
+int x = IBV_EXP_ACCESS_ON_DEMAND;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext && {
+ test "$cross_compiling" = yes ||
+ $as_test_x conftest$ac_exeext
+ }; then
+ HAVE_ODP=yes
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ HAVE_ODP=no
+fi
+
+rm -rf conftest.dSYM
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+ conftest$ac_exeext conftest.$ac_ext
+ if test "x$HAVE_ODP" = "xyes"; then
+ HAVE_ODP_TRUE=
+ HAVE_ODP_FALSE='#'
+else
+ HAVE_ODP_TRUE='#'
+ HAVE_ODP_FALSE=
+fi
+
+if test $HAVE_ODP = yes && test $HAVE_ODP = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_ODP 1
+_ACEOF
+
+fi
+
+
+
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
#include <infiniband/verbs.h>
int
main ()
@@ -16612,6 +16683,71 @@ cat >>conftest.$ac_ext <<_ACEOF
int
main ()
{
+int x = IBV_EXP_DEVICE_ATTR_EXT_ATOMIC_ARGS;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+ (eval "$ac_link") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext && {
+ test "$cross_compiling" = yes ||
+ $as_test_x conftest$ac_exeext
+ }; then
+ HAVE_MASKED_ATOMICS=yes
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ HAVE_MASKED_ATOMICS=no
+fi
+
+rm -rf conftest.dSYM
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+ conftest$ac_exeext conftest.$ac_ext
+ if test "x$HAVE_MASKED_ATOMICS" = "xyes"; then
+ HAVE_MASKED_ATOMICS_TRUE=
+ HAVE_MASKED_ATOMICS_FALSE='#'
+else
+ HAVE_MASKED_ATOMICS_TRUE='#'
+ HAVE_MASKED_ATOMICS_FALSE=
+fi
+
+if test $HAVE_MASKED_ATOMICS = yes && test $HAVE_VERBS_EXP = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_MASKED_ATOMICS 1
+_ACEOF
+
+fi
+
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+#include <infiniband/verbs.h>
+#include <infiniband/verbs_exp.h>
+int
+main ()
+{
int x = IBV_EXP_DEVICE_ATTR_RSS_TBL_SZ;
;
return 0;
@@ -16744,7 +16880,7 @@ _ACEOF
LIBS=$LIBS" -lcuda"
fi
-
+CFLAGS="-g -Wall -D_GNU_SOURCE -O3"
ac_config_files="$ac_config_files Makefile"
@@ -16889,6 +17025,13 @@ $as_echo "$as_me: error: conditional \"am__fastdepCXX\" was never defined.
Usually this means the macro was only invoked conditionally." >&2;}
{ (exit 1); exit 1; }; }
fi
+if test -z "${HAVE_ODP_TRUE}" && test -z "${HAVE_ODP_FALSE}"; then
+ { { $as_echo "$as_me:$LINENO: error: conditional \"HAVE_ODP\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+$as_echo "$as_me: error: conditional \"HAVE_ODP\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
if test -z "${HAVE_RAW_ETH_EXP_TRUE}" && test -z "${HAVE_RAW_ETH_EXP_FALSE}"; then
{ { $as_echo "$as_me:$LINENO: error: conditional \"HAVE_RAW_ETH_EXP\" was never defined.
Usually this means the macro was only invoked conditionally." >&5
@@ -16945,6 +17088,13 @@ $as_echo "$as_me: error: conditional \"HAVE_VERBS_EXP\" was never defined.
Usually this means the macro was only invoked conditionally." >&2;}
{ (exit 1); exit 1; }; }
fi
+if test -z "${HAVE_MASKED_ATOMICS_TRUE}" && test -z "${HAVE_MASKED_ATOMICS_FALSE}"; then
+ { { $as_echo "$as_me:$LINENO: error: conditional \"HAVE_MASKED_ATOMICS\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+$as_echo "$as_me: error: conditional \"HAVE_MASKED_ATOMICS\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
if test -z "${HAVE_RSS_EXP_TRUE}" && test -z "${HAVE_RSS_EXP_FALSE}"; then
{ { $as_echo "$as_me:$LINENO: error: conditional \"HAVE_RSS_EXP\" was never defined.
Usually this means the macro was only invoked conditionally." >&5
@@ -17281,7 +17431,7 @@ exec 6>&1
# report actual input values of CONFIG_FILES etc. instead of their
# values after options handling.
ac_log="
-This file was extended by perftest $as_me 5.2, which was
+This file was extended by perftest $as_me 5.33, which was
generated by GNU Autoconf 2.63. Invocation command line was
CONFIG_FILES = $CONFIG_FILES
@@ -17344,7 +17494,7 @@ Report bugs to <bug-autoconf at gnu.org>."
_ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_cs_version="\\
-perftest config.status 5.2
+perftest config.status 5.33
configured by $0, generated by GNU Autoconf 2.63,
with options \\"`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\"
diff --git a/configure.ac b/configure.ac
index 1ebf059..ed24067 100755
--- a/configure.ac
+++ b/configure.ac
@@ -11,7 +11,7 @@
# $HEADER$
dnl Process this file with autoconf to produce a configure script.
-AC_INIT([perftest],[5.2],[linux-rdma at vger.kernel.org])
+AC_INIT([perftest],[5.33],[linux-rdma at vger.kernel.org])
AC_CONFIG_HEADERS([config.h])
AC_CONFIG_AUX_DIR([config])
AC_CONFIG_MACRO_DIR([m4])
@@ -43,6 +43,17 @@ AC_CHECK_LIB([ibverbs], [ibv_get_device_list], [], [AC_MSG_ERROR([libibverbs not
AC_CHECK_LIB([rdmacm], [rdma_create_event_channel], [], AC_MSG_ERROR([librdmacm-devel not found]))
AC_CHECK_LIB([ibumad], [umad_init], [LIBUMAD=-libumad], AC_MSG_ERROR([libibumad not found]))
AC_CHECK_LIB([m], [log], [LIBMATH=-lm], AC_MSG_ERROR([libm not found]))
+AC_TRY_LINK([
+#include <infiniband/verbs.h>
+#include <infiniband/verbs_exp.h>],
+ [int x = IBV_EXP_ACCESS_ON_DEMAND;],[HAVE_ODP=yes], [HAVE_ODP=no])
+AM_CONDITIONAL([HAVE_ODP],[test "x$HAVE_ODP" = "xyes"])
+if [test $HAVE_ODP = yes] && [test $HAVE_ODP = yes]; then
+ AC_DEFINE([HAVE_ODP], [1], [Have ODP support])
+fi
+
+
+
AC_TRY_LINK([#include <infiniband/verbs.h>],
[struct ibv_exp_flow *t = ibv_exp_create_flow(NULL,NULL);],[HAVE_RAW_ETH_EXP=yes], [HAVE_RAW_ETH_EXP=no])
@@ -102,6 +113,15 @@ fi
AC_TRY_LINK([
#include <infiniband/verbs.h>
#include <infiniband/verbs_exp.h>],
+ [int x = IBV_EXP_DEVICE_ATTR_EXT_ATOMIC_ARGS;],[HAVE_MASKED_ATOMICS=yes], [HAVE_MASKED_ATOMICS=no])
+AM_CONDITIONAL([HAVE_MASKED_ATOMICS],[test "x$HAVE_MASKED_ATOMICS" = "xyes"])
+if [test $HAVE_MASKED_ATOMICS = yes] && [test $HAVE_VERBS_EXP = yes]; then
+ AC_DEFINE([HAVE_MASKED_ATOMICS], [1], [Have MASKED ATOMICS in verbs_exp header])
+fi
+
+AC_TRY_LINK([
+#include <infiniband/verbs.h>
+#include <infiniband/verbs_exp.h>],
[int x = IBV_EXP_DEVICE_ATTR_RSS_TBL_SZ;],[HAVE_RSS_EXP=yes], [HAVE_RSS_EXP=no])
AM_CONDITIONAL([HAVE_RSS_EXP],[test "x$HAVE_RSS_EXP" = "xyes"])
if [test $HAVE_RSS_EXP = yes] && [test $HAVE_VERBS_EXP = yes]; then
@@ -123,7 +143,7 @@ if [test "$CUDA_H_PATH" ]; then
LIBS=$LIBS" -lcuda"
fi
-
+CFLAGS="-g -Wall -D_GNU_SOURCE -O3"
AC_SUBST([LIBUMAD])
AC_SUBST([LIBMATH])
AC_CONFIG_FILES([Makefile])
diff --git a/perftest.spec b/perftest.spec
index acf0912..84ce57c 100644
--- a/perftest.spec
+++ b/perftest.spec
@@ -1,10 +1,10 @@
Name: perftest
Summary: IB Performance tests
-Version: 2.2
-Release: 0.19.g1fec59d
+Version: 2.3
+Release: 0.12.gcb5b746
License: BSD 3-Clause, GPL v2 or later
Group: Productivity/Networking/Diagnostic
-Source: http://www.openfabrics.org/downloads/perftest-2.2-0.19.g1fec59d.tar.gz
+Source: http://www.openfabrics.org/downloads/perftest-2.3-0.12.gcb5b746.tar.gz
Url: http://www.openfabrics.org
BuildRoot: %{_tmppath}/%{name}-%{version}-build
BuildRequires: libibverbs-devel librdmacm-devel libibumad-devel
diff --git a/src/atomic_bw.c b/src/atomic_bw.c
index 2246c29..3e1c493 100755
--- a/src/atomic_bw.c
+++ b/src/atomic_bw.c
@@ -87,6 +87,12 @@ int main(int argc, char *argv[]) {
return 1;
}
+ if (ib_dev_name(ctx.context) == CONNECTIB)
+ {
+ user_param.masked_atomics = 1;
+ user_param.use_exp = 1;
+ }
+
// See if MTU and link type are valid and supported.
if (check_link(ctx.context,&user_param)) {
fprintf(stderr, " Couldn't get context for the device\n");
@@ -113,6 +119,8 @@ int main(int argc, char *argv[]) {
exchange_versions(&user_comm, &user_param);
+ check_sys_data(&user_comm, &user_param);
+
// See if MTU and link type are valid and supported.
if (check_mtu(ctx.context,&user_param, &user_comm)) {
fprintf(stderr, " Couldn't get context for the device\n");
@@ -180,6 +188,16 @@ int main(int argc, char *argv[]) {
ctx_print_pingpong_data(&rem_dest[i],&user_comm);
}
+ if (user_param.work_rdma_cm == OFF)
+ {
+ if (ctx_check_gid_compatibility(&my_dest[0], &rem_dest[0]))
+ {
+ fprintf(stderr,"\n Found Incompatibility issue with GID types.\n");
+ fprintf(stderr," Please Try to use a different IP version.\n\n");
+ return 1;
+ }
+ }
+
if (user_param.work_rdma_cm == OFF) {
if (ctx_connect(&ctx,rem_dest,&user_param,my_dest)) {
@@ -208,7 +226,7 @@ int main(int argc, char *argv[]) {
return FAILURE;
}
- xchg_bw_reports(&user_comm, &my_bw_rep,&rem_bw_rep);
+ xchg_bw_reports(&user_comm, &my_bw_rep,&rem_bw_rep,atof(user_param.rem_version));
print_full_bw_report(&user_param, &rem_bw_rep, NULL);
if (user_param.output == FULL_VERBOSITY) {
@@ -258,7 +276,7 @@ int main(int argc, char *argv[]) {
print_report_bw(&user_param,&my_bw_rep);
if (user_param.duplex) {
- xchg_bw_reports(&user_comm, &my_bw_rep,&rem_bw_rep);
+ xchg_bw_reports(&user_comm, &my_bw_rep,&rem_bw_rep,atof(user_param.rem_version));
print_full_bw_report(&user_param, &my_bw_rep, &rem_bw_rep);
}
@@ -296,7 +314,7 @@ int main(int argc, char *argv[]) {
return FAILURE;
}
- xchg_bw_reports(&user_comm, &my_bw_rep,&rem_bw_rep);
+ xchg_bw_reports(&user_comm, &my_bw_rep,&rem_bw_rep,atof(user_param.rem_version));
}
if (ctx_close_connection(&user_comm,&my_dest[0],&rem_dest[0])) {
diff --git a/src/atomic_lat.c b/src/atomic_lat.c
index e0930a1..a6525ff 100755
--- a/src/atomic_lat.c
+++ b/src/atomic_lat.c
@@ -97,6 +97,12 @@ int main(int argc, char *argv[]) {
return 1;
}
+ if (ib_dev_name(ctx.context) == CONNECTIB)
+ {
+ user_param.masked_atomics = 1;
+ user_param.use_exp = 1;
+ }
+
// See if MTU and link type are valid and supported.
if (check_link(ctx.context,&user_param)) {
fprintf(stderr, " Couldn't get context for the device\n");
@@ -123,6 +129,8 @@ int main(int argc, char *argv[]) {
exchange_versions(&user_comm, &user_param);
+ check_sys_data(&user_comm, &user_param);
+
// See if MTU and link type are valid and supported.
if (check_mtu(ctx.context,&user_param, &user_comm)) {
fprintf(stderr, " Couldn't get context for the device\n");
@@ -196,6 +204,16 @@ int main(int argc, char *argv[]) {
ctx_print_pingpong_data(&rem_dest[i],&user_comm);
}
+ if (user_param.work_rdma_cm == OFF)
+ {
+ if (ctx_check_gid_compatibility(&my_dest[0], &rem_dest[0]))
+ {
+ fprintf(stderr,"\n Found Incompatibility issue with GID types.\n");
+ fprintf(stderr," Please Try to use a different IP version.\n\n");
+ return 1;
+ }
+ }
+
if (user_param.work_rdma_cm == OFF) {
if (ctx_connect(&ctx,rem_dest,&user_param,my_dest)) {
diff --git a/src/get_clock.c b/src/get_clock.c
old mode 100644
new mode 100755
index fefa17a..40a220f
--- a/src/get_clock.c
+++ b/src/get_clock.c
@@ -173,6 +173,7 @@ static double proc_get_cpu_mhz(int no_cpu_freq_fail)
if (no_cpu_freq_fail) {
fprintf(stderr, "Test integrity may be harmed !\n");
}else{
+ fclose(f);
return 0.0;
}
continue;
@@ -206,6 +207,8 @@ double get_cpu_mhz(int no_cpu_freq_fail)
fprintf(stderr, "Warning: measured timestamp frequency "
"%g differs from nominal %g MHz\n",
sample, proc);
+ if (!no_cpu_freq_fail)
+ fprintf(stderr, " Add --CPU-freq flag to show report\n");
#endif
return sample;
}
diff --git a/src/perftest_communication.c b/src/perftest_communication.c
index e990770..503e7ed 100755
--- a/src/perftest_communication.c
+++ b/src/perftest_communication.c
@@ -21,6 +21,11 @@
static const char *sideArray[] = {"local", "remote"};
static const char *gidArray[] = {"GID" , "MGID"};
+static inline int valid_mtu_size(int mtu_size)
+{
+ return !(mtu_size < IBV_MTU_256 || mtu_size > IBV_MTU_4096);
+}
+
static inline int ipv6_addr_v4mapped(const struct in6_addr *a)
{
return ((a->s6_addr32[0] | a->s6_addr32[1]) |
@@ -182,12 +187,10 @@ static int create_ah_from_wc_recv(struct pingpong_context *ctx,
static int ethernet_write_keys(struct pingpong_dest *my_dest,
struct perftest_comm *comm) {
- if (comm->rdma_params->gid_index == -1) {
+ if (my_dest->gid_index == -1) {
char msg[KEY_MSG_SIZE];
-
-
sprintf(msg,KEY_PRINT_FMT,my_dest->lid,my_dest->out_reads,
my_dest->qpn,my_dest->psn, my_dest->rkey, my_dest->vaddr, my_dest->srqn);
@@ -228,7 +231,7 @@ static int ethernet_write_keys(struct pingpong_dest *my_dest,
static int ethernet_read_keys(struct pingpong_dest *rem_dest,
struct perftest_comm *comm) {
- if (comm->rdma_params->gid_index == -1) {
+ if (rem_dest->gid_index == -1) {
int parsed;
char msg[KEY_MSG_SIZE];
@@ -251,7 +254,7 @@ static int ethernet_read_keys(struct pingpong_dest *rem_dest,
char msg[KEY_MSG_SIZE_GID];
char *pstr = msg, *term;
- char tmp[20];
+ char tmp[120];
int i;
if (read(comm->rdma_params->sockfd, msg, sizeof msg) != sizeof msg) {
@@ -342,6 +345,8 @@ static int rdma_write_keys(struct pingpong_dest *my_dest,
m_my_dest.qpn = htobe32(my_dest->qpn);
m_my_dest.psn = htobe32(my_dest->psn);
m_my_dest.rkey = htobe32(my_dest->rkey);
+ m_my_dest.srqn = htobe32(my_dest->srqn);
+ m_my_dest.gid_index = htobe32(my_dest->gid_index);
m_my_dest.vaddr = htobe64(my_dest->vaddr);
for(i=0; i<16; i++) {
@@ -611,13 +616,15 @@ int set_up_connection(struct pingpong_context *ctx,
// are for ib_port1 and the second half are for ib_port2
if (i % num_of_qps < num_of_qps_per_port) {
my_dest[i].lid = ctx_get_local_lid(ctx->context,user_param->ib_port);
-
+ my_dest[i].gid_index = user_param->gid_index;
} else {
my_dest[i].lid = ctx_get_local_lid(ctx->context,user_param->ib_port2);
+ my_dest[i].gid_index = user_param->gid_index2;
}
// single-port case
} else {
my_dest[i].lid = ctx_get_local_lid(ctx->context,user_param->ib_port);
+ my_dest[i].gid_index = user_param->gid_index;
}
my_dest[i].qpn = ctx->qp[i]->qp_num;
@@ -626,7 +633,7 @@ int set_up_connection(struct pingpong_context *ctx,
// Each qp gives his receive buffer address .
my_dest[i].out_reads = user_param->out_reads;
- my_dest[i].vaddr = (uintptr_t)ctx->buf + (user_param->num_of_qps + i)*BUFF_SIZE(ctx->size);
+ my_dest[i].vaddr = (uintptr_t)ctx->buf + (user_param->num_of_qps + i)*BUFF_SIZE(ctx->size,ctx->cycle_buffer);
if (user_param->dualport==ON) {
@@ -640,6 +647,7 @@ int set_up_connection(struct pingpong_context *ctx,
} else
memcpy(my_dest[i].gid.raw,temp_gid.raw ,16);
+/*
// We do not fail test upon lid above RoCE.
if ( (user_param->gid_index < 0) || ((user_param->gid_index2 < 0) && (user_param->dualport == ON)) ){
if (!my_dest[i].lid) {
@@ -647,6 +655,7 @@ int set_up_connection(struct pingpong_context *ctx,
return -1;
}
}
+*/
}
#ifdef HAVE_XRCD
@@ -994,6 +1003,7 @@ int create_comm_struct(struct perftest_comm *comm,
comm->rdma_params->port = user_param->port;
comm->rdma_params->sockfd = -1;
comm->rdma_params->gid_index = user_param->gid_index;
+ comm->rdma_params->gid_index2 = user_param->gid_index2;
comm->rdma_params->use_rdma_cm = user_param->use_rdma_cm;
comm->rdma_params->servername = user_param->servername;
comm->rdma_params->machine = user_param->machine;
@@ -1004,7 +1014,8 @@ int create_comm_struct(struct perftest_comm *comm,
comm->rdma_params->tos = DEF_TOS;
comm->rdma_params->use_xrc = user_param->use_xrc;
comm->rdma_params->connection_type = user_param->connection_type;
- comm->rdma_params->output = user_param->output;
+ comm->rdma_params->output = user_param->output;
+ comm->rdma_params->report_per_port = user_param->report_per_port;
if (user_param->use_rdma_cm) {
@@ -1020,7 +1031,7 @@ int create_comm_struct(struct perftest_comm *comm,
comm->rdma_ctx->context = NULL;
ALLOCATE(comm->rdma_ctx->qp,struct ibv_qp*,comm->rdma_params->num_of_qps);
- comm->rdma_ctx->buff_size = cycle_buffer;
+ comm->rdma_ctx->buff_size = user_param->cycle_buffer;
if (create_rdma_resources(comm->rdma_ctx,comm->rdma_params)) {
fprintf(stderr," Unable to create the resources needed by comm struct\n");
@@ -1088,12 +1099,12 @@ int ctx_hand_shake(struct perftest_comm *comm,
}
+ rem_dest->gid_index = my_dest->gid_index;
if (comm->rdma_params->servername) {
if ((*write_func_ptr)(my_dest,comm)) {
fprintf(stderr," Unable to write to socket/rdam_cm\n");
return 1;
}
-
if ((*read_func_ptr)(rem_dest,comm)) {
fprintf(stderr," Unable to read from socket/rdam_cm\n");
return 1;
@@ -1106,14 +1117,13 @@ int ctx_hand_shake(struct perftest_comm *comm,
fprintf(stderr," Unable to read to socket/rdam_cm\n");
return 1;
}
-
if ((*write_func_ptr)(my_dest,comm)) {
fprintf(stderr," Unable to write from socket/rdam_cm\n");
return 1;
}
}
- return 0;
+ return 0;
}
@@ -1305,22 +1315,35 @@ int ctx_xchg_data( struct perftest_comm *comm,
*
******************************************************************************/
void xchg_bw_reports (struct perftest_comm *comm, struct bw_report_data *my_bw_rep,
- struct bw_report_data *rem_bw_rep) {
+ struct bw_report_data *rem_bw_rep, float remote_version) {
struct bw_report_data temp;
+ int size;
temp.size = hton_long(my_bw_rep->size);
- temp.iters = hton_int(my_bw_rep->iters);
+
+ if ( remote_version >= 5.33 )
+ temp.iters = hton_long(my_bw_rep->iters);
+ else
+ temp.iters = hton_int(my_bw_rep->iters);
+
temp.bw_peak = hton_double(my_bw_rep->bw_peak);
temp.bw_avg = hton_double(my_bw_rep->bw_avg);
+ temp.bw_avg_p1 = hton_double(my_bw_rep->bw_avg_p1);
+ temp.bw_avg_p2 = hton_double(my_bw_rep->bw_avg_p2);
temp.msgRate_avg = hton_double(my_bw_rep->msgRate_avg);
+ temp.msgRate_avg_p1 = hton_double(my_bw_rep->msgRate_avg_p1);
+ temp.msgRate_avg_p2 = hton_double(my_bw_rep->msgRate_avg_p2);
/*******************Exchange Reports*******************/
if (ctx_xchg_data(comm, (void*) (&temp.size), (void*) (&rem_bw_rep->size), sizeof(unsigned long))) {
fprintf(stderr," Failed to exchange data between server and clients\n");
exit(1);
}
- if (ctx_xchg_data(comm, (void*) (&temp.iters), (void*) (&rem_bw_rep->iters), sizeof(int))) {
+
+ size = (remote_version >= 5.33) ? sizeof(uint64_t) : sizeof(int);
+
+ if (ctx_xchg_data(comm, (void*) (&temp.iters), (void*) (&rem_bw_rep->iters), size)) {
fprintf(stderr," Failed to exchange data between server and clients\n");
exit(1);
}
@@ -1337,11 +1360,42 @@ void xchg_bw_reports (struct perftest_comm *comm, struct bw_report_data *my_bw_r
exit(1);
}
+ //exchange data for report per port feature. should keep compatibility
+ if (comm->rdma_params->report_per_port)
+ {
+ if (ctx_xchg_data(comm, (void*) (&temp.bw_avg_p1), (void*) (&rem_bw_rep->bw_avg_p1), sizeof(double))) {
+ fprintf(stderr," Failed to exchange data between server and clients\n");
+ exit(1);
+ }
+ if (ctx_xchg_data(comm, (void*) (&temp.msgRate_avg_p1), (void*) (&rem_bw_rep->msgRate_avg_p1), sizeof(double))) {
+ fprintf(stderr," Failed to exchange data between server and clients\n");
+ exit(1);
+ }
+ if (ctx_xchg_data(comm, (void*) (&temp.bw_avg_p2), (void*) (&rem_bw_rep->bw_avg_p2), sizeof(double))) {
+ fprintf(stderr," Failed to exchange data between server and clients\n");
+ exit(1);
+ }
+ if (ctx_xchg_data(comm, (void*) (&temp.msgRate_avg_p2), (void*) (&rem_bw_rep->msgRate_avg_p2), sizeof(double))) {
+ fprintf(stderr," Failed to exchange data between server and clients\n");
+ exit(1);
+ }
+ }
+
rem_bw_rep->size = hton_long(rem_bw_rep->size);
- rem_bw_rep->iters = hton_int(rem_bw_rep->iters);
+
+ if ( remote_version >= 5.33 )
+ rem_bw_rep->iters = hton_long(rem_bw_rep->iters);
+ else
+ rem_bw_rep->iters = hton_int(rem_bw_rep->iters);
+
rem_bw_rep->bw_peak = hton_double(rem_bw_rep->bw_peak);
rem_bw_rep->bw_avg = hton_double(rem_bw_rep->bw_avg);
+ rem_bw_rep->bw_avg_p1 = hton_double(rem_bw_rep->bw_avg_p1);
+ rem_bw_rep->bw_avg_p2 = hton_double(rem_bw_rep->bw_avg_p2);
rem_bw_rep->msgRate_avg = hton_double(rem_bw_rep->msgRate_avg);
+ rem_bw_rep->msgRate_avg_p1 = hton_double(rem_bw_rep->msgRate_avg_p1);
+ rem_bw_rep->msgRate_avg_p2 = hton_double(rem_bw_rep->msgRate_avg_p2);
+
}
/******************************************************************************
@@ -1432,10 +1486,54 @@ void exchange_versions(struct perftest_comm *user_comm, struct perftest_paramete
/******************************************************************************
*
******************************************************************************/
+void check_sys_data(struct perftest_comm *user_comm, struct perftest_parameters *user_param)
+{
+ int rem_cycle_buffer = 0;
+ int rem_cache_line_size = 0;
+
+ int m_cycle_buffer = hton_int(user_param->cycle_buffer);
+ int m_cache_line_size = hton_int(user_param->cache_line_size);
+
+ //keep compatibility between older versions, without this feature.
+ if ( !(atof(user_param->rem_version) >= 5.32) )
+ {
+ return;
+ }
+
+ if (!user_param->dont_xchg_versions) {
+ if (ctx_xchg_data(user_comm,(void*)(&m_cycle_buffer),(void*)(&rem_cycle_buffer), sizeof(user_param->cycle_buffer))) {
+ fprintf(stderr," Failed to exchange Page Size data between server and client\n");
+ exit(1);
+ }
+ if (ctx_xchg_data(user_comm,(void*)(&m_cache_line_size),(void*)(&rem_cache_line_size), sizeof(user_param->cache_line_size))) {
+ fprintf(stderr," Failed to exchange Cache Line Size data between server and client\n");
+ exit(1);
+ }
+ }
+
+ rem_cycle_buffer = ntoh_int(rem_cycle_buffer);
+ rem_cache_line_size = ntoh_int(rem_cache_line_size);
+
+ //take the max and update usr_param
+ user_param->cycle_buffer = (rem_cycle_buffer > user_param->cycle_buffer) ? rem_cycle_buffer : user_param->cycle_buffer;
+ user_param->cache_line_size = (rem_cache_line_size > user_param->cache_line_size) ? rem_cache_line_size : user_param->cache_line_size;
+
+ //update user_comm as well
+ if (user_param->use_rdma_cm)
+ {
+ user_comm->rdma_ctx->buff_size = user_param->cycle_buffer;
+ }
+
+}
+
+/******************************************************************************
+ *
+ ******************************************************************************/
int check_mtu(struct ibv_context *context,struct perftest_parameters *user_param, struct perftest_comm *user_comm) {
int curr_mtu=0, rem_mtu=0;
char cur[2];
char rem[2];
+ int size_of_cur;
if (user_param->connection_type == RawEth) {
if (set_eth_mtu(user_param) != 0 ) {
@@ -1447,12 +1545,16 @@ int check_mtu(struct ibv_context *context,struct perftest_parameters *user_param
if (!user_param->dont_xchg_versions) {
if (strverscmp(user_param->rem_version, "5.1") >= 0) {
sprintf(cur,"%d",curr_mtu);
- if (ctx_xchg_data(user_comm,(void*)(cur),(void*)(rem),sizeof(int))) {
+
+ //fix a buffer overflow issue in ppc.
+ size_of_cur = (strverscmp(user_param->rem_version, "5.31") >= 0) ? sizeof(char[2]) : sizeof(int);
+
+ if (ctx_xchg_data(user_comm,(void*)(cur),(void*)(rem),size_of_cur)) {
fprintf(stderr," Failed to exchange data between server and clients\n");
exit(1);
}
rem_mtu = (int) strtol(rem, (char **)NULL, 10);
- user_param->curr_mtu = (enum ibv_mtu)((curr_mtu > rem_mtu) ? rem_mtu : curr_mtu);
+ user_param->curr_mtu = (enum ibv_mtu)((valid_mtu_size(rem_mtu) && (curr_mtu > rem_mtu)) ? rem_mtu : curr_mtu);
} else {
user_param->curr_mtu = (enum ibv_mtu)(curr_mtu);
}
@@ -1486,6 +1588,20 @@ int check_mtu(struct ibv_context *context,struct perftest_parameters *user_param
return SUCCESS;
}
+int ctx_check_gid_compatibility(struct pingpong_dest *my_dest,
+ struct pingpong_dest *rem_dest)
+{
+ int gid_type1, gid_type2;
+
+ //ipv4 - 1 , ipv6 - 0
+ gid_type1 = ipv6_addr_v4mapped((struct in6_addr *)my_dest->gid.raw);
+ gid_type2 = ipv6_addr_v4mapped((struct in6_addr *)rem_dest->gid.raw);
+
+ if (gid_type1 != gid_type2)
+ return 1;
+
+ return 0;
+}
/******************************************************************************
* End
******************************************************************************/
diff --git a/src/perftest_communication.h b/src/perftest_communication.h
index 0896635..78081b6 100755
--- a/src/perftest_communication.h
+++ b/src/perftest_communication.h
@@ -100,6 +100,9 @@
// The print format of a global address or a multicast address.
#define PERF_GID_FMT " %s: %02d:%02d:%02d:%02d:%02d:%02d:%02d:%02d:%02d:%02d:%02d:%02d:%02d:%02d:%02d:%02d\n"
+// The print format of a global address or a multicast address.
+#define PERF_RAW_MGID_FMT " %s: %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x\n"
+
struct perftest_comm {
struct pingpong_context *rdma_ctx;
struct perftest_parameters *rdma_params;
@@ -397,7 +400,7 @@ int ctx_xchg_data_rdma( struct perftest_comm *comm, void *my_data, void *rem_dat
* Return Value : 0 upon success. -1 if it fails.
*/
void xchg_bw_reports (struct perftest_comm *comm, struct bw_report_data *my_bw_rep,
- struct bw_report_data *rem_bw_rep);
+ struct bw_report_data *rem_bw_rep, float remote_version);
/* exchange_versions.
*
@@ -407,6 +410,14 @@ void xchg_bw_reports (struct perftest_comm *comm, struct bw_report_data *my_bw_r
*/
void exchange_versions (struct perftest_comm *user_comm, struct perftest_parameters *user_param);
+/* check_sys_data.
+ *
+ * Description :
+ * Exchange system data between sides.
+ *
+ */
+void check_sys_data(struct perftest_comm *user_comm, struct perftest_parameters *user_param);
+
/* check_mtu
*
* Description : Configures test MTU.
@@ -420,6 +431,9 @@ void exchange_versions (struct perftest_comm *user_comm, struct perftest_paramet
*/
int check_mtu(struct ibv_context *context,struct perftest_parameters *user_param, struct perftest_comm *user_comm);
+int ctx_check_gid_compatibility(struct pingpong_dest *my_dest,
+ struct pingpong_dest *rem_dest);
+
#endif /* PERFTEST_COMMUNICATION_H */
diff --git a/src/perftest_parameters.c b/src/perftest_parameters.c
index aa12c7e..9463040 100755
--- a/src/perftest_parameters.c
+++ b/src/perftest_parameters.c
@@ -99,7 +99,32 @@ int check_if_valid_udp_port(int udp_port)
{
return ON;
}
+/******************************************************************************
+ get cache line size from system
+ ******************************************************************************/
+static int get_cache_line_size()
+{
+ int size = sysconf(_SC_LEVEL1_DCACHE_LINESIZE);
+ if (size == 0)
+ {
+ char* file_name = "/sys/devices/system/cpu/cpu0/cache/index0/coherency_line_size";
+ FILE *fp;
+ char line[10];
+ fp = fopen(file_name, "r"); //open file , read only
+ if (fp == NULL)
+ {
+ return DEF_CACHE_LINE_SIZE;
+ }
+ fgets(line,10,fp);
+ size = atoi(line);
+ fclose(fp);
+ }
+
+ if (size <= 0)
+ size = DEF_CACHE_LINE_SIZE;
+ return size;
+}
/******************************************************************************
*
******************************************************************************/
@@ -157,10 +182,8 @@ static void usage(const char *argv0,VerbType verb,TestType tst) {
printf(" -f, --margin ");
printf(" measure results within margins. (default=2sec)\n");
- if (tst == BW) {
- printf(" -F, --CPU-freq ");
- printf(" Do not fail even if cpufreq_ondemand module is loaded\n");
- }
+ printf(" -F, --CPU-freq ");
+ printf(" Do not fail even if cpufreq_ondemand module is loaded\n");
if (verb == SEND) {
printf(" -g, --mcg ");
@@ -291,6 +314,9 @@ static void usage(const char *argv0,VerbType verb,TestType tst) {
printf(" Max size of message to be sent in inline receive\n");
}
+ printf(" --ipv6 ");
+ printf(" Use IPv6 GID. Default is IPv4\n");
+
if (tst == LAT) {
printf(" --latency_gap=<delay_time> ");
printf(" delay time between each post send\n");
@@ -307,6 +333,9 @@ static void usage(const char *argv0,VerbType verb,TestType tst) {
printf(" --report_gbits ");
printf(" Report Max/Average BW of test in Gbit/sec (instead of MB/sec)\n");
+ printf(" --report-per-port ");
+ printf(" Report BW data on both ports when running Dualport and Duration mode\n");
+
printf(" --reversed ");
printf(" Reverse traffic direction - Server send to client\n");
@@ -327,6 +356,11 @@ static void usage(const char *argv0,VerbType verb,TestType tst) {
printf(" Use Experimental verbs in data path. Default is OFF.\n");
#endif
+ #ifdef HAVE_ODP
+ printf(" --odp ");
+ printf(" Use On Demand Paging instead of Memory Registration.\n");
+ #endif
+
if (tst == BW) {
printf("\n Rate Limiter:\n");
printf(" --burst_size=<size>");
@@ -373,6 +407,9 @@ void usage_raw_ethernet(){
printf(" -v, --mac_fwd ");
printf(" run mac forwarding test \n");
+ printf(" --promiscuous");
+ printf(" run promiscuous mode.\n");
+
printf(" --tcp ");
printf(" send TCP Packets. must include IP and Ports information.\n");
@@ -436,6 +473,8 @@ static void init_perftest_params(struct perftest_parameters *user_param) {
user_param->rate_units = MEGA_BYTE_PS;
user_param->output = -1;
user_param->use_cuda = 0;
+ user_param->iters_per_port[0] = 0;
+ user_param->iters_per_port[1] = 0;
if (user_param->tst == LAT) {
user_param->r_flag->unsorted = OFF;
@@ -454,6 +493,21 @@ static void init_perftest_params(struct perftest_parameters *user_param) {
user_param->dont_xchg_versions = 0;
user_param->use_exp = 0;
user_param->ipv6 = 0;
+ user_param->report_per_port = 0;
+ user_param->use_odp = 0;
+ user_param->use_promiscuous = 0;
+ user_param->check_alive_exited = 0;
+ user_param->raw_mcast = 0;
+ user_param->masked_atomics = 0;
+
+ user_param->cache_line_size = get_cache_line_size();
+
+ user_param->cycle_buffer = sysconf(_SC_PAGESIZE);
+ if (user_param->cycle_buffer <= 0)
+ {
+ user_param->cycle_buffer = DEF_PAGE_SIZE;
+ }
+
}
/******************************************************************************
@@ -561,6 +615,14 @@ static void force_dependecies(struct perftest_parameters *user_param) {
if (user_param->verb == SEND && user_param->rx_depth > user_param->iters) {
user_param->rx_depth = user_param->iters;
}
+
+ if (user_param->connection_type == UD || user_param->connection_type == UC)
+ {
+ if (user_param->rx_depth == DEF_RX_SEND)
+ {
+ user_param->rx_depth = (user_param->iters < UC_MAX_RX) ? user_param->iters : UC_MAX_RX;
+ }
+ }
}
if (user_param->cq_mod > user_param->tx_depth) {
@@ -689,9 +751,14 @@ static void force_dependecies(struct perftest_parameters *user_param) {
}
}
+ if(user_param->verb == ATOMIC && user_param->use_odp) {
+ printf(RESULT_LINE);
+ fprintf(stderr," ODP does not support ATOMICS for now\n");
+ exit(1);
+ }
if (user_param->connection_type == RawEth) {
- if (user_param->num_of_qps > 1) {
+ if (user_param->num_of_qps > 1 && !user_param->use_rss) {
printf(RESULT_LINE);
fprintf(stdout," Raw Ethernet test supports only 1 QP for now\n");
exit(1);
@@ -703,7 +770,7 @@ static void force_dependecies(struct perftest_parameters *user_param) {
exit(1);
}
- if(user_param->machine == CLIENT && user_param->is_dest_mac == OFF) {
+ if(user_param->machine == CLIENT && user_param->is_dest_mac == OFF && !user_param->raw_mcast) {
printf(RESULT_LINE);
fprintf(stderr," Invalid Command line.\n you must enter dest mac by this format -E XX:XX:XX:XX:XX:XX\n");
exit(1);
@@ -732,6 +799,12 @@ static void force_dependecies(struct perftest_parameters *user_param) {
fprintf(stderr," Changing CQ moderation to min( rx depth , tx depth) = %d.\n",user_param->cq_mod);
}
+ if (user_param->raw_mcast && user_param->duplex)
+ {
+ printf(" Multicast feature works on unidirectional traffic only\n");
+ exit(1);
+ }
+
}
if (user_param->verb == SEND && user_param->tst == BW && user_param->machine == SERVER && !user_param->duplex )
@@ -875,6 +948,14 @@ static void force_dependecies(struct perftest_parameters *user_param) {
fprintf(stderr,"Setting inline size to %d (Max inline size in UD)\n",MAX_INLINE_UD);
user_param->inline_size = MAX_INLINE_UD;
}
+
+ if (user_param->report_per_port && (user_param->test_type != DURATION || !user_param->dualport))
+ {
+ printf(RESULT_LINE);
+ fprintf(stderr,"report per port feature work only with Duration and Dualport\n");
+ exit(1);
+ }
+
return;
}
@@ -919,7 +1000,7 @@ const char *link_layer_str(uint8_t link_layer) {
/******************************************************************************
*
******************************************************************************/
-static enum ctx_device ib_dev_name(struct ibv_context *context) {
+enum ctx_device ib_dev_name(struct ibv_context *context) {
enum ctx_device dev_fname = UNKNOWN;
struct ibv_device_attr attr;
@@ -1130,6 +1211,10 @@ int parser(struct perftest_parameters *user_param,char *argv[], int argc) {
static int use_exp_flag = 0;
static int use_cuda_flag = 0;
static int ipv6_flag = 0;
+ static int report_per_port_flag = 0;
+ static int odp_flag = 0;
+ static int use_promiscuous_flag = 0;
+ static int raw_mcast_flag = 0;
init_perftest_params(user_param);
@@ -1207,6 +1292,10 @@ int parser(struct perftest_parameters *user_param,char *argv[], int argc) {
#endif
{ .name = "use_cuda", .has_arg = 0, .flag = &use_cuda_flag, .val = 1},
{ .name = "ipv6", .has_arg = 0, .flag = &ipv6_flag, .val = 1},
+ { .name = "report-per-port", .has_arg = 0, .flag = &report_per_port_flag, .val = 1},
+ { .name = "odp", .has_arg = 0, .flag = &odp_flag, .val = 1},
+ { .name = "promiscuous", .has_arg = 0, .flag = &use_promiscuous_flag, .val = 1},
+ { .name = "raw_mcast", .has_arg = 0, .flag = &raw_mcast_flag, .val = 1},
{ 0 }
};
c = getopt_long(argc,argv,"w:y:p:d:i:m:s:n:t:u:S:x:c:q:I:o:M:r:Q:A:l:D:f:B:T:E:J:j:K:k:aFegzRvhbNVCHUOZP",long_options,NULL);
@@ -1252,7 +1341,7 @@ int parser(struct perftest_parameters *user_param,char *argv[], int argc) {
fprintf(stderr," Setting Outstanding reads only available on READ verb\n");
return 1;
} break;
- case 'M': GET_STRING(user_param->user_mgid,strdupa(optarg));
+ case 'M': GET_STRING(user_param->user_mgid,strdupa(optarg)); break;
case 'r': CHECK_VALUE(user_param->rx_depth,int,MIN_RX,MAX_RX," Rx depth");
if (user_param->verb != SEND && user_param->rx_depth > DEF_RX_RDMA) {
fprintf(stderr," On RDMA verbs rx depth can be only 1\n");
@@ -1545,12 +1634,27 @@ int parser(struct perftest_parameters *user_param,char *argv[], int argc) {
if (cpu_util_flag) {
user_param->cpu_util = 1;
- }
+ }
+
+ if (report_per_port_flag) {
+ user_param->report_per_port = 1;
+ }
if (ipv6_flag) {
user_param->ipv6 = 1;
- }
+ }
+
+ if(odp_flag) {
+ user_param->use_odp = 1;
+ }
+
+ if (use_promiscuous_flag) {
+ user_param->use_promiscuous = 1;
+ }
+ if (raw_mcast_flag) {
+ user_param->raw_mcast = 1;
+ }
if (optind == argc - 1) {
GET_STRING(user_param->servername,strdupa(argv[optind]));
@@ -1852,6 +1956,8 @@ void print_report_bw (struct perftest_parameters *user_param, struct bw_report_d
int num_of_qps = user_param->num_of_qps;
long format_factor;
long num_of_calculated_iters = user_param->iters;
+ int free_my_bw_rep = 0;
+
cycles_t t,opt_delta, peak_up, peak_down,tsize;
opt_delta = user_param->tcompleted[opt_posted] - user_param->tposted[opt_completed];
@@ -1887,13 +1993,21 @@ void print_report_bw (struct perftest_parameters *user_param, struct bw_report_d
format_factor = (user_param->report_fmt == MBS) ? 0x100000 : 125000000;
sum_of_test_cycles = ((double)(user_param->tcompleted[location_arr] - user_param->tposted[0]));
+
double bw_avg = ((double)tsize*num_of_calculated_iters * cycles_to_units) / (sum_of_test_cycles * format_factor);
double msgRate_avg = ((double)num_of_calculated_iters * cycles_to_units * run_inf_bi_factor) / (sum_of_test_cycles * 1000000);
+ double bw_avg_p1 = ((double)tsize*user_param->iters_per_port[0] * cycles_to_units) / (sum_of_test_cycles * format_factor);
+ double msgRate_avg_p1 = ((double)user_param->iters_per_port[0] * cycles_to_units * run_inf_bi_factor) / (sum_of_test_cycles * 1000000);
+
+ double bw_avg_p2 = ((double)tsize*user_param->iters_per_port[1] * cycles_to_units) / (sum_of_test_cycles * format_factor);
+ double msgRate_avg_p2 = ((double)user_param->iters_per_port[1] * cycles_to_units * run_inf_bi_factor) / (sum_of_test_cycles * 1000000);
+
peak_up = !(user_param->noPeak)*(cycles_t)tsize*(cycles_t)cycles_to_units;
peak_down = (cycles_t)opt_delta * format_factor;
if (my_bw_rep == NULL) {
+ free_my_bw_rep = 1;
ALLOCATE(my_bw_rep , struct bw_report_data , 1);
memset(my_bw_rep, 0, sizeof(struct bw_report_data));
}
@@ -1903,12 +2017,19 @@ void print_report_bw (struct perftest_parameters *user_param, struct bw_report_d
my_bw_rep->bw_peak = (double)peak_up/peak_down;
my_bw_rep->bw_avg = bw_avg;
my_bw_rep->msgRate_avg = msgRate_avg;
+ my_bw_rep->bw_avg_p1 = bw_avg_p1;
+ my_bw_rep->msgRate_avg_p1 = msgRate_avg_p1;
+ my_bw_rep->bw_avg_p2 = bw_avg_p2;
+ my_bw_rep->msgRate_avg_p2 = msgRate_avg_p2;
my_bw_rep->sl = user_param->sl;
if (!user_param->duplex || (user_param->verb == SEND && user_param->test_type == DURATION)
|| user_param->test_method == RUN_INFINITELY || user_param->connection_type == RawEth)
print_full_bw_report(user_param, my_bw_rep, NULL);
+ if (free_my_bw_rep == 1) {
+ free(my_bw_rep);
+ }
}
/******************************************************************************
@@ -1918,15 +2039,23 @@ void print_report_bw (struct perftest_parameters *user_param, struct bw_report_d
void print_full_bw_report (struct perftest_parameters *user_param, struct bw_report_data *my_bw_rep, struct bw_report_data *rem_bw_rep)
{
- double bw_peak = my_bw_rep->bw_peak;
- double bw_avg = my_bw_rep->bw_avg;
- double msgRate_avg = my_bw_rep->msgRate_avg;
+ double bw_peak = my_bw_rep->bw_peak;
+ double bw_avg = my_bw_rep->bw_avg;
+ double bw_avg_p1 = my_bw_rep->bw_avg_p1;
+ double bw_avg_p2 = my_bw_rep->bw_avg_p2;
+ double msgRate_avg = my_bw_rep->msgRate_avg;
+ double msgRate_avg_p1 = my_bw_rep->msgRate_avg_p1;
+ double msgRate_avg_p2 = my_bw_rep->msgRate_avg_p2;
int inc_accuracy = ((bw_avg < 0.1) && (user_param->report_fmt == GBS));
if (rem_bw_rep != NULL) {
- bw_peak += rem_bw_rep->bw_peak;
- bw_avg += rem_bw_rep->bw_avg;
+ bw_peak += rem_bw_rep->bw_peak;
+ bw_avg += rem_bw_rep->bw_avg;
+ bw_avg_p1 += rem_bw_rep->bw_avg_p1;
+ bw_avg_p2 += rem_bw_rep->bw_avg_p2;
msgRate_avg += rem_bw_rep->msgRate_avg;
+ msgRate_avg_p1 += rem_bw_rep->msgRate_avg_p1;
+ msgRate_avg_p2 += rem_bw_rep->msgRate_avg_p2;
}
if ( (user_param->duplex && rem_bw_rep != NULL) || (!user_param->duplex && rem_bw_rep == NULL)) {//bibw test, and not report-both printing
@@ -1948,6 +2077,8 @@ void print_full_bw_report (struct perftest_parameters *user_param, struct bw_rep
printf("%lf\n",msgRate_avg);
else if (user_param->raw_qos)
printf( REPORT_FMT_QOS, my_bw_rep->size, my_bw_rep->sl, my_bw_rep->iters, bw_peak, bw_avg, msgRate_avg);
+ else if (user_param->report_per_port)
+ printf(REPORT_FMT_PER_PORT, my_bw_rep->size, my_bw_rep->iters, bw_peak, bw_avg, msgRate_avg, bw_avg_p1, msgRate_avg_p1, bw_avg_p2, msgRate_avg_p2);
else
printf( inc_accuracy ? REPORT_FMT_EXT : REPORT_FMT, my_bw_rep->size, my_bw_rep->iters, bw_peak, bw_avg, msgRate_avg);
if (user_param->output == FULL_VERBOSITY)
diff --git a/src/perftest_parameters.h b/src/perftest_parameters.h
index 93fef5d..b2393b4 100755
--- a/src/perftest_parameters.h
+++ b/src/perftest_parameters.h
@@ -120,6 +120,8 @@
#define DEF_INLINE (-1)
#define DEF_TOS (-1)
#define DEF_RETRY_COUNT (7)
+#define DEF_CACHE_LINE_SIZE (64)
+#define DEF_PAGE_SIZE (4096)
// Optimal Values for Inline
#define DEF_INLINE_WRITE (220)
@@ -147,6 +149,7 @@
#define MAX_QP_MCAST (56)
#define MIN_RX (1)
#define MAX_RX (16384)
+#define UC_MAX_RX (16000)
#define MIN_CQ_MOD (1)
#define MAX_CQ_MOD (1024)
#define MAX_INLINE (912)
@@ -160,11 +163,17 @@
#define RESULT_LINE "---------------------------------------------------------------------------------------\n"
+#define RESULT_LINE_PER_PORT "-------------------------------------------------------------------------------------------------------------------------------------------------------------------\n"
+
// The format of the results
#define RESULT_FMT " #bytes #iterations BW peak[MB/sec] BW average[MB/sec] MsgRate[Mpps]"
+#define RESULT_FMT_PER_PORT " #bytes #iterations BW peak[MB/sec] BW average[MB/sec] MsgRate[Mpps] BW Port1[MB/sec] MsgRate Port1[Mpps] BW Port2[MB/sec] MsgRate Port2[Mpps]"
+
#define RESULT_FMT_G " #bytes #iterations BW peak[Gb/sec] BW average[Gb/sec] MsgRate[Mpps]"
+#define RESULT_FMT_G_PER_PORT " #bytes #iterations BW peak[Gb/sec] BW average[Gb/sec] MsgRate[Mpps] BW Port1[Gb/sec] MsgRate Port1[Mpps] BW Port2[Gb/sec] MsgRate Port2[Mpps]"
+
#define RESULT_FMT_QOS " #bytes #sl #iterations BW peak[MB/sec] BW average[MB/sec] MsgRate[Mpps]"
#define RESULT_FMT_G_QOS " #bytes #sl #iterations BW peak[Gb/sec] BW average[Gb/sec] MsgRate[Mpps]"
@@ -178,9 +187,11 @@
#define RESULT_EXT_CPU_UTIL " CPU_Util[%%]\n"
// Result print format
-#define REPORT_FMT " %-7lu %lu %-7.2lf %-7.2lf %-7.6lf"
+#define REPORT_FMT " %-7lu %-10lu %-7.2lf %-7.2lf %-7.6lf"
-#define REPORT_FMT_EXT " %-7lu %lu %-7.6lf %-7.6lf %-7.6lf"
+#define REPORT_FMT_EXT " %-7lu %lu %-7.6lf %-7.6lf %-7.6lf"
+
+#define REPORT_FMT_PER_PORT " %-7lu %-10lu %-7.2lf %-7.2lf %-7.6lf %-7.2lf %-7.6lf %-7.2lf %-7.6lf"
#define REPORT_EXT "\n"
@@ -268,32 +279,36 @@ struct check_alive_data {
int current_totrcnt;
int last_totrcnt;
int g_total_iters;
+ int to_exit;
+ int is_events;
};
struct perftest_parameters {
int port;
- char *ib_devname;
- char *servername;
- uint8_t ib_port;
- uint8_t ib_port2;
+ char *ib_devname;
+ char *servername;
+ uint8_t ib_port;
+ uint8_t ib_port2;
int mtu;
- enum ibv_mtu curr_mtu;
- uint64_t size;
- uint64_t dct_key;
+ enum ibv_mtu curr_mtu;
+ uint64_t size;
+ uint64_t dct_key;
int iters;
+ uint64_t iters_per_port[2];
+ uint64_t *port_by_qp;
int tx_depth;
- uint8_t qp_timeout;
- uint8_t sl;
+ uint8_t qp_timeout;
+ uint8_t sl;
int gid_index;
int gid_index2;
int use_gid_user;
- uint8_t source_mac[6];
- uint8_t dest_mac[6];
+ uint8_t source_mac[6];
+ uint8_t dest_mac[6];
int is_source_mac;
int is_dest_mac;
- uint32_t server_ip;
- uint32_t client_ip;
+ uint32_t server_ip;
+ uint32_t client_ip;
int is_server_ip;
int is_client_ip;
int server_port;
@@ -305,77 +320,86 @@ struct perftest_parameters {
int connection_type;
int num_of_qps;
int use_event;
- int inline_size;
+ int inline_size;
int inline_recv_size;
int out_reads;
int rx_depth;
int duplex;
int noPeak;
int cq_mod;
- int spec;
- int dualport;
- int post_list;
+ int spec;
+ int dualport;
+ int post_list;
int duration;
- int use_srq;
+ int use_srq;
int use_xrc;
int use_rss;
int srq_exists;
int tos;
int margin;
- int is_bw_limit_passed;
- int is_msgrate_limit_passed;
- int is_limit_bw;
- int is_limit_msgrate;
- float limit_bw;
- float limit_msgrate;
- uint32_t rem_ud_qpn;
- uint32_t rem_ud_qkey;
- uint8_t link_type;
- uint8_t link_type2;
- MachineType machine;
- PrintDataSide side;
- VerbType verb;
- TestType tst;
- AtomicType atomicType;
- TestMethod test_type;
- DurationStates state;
+ int is_bw_limit_passed;
+ int is_msgrate_limit_passed;
+ int is_limit_bw;
+ int is_limit_msgrate;
+ float limit_bw;
+ float limit_msgrate;
+ uint32_t rem_ud_qpn;
+ uint32_t rem_ud_qkey;
+ uint8_t link_type;
+ uint8_t link_type2;
+ MachineType machine;
+ PrintDataSide side;
+ VerbType verb;
+ TestType tst;
+ AtomicType atomicType;
+ TestMethod test_type;
+ DurationStates state;
int sockfd;
- char version[MAX_VERSION];
- char rem_version[MAX_VERSION];
- cycles_t *tposted;
- cycles_t *tcompleted;
+ char version[MAX_VERSION];
+ char rem_version[MAX_VERSION];
+ cycles_t *tposted;
+ cycles_t *tcompleted;
int use_mcg;
- int use_rdma_cm;
+ int use_rdma_cm;
int is_reversed;
int work_rdma_cm;
- char *user_mgid;
+ char *user_mgid;
int buff_size;
- int pkey_index;
+ int pkey_index;
int raw_qos;
int use_cuda;
// New test params format pilot. will be used in all flags soon,.
- enum ctx_test_method test_method;
- enum ibv_transport_type transport_type;
+ enum ctx_test_method test_method;
+ enum ibv_transport_type transport_type;
enum ctx_report_fmt report_fmt;
- struct report_options *r_flag;
- int mac_fwd;
+ struct report_options *r_flag ;
+ int mac_fwd;
int report_both; //in bidirectional tests, report tx and rx separately
//results limits
- float min_bw_limit;
- float min_msgRate_limit;
+ float min_bw_limit;
+ float min_msgRate_limit;
// Rate Limiter
- int is_rate_limiting;
- int rate_limit;
- int burst_size;
- enum rate_limiter_units rate_units;
- enum verbosity_level output;
- int cpu_util;
- struct cpu_util_data cpu_util_data;
- int latency_gap;
- int retry_count;
- int dont_xchg_versions;
- int use_exp;
- int ipv6;
+ int is_rate_limiting;
+ int rate_limit;
+ int burst_size;
+ enum rate_limiter_units rate_units;
+
+ enum verbosity_level output;
+ int cpu_util;
+ struct cpu_util_data cpu_util_data;
+ int latency_gap;
+ int retry_count;
+ int dont_xchg_versions;
+ int use_exp;
+ int ipv6;
+ int report_per_port;
+ int use_odp;
+ int use_promiscuous;
+ int check_alive_exited;
+ int raw_mcast;
+ int masked_atomics;
+ int cycle_buffer;
+ int cache_line_size;
};
struct report_options {
@@ -389,7 +413,11 @@ struct bw_report_data {
uint64_t iters;
double bw_peak;
double bw_avg;
+ double bw_avg_p1;
+ double bw_avg_p2;
double msgRate_avg;
+ double msgRate_avg_p1;
+ double msgRate_avg_p2;
int sl;
};
@@ -533,4 +561,9 @@ enum ibv_mtu set_mtu(struct ibv_context *context,uint8_t ib_port,int user_mtu);
*/
int set_eth_mtu(struct perftest_parameters *user_param);
+/******************************************************************************
+ *
+ ******************************************************************************/
+enum ctx_device ib_dev_name(struct ibv_context *context);
+
#endif /* PERFTEST_RESOURCES_H */
diff --git a/src/perftest_resources.c b/src/perftest_resources.c
index 16d1858..8aed9d8 100755
--- a/src/perftest_resources.c
+++ b/src/perftest_resources.c
@@ -24,7 +24,6 @@ static enum ibv_wr_opcode opcode_atomic_array[] = {IBV_WR_ATOMIC_CMP_AND_SWP,IBV
struct perftest_parameters* duration_param;
struct check_alive_data check_alive_data;
-int cycle_buffer=4096;
/******************************************************************************
* Beginning
@@ -192,20 +191,22 @@ static void compress_spaces(char *str, char *dst)
static void get_cpu_stats(struct perftest_parameters *duration_param,int stat_index)
{
- char* file_name = CPU_UTILITY;
- FILE *fp;
- char line[100];
- char tmp[100];
- int index=0;
- fp = fopen(file_name, "r"); //open file , read only
-
- fgets(line,100,fp);
- compress_spaces(line,line);
- index=get_n_word_string(line,tmp,index,2); //skip first word
- duration_param->cpu_util_data.ustat[stat_index-1] = atoll(tmp);
-
- index=get_n_word_string(line,tmp,index,3); //skip 2 stats
- duration_param->cpu_util_data.idle[stat_index-1] = atoll(tmp);
+ char* file_name = CPU_UTILITY;
+ FILE *fp;
+ char line[100];
+ char tmp[100];
+ int index=0;
+ fp = fopen(file_name, "r"); //open file , read only
+
+ fgets(line,100,fp);
+ compress_spaces(line,line);
+ index=get_n_word_string(line,tmp,index,2); //skip first word
+ duration_param->cpu_util_data.ustat[stat_index-1] = atoll(tmp);
+
+ index=get_n_word_string(line,tmp,index,3); //skip 2 stats
+ duration_param->cpu_util_data.idle[stat_index-1] = atoll(tmp);
+
+ fclose(fp);
}
static int check_for_contig_pages_support(struct ibv_context *context)
@@ -493,7 +494,7 @@ static struct ibv_qp *ctx_rss_eth_qp_create(struct pingpong_context *ctx,struct
#endif
attr.qpg.qpg_parent = NULL;
attr.qpg.parent_attrib.tss_child_count = 0;
- attr.qpg.parent_attrib.rss_child_count = 2;
+ attr.qpg.parent_attrib.rss_child_count = user_param->num_of_qps - 1;
} else { //rss childs
#if defined(HAVE_VERBS_EXP)
attr.qpg.qpg_type = IBV_EXP_QPG_CHILD_RX;
@@ -623,6 +624,11 @@ void alloc_ctx(struct pingpong_context *ctx,struct perftest_parameters *user_par
int tarr_size;
+ ctx->cycle_buffer = user_param->cycle_buffer;
+ ctx->cache_line_size = user_param->cache_line_size;
+
+ ALLOCATE(user_param->port_by_qp, uint64_t, user_param->num_of_qps);
+
tarr_size = (user_param->noPeak) ? 1 : user_param->iters*user_param->num_of_qps;
ALLOCATE(user_param->tposted,cycles_t,tarr_size);
memset(user_param->tposted, 0, sizeof(cycles_t)*tarr_size);
@@ -679,14 +685,14 @@ void alloc_ctx(struct pingpong_context *ctx,struct perftest_parameters *user_par
ALLOCATE(ctx->rx_buffer_addr,uint64_t,user_param->num_of_qps);
}
if (user_param->mac_fwd == ON )
- cycle_buffer = user_param->size * user_param->rx_depth;
+ ctx->cycle_buffer = user_param->size * user_param->rx_depth;
ctx->size = user_param->size;
- ctx->buff_size = BUFF_SIZE(ctx->size)*2*user_param->num_of_qps;
+ ctx->buff_size = BUFF_SIZE(ctx->size,ctx->cycle_buffer)*2*user_param->num_of_qps;
user_param->buff_size = ctx->buff_size;
if (user_param->connection_type == UD)
- ctx->buff_size += CACHE_LINE_SIZE;
+ ctx->buff_size += ctx->cache_line_size;
}
/******************************************************************************
@@ -699,7 +705,7 @@ int destroy_ctx(struct pingpong_context *ctx,
int test_result = 0;
int num_of_qps = user_param->num_of_qps;
- if (user_param->use_rdma_cm == ON)
+ if (user_param->work_rdma_cm == ON)
rdma_disconnect(ctx->cm_id);
//in dc with bidirectional,
@@ -952,9 +958,10 @@ int ctx_init(struct pingpong_context *ctx,struct perftest_parameters *user_param
#if defined(HAVE_VERBS_EXP)
struct ibv_exp_reg_mr_in reg_mr_exp_in;
uint64_t exp_flags = IBV_EXP_ACCESS_LOCAL_WRITE;
- #endif
+ struct ibv_exp_device_attr dattr;
+
+ memset(&dattr, 0, sizeof(dattr));
- #ifdef HAVE_VERBS_EXP
get_verbs_pointers(ctx);
#endif
@@ -964,6 +971,31 @@ int ctx_init(struct pingpong_context *ctx,struct perftest_parameters *user_param
ctx->is_contig_supported = check_for_contig_pages_support(ctx->context);
+ //ODP
+ #ifdef HAVE_ODP
+ if (user_param->use_odp) {
+ //ODP does not support contig pages
+ ctx->is_contig_supported = FAILURE;
+ exp_flags |= IBV_EXP_ACCESS_ON_DEMAND;
+
+ /*
+ dattr.comp_mask |= IBV_EXP_DEVICE_ATTR_ODP;
+ int ret = ibv_exp_query_device(ctx->context, &dattr);
+ if (ret) {
+ printf(" Couldn't query device for on-demand\
+ paging capabilities.\n");
+ } else if (!(dattr.comp_mask & IBV_EXP_DEVICE_ATTR_ODP)) {
+ printf(" On-demand paging not supported by driver.\n");
+ } else if (!(dattr.odp_caps.per_transport_caps.rc_odp_caps &
+ IBV_EXP_ODP_SUPPORT_SEND)) {
+ printf(" Send is not supported for RC transport.\n");
+ } else if (!(dattr.odp_caps.per_transport_caps.rc_odp_caps &
+ IBV_EXP_ODP_SUPPORT_RECV)) {
+ printf(" Receive is not supported for RC transport.\n");
+ }*/
+ }
+ #endif
+
#ifdef HAVE_CUDA
if (user_param->use_cuda) {
ctx->is_contig_supported = FAILURE;
@@ -1043,7 +1075,8 @@ int ctx_init(struct pingpong_context *ctx,struct perftest_parameters *user_param
reg_mr_exp_in.length = ctx->buff_size;
reg_mr_exp_in.exp_access = exp_flags;
reg_mr_exp_in.comp_mask = 0;
- if (ctx->is_contig_supported == SUCCESS){
+
+ if (ctx->is_contig_supported == SUCCESS || user_param->use_odp){
ctx->mr = ibv_exp_reg_mr(®_mr_exp_in);
}
else
@@ -1067,7 +1100,7 @@ int ctx_init(struct pingpong_context *ctx,struct perftest_parameters *user_param
fprintf(stderr, "Couldn't create CQ\n");
return FAILURE;
}
- if ((user_param->connection_type == DC && only_dct == 0) || ((user_param->verb == SEND && user_param->connection_type != DC))) {
+ if ((user_param->connection_type == DC && only_dct == 0) || (user_param->verb == SEND)){
ctx->recv_cq = ibv_create_cq(ctx->context,user_param->rx_depth*user_param->num_of_qps,NULL,ctx->channel,0);
if (!ctx->recv_cq) {
fprintf(stderr, "Couldn't create a receiver CQ\n");
@@ -1177,6 +1210,14 @@ int ctx_init(struct pingpong_context *ctx,struct perftest_parameters *user_param
fprintf(stderr," Unable to create Inline Recv QP.\n");
return FAILURE;
}
+ } else if (user_param->masked_atomics == 1) {
+ #ifdef HAVE_MASKED_ATOMICS
+ ctx->qp[i] = ctx_atomic_qp_create(ctx,user_param);
+ #endif
+ if (ctx->qp[i] == NULL) {
+ fprintf(stderr," Unable to create Masked Atomic QP.\n");
+ return FAILURE;
+ }
} else {
ctx->qp[i] = ctx_qp_create(ctx,user_param);
if (ctx->qp[i] == NULL) {
@@ -1271,6 +1312,70 @@ struct ibv_qp* ctx_qp_create(struct pingpong_context *ctx,
return qp;
}
+
+#ifdef HAVE_MASKED_ATOMICS
+/******************************************************************************
+ *
+ ******************************************************************************/
+struct ibv_qp* ctx_atomic_qp_create(struct pingpong_context *ctx,
+ struct perftest_parameters *user_param) {
+
+ struct ibv_exp_qp_init_attr attr;
+ struct ibv_qp* qp = NULL;
+ struct ibv_exp_device_attr dev_attr;
+
+ memset(&dev_attr, 0, sizeof(dev_attr));
+
+ dev_attr.comp_mask |= IBV_EXP_DEVICE_ATTR_EXT_ATOMIC_ARGS | IBV_EXP_DEVICE_ATTR_EXP_CAP_FLAGS;
+
+ if (ibv_exp_query_device(ctx->context, &dev_attr)) {
+ fprintf(stderr, "ibv_exp_query_device failed\n");
+ exit(1);
+ }
+
+ memset(&attr, 0, sizeof(struct ibv_exp_qp_init_attr));
+ attr.pd = ctx->pd;
+ attr.send_cq = ctx->send_cq;
+ attr.recv_cq = (user_param->verb == SEND) ? ctx->recv_cq : ctx->send_cq;
+ attr.cap.max_send_wr = user_param->tx_depth;
+ attr.cap.max_send_sge = MAX_SEND_SGE;
+ attr.cap.max_inline_data = user_param->inline_size;
+ attr.max_atomic_arg = pow(2,dev_attr.ext_atom.log_max_atomic_inline);
+ attr.exp_create_flags = IBV_EXP_QP_CREATE_ATOMIC_BE_REPLY;
+ attr.comp_mask = IBV_EXP_QP_INIT_ATTR_CREATE_FLAGS | IBV_EXP_QP_INIT_ATTR_PD;
+ attr.comp_mask |= IBV_EXP_QP_INIT_ATTR_ATOMICS_ARG;
+
+ if (user_param->use_srq && (user_param->tst == LAT || user_param->machine == SERVER || user_param->duplex == ON)) {
+ attr.srq = ctx->srq;
+ attr.cap.max_recv_wr = 0;
+ attr.cap.max_recv_sge = 0;
+ } else {
+ attr.srq = NULL;
+ attr.cap.max_recv_wr = user_param->rx_depth;
+ attr.cap.max_recv_sge = MAX_RECV_SGE;
+ }
+
+ switch (user_param->connection_type) {
+
+ case RC : attr.qp_type = IBV_QPT_RC; break;
+ case UC : attr.qp_type = IBV_QPT_UC; break;
+ case UD : attr.qp_type = IBV_QPT_UD; break;
+#ifdef HAVE_XRCD
+ case XRC : attr.qp_type = IBV_QPT_XRC; break;
+#endif
+#ifdef HAVE_RAW_ETH
+ case RawEth : attr.qp_type = IBV_QPT_RAW_PACKET; break;
+#endif
+ default: fprintf(stderr, "Unknown connection type \n");
+ return NULL;
+ }
+
+ qp = ibv_exp_create_qp(ctx->context, &attr);
+
+ return qp;
+}
+#endif
+
#ifdef HAVE_DC
/******************************************************************************
@@ -1309,8 +1414,10 @@ int ctx_modify_dc_qp_to_init(struct ibv_qp *qp,struct perftest_parameters *user_
if (user_param->dualport==ON) {
if (portindex % num_of_qps < num_of_qps_per_port) {
attr.port_num = user_param->ib_port;
+ user_param->port_by_qp[portindex] = 0;
} else {
attr.port_num = user_param->ib_port2;
+ user_param->port_by_qp[portindex] = 1;
}
portindex++;
@@ -1376,8 +1483,10 @@ int ctx_modify_qp_to_init(struct ibv_qp *qp,struct perftest_parameters *user_par
if (user_param->dualport==ON) {
if (portindex % num_of_qps < num_of_qps_per_port) {
attr.port_num = user_param->ib_port;
+ user_param->port_by_qp[portindex] = 0;
} else {
attr.port_num = user_param->ib_port2;
+ user_param->port_by_qp[portindex] = 1;
}
portindex++;
@@ -1393,7 +1502,7 @@ int ctx_modify_qp_to_init(struct ibv_qp *qp,struct perftest_parameters *user_par
if (user_param->connection_type == RawEth) {
flags = IBV_QP_STATE | IBV_QP_PORT;
#ifdef HAVE_VERBS_EXP
- exp_flags = init_flag | IBV_EXP_QP_STATE | IBV_EXP_QP_PORT;
+ exp_flags = init_flag | IBV_EXP_QP_STATE | IBV_EXP_QP_PKEY_INDEX;
#endif
} else if (user_param->connection_type == UD) {
@@ -1410,15 +1519,24 @@ int ctx_modify_qp_to_init(struct ibv_qp *qp,struct perftest_parameters *user_par
flags |= IBV_QP_ACCESS_FLAGS;
}
- #ifdef HAVE_VERBS_EXP
- if (init_flag != 0 && user_param->use_rss)
- ret = ibv_exp_modify_qp(qp,&exp_attr,exp_flags);
- else
- #endif
- ret = ibv_modify_qp(qp,&attr,flags);
+ #ifdef HAVE_MASKED_ATOMICS
+ if (user_param->masked_atomics)
+ {
+ exp_attr.qp_access_flags = IBV_ACCESS_REMOTE_ATOMIC | IBV_ACCESS_REMOTE_WRITE | IBV_ACCESS_REMOTE_READ;
+ exp_flags = IBV_EXP_QP_STATE | IBV_EXP_QP_PKEY_INDEX | IBV_EXP_QP_PORT | IBV_EXP_QP_ACCESS_FLAGS;
+ }
+ #endif
+
+ #ifdef HAVE_VERBS_EXP
+ if ( (init_flag != 0 && user_param->use_rss) || user_param->masked_atomics ) {
+ ret = ibv_exp_modify_qp(qp,&exp_attr,exp_flags);
+ }
+ else
+ #endif
+ ret = ibv_modify_qp(qp,&attr,flags);
if (ret) {
- fprintf(stderr, "Failed to modify QP to INIT\n");
+ fprintf(stderr, "Failed to modify QP to INIT, ret=%d\n",ret);
return 1;
}
return 0;
@@ -1519,7 +1637,8 @@ static int ctx_modify_qp_to_rtr(struct ibv_qp *qp,
if (user_param->connection_type != RawEth) {
attr->ah_attr.dlid = dest->lid;
- if (user_param->gid_index == DEF_GID_INDEX) {
+ if (((attr->ah_attr.port_num == user_param->ib_port) && (user_param->gid_index == DEF_GID_INDEX))
+ || ((attr->ah_attr.port_num == user_param->ib_port2) && (user_param->gid_index2 == DEF_GID_INDEX) && user_param->dualport)) {
attr->ah_attr.is_global = 0;
attr->ah_attr.sl = user_param->sl;
@@ -1528,7 +1647,7 @@ static int ctx_modify_qp_to_rtr(struct ibv_qp *qp,
attr->ah_attr.is_global = 1;
attr->ah_attr.grh.dgid = dest->gid;
- attr->ah_attr.grh.sgid_index = user_param->gid_index;
+ attr->ah_attr.grh.sgid_index = (attr->ah_attr.port_num == user_param->ib_port) ? user_param->gid_index : user_param->gid_index2;
attr->ah_attr.grh.hop_limit = 1;
attr->ah_attr.sl = 0;
}
@@ -1753,9 +1872,9 @@ void ctx_set_send_exp_wqes(struct pingpong_context *ctx,
for (i = 0; i < num_of_qps ; i++) {
memset(&ctx->exp_wr[i],0,sizeof(struct ibv_exp_send_wr));
- ctx->sge_list[i*user_param->post_list].addr = (uintptr_t)ctx->buf + (i*BUFF_SIZE(ctx->size));
+ ctx->sge_list[i*user_param->post_list].addr = (uintptr_t)ctx->buf + (i*BUFF_SIZE(ctx->size,ctx->cycle_buffer));
if (user_param->mac_fwd)
- ctx->sge_list[i*user_param->post_list].addr = (uintptr_t)ctx->buf + (num_of_qps + i)*BUFF_SIZE(ctx->size);
+ ctx->sge_list[i*user_param->post_list].addr = (uintptr_t)ctx->buf + (num_of_qps + i)*BUFF_SIZE(ctx->size,ctx->cycle_buffer);
if (user_param->verb == WRITE || user_param->verb == READ)
ctx->exp_wr[i*user_param->post_list].wr.rdma.remote_addr = rem_dest[xrc_offset + i].vaddr;
@@ -1767,7 +1886,7 @@ void ctx_set_send_exp_wqes(struct pingpong_context *ctx,
ctx->scnt[i] = 0;
ctx->ccnt[i] = 0;
- ctx->my_addr[i] = (uintptr_t)ctx->buf + (i*BUFF_SIZE(ctx->size));
+ ctx->my_addr[i] = (uintptr_t)ctx->buf + (i*BUFF_SIZE(ctx->size,ctx->cycle_buffer));
if (user_param->verb != SEND)
ctx->rem_addr[i] = rem_dest[xrc_offset + i].vaddr;
}
@@ -1781,8 +1900,9 @@ void ctx_set_send_exp_wqes(struct pingpong_context *ctx,
ctx->sge_list[i*user_param->post_list +j].addr = ctx->sge_list[i*user_param->post_list + (j-1)].addr;
- if ((user_param->tst == BW ) && user_param->size <= (cycle_buffer / 2))
- increase_loc_addr(&ctx->sge_list[i*user_param->post_list +j],user_param->size,j-1,ctx->my_addr[i],0);
+ if ((user_param->tst == BW ) && user_param->size <= (ctx->cycle_buffer / 2))
+ increase_loc_addr(&ctx->sge_list[i*user_param->post_list +j],user_param->size,
+ j-1,ctx->my_addr[i],0,ctx->cache_line_size,ctx->cycle_buffer);
}
ctx->exp_wr[i*user_param->post_list + j].sg_list = &ctx->sge_list[i*user_param->post_list + j];
@@ -1813,8 +1933,9 @@ void ctx_set_send_exp_wqes(struct pingpong_context *ctx,
ctx->exp_wr[i*user_param->post_list + j].wr.rdma.remote_addr = ctx->exp_wr[i*user_param->post_list + (j-1)].wr.rdma.remote_addr;
- if ((user_param->tst == BW) && user_param->size <= (cycle_buffer / 2))
- increase_exp_rem_addr(&ctx->exp_wr[i*user_param->post_list + j],user_param->size,j-1,ctx->rem_addr[i],WRITE);
+ if ((user_param->tst == BW) && user_param->size <= (ctx->cycle_buffer / 2))
+ increase_exp_rem_addr(&ctx->exp_wr[i*user_param->post_list + j],user_param->size,
+ j-1,ctx->rem_addr[i],WRITE,ctx->cache_line_size,ctx->cycle_buffer);
}
} else if (user_param->verb == ATOMIC) {
@@ -1825,7 +1946,8 @@ void ctx_set_send_exp_wqes(struct pingpong_context *ctx,
ctx->exp_wr[i*user_param->post_list + j].wr.atomic.remote_addr = ctx->exp_wr[i*user_param->post_list + j-1].wr.atomic.remote_addr;
if ((user_param->tst == BW))
- increase_exp_rem_addr(&ctx->exp_wr[i*user_param->post_list + j],user_param->size,j-1,ctx->rem_addr[i],ATOMIC);
+ increase_exp_rem_addr(&ctx->exp_wr[i*user_param->post_list + j],user_param->size,
+ j-1,ctx->rem_addr[i],ATOMIC,ctx->cache_line_size,ctx->cycle_buffer);
}
if (user_param->atomicType == FETCH_AND_ADD)
@@ -1898,9 +2020,9 @@ void ctx_set_send_reg_wqes(struct pingpong_context *ctx,
for (i = 0; i < num_of_qps ; i++) {
memset(&ctx->wr[i],0,sizeof(struct ibv_send_wr));
- ctx->sge_list[i*user_param->post_list].addr = (uintptr_t)ctx->buf + (i*BUFF_SIZE(ctx->size));
+ ctx->sge_list[i*user_param->post_list].addr = (uintptr_t)ctx->buf + (i*BUFF_SIZE(ctx->size,ctx->cycle_buffer));
if (user_param->mac_fwd)
- ctx->sge_list[i*user_param->post_list].addr = (uintptr_t)ctx->buf + (num_of_qps + i)*BUFF_SIZE(ctx->size);
+ ctx->sge_list[i*user_param->post_list].addr = (uintptr_t)ctx->buf + (num_of_qps + i)*BUFF_SIZE(ctx->size,ctx->cycle_buffer);
if (user_param->verb == WRITE || user_param->verb == READ)
ctx->wr[i*user_param->post_list].wr.rdma.remote_addr = rem_dest[xrc_offset + i].vaddr;
@@ -1912,7 +2034,7 @@ void ctx_set_send_reg_wqes(struct pingpong_context *ctx,
ctx->scnt[i] = 0;
ctx->ccnt[i] = 0;
- ctx->my_addr[i] = (uintptr_t)ctx->buf + (i*BUFF_SIZE(ctx->size));
+ ctx->my_addr[i] = (uintptr_t)ctx->buf + (i*BUFF_SIZE(ctx->size,ctx->cycle_buffer));
if (user_param->verb != SEND)
ctx->rem_addr[i] = rem_dest[xrc_offset + i].vaddr;
}
@@ -1926,8 +2048,9 @@ void ctx_set_send_reg_wqes(struct pingpong_context *ctx,
ctx->sge_list[i*user_param->post_list +j].addr = ctx->sge_list[i*user_param->post_list + (j-1)].addr;
- if ((user_param->tst == BW ) && user_param->size <= (cycle_buffer / 2))
- increase_loc_addr(&ctx->sge_list[i*user_param->post_list +j],user_param->size,j-1,ctx->my_addr[i],0);
+ if ((user_param->tst == BW ) && user_param->size <= (ctx->cycle_buffer / 2))
+ increase_loc_addr(&ctx->sge_list[i*user_param->post_list +j],user_param->size,
+ j-1,ctx->my_addr[i],0,ctx->cache_line_size,ctx->cycle_buffer);
}
ctx->wr[i*user_param->post_list + j].sg_list = &ctx->sge_list[i*user_param->post_list + j];
@@ -1958,8 +2081,9 @@ void ctx_set_send_reg_wqes(struct pingpong_context *ctx,
ctx->wr[i*user_param->post_list + j].wr.rdma.remote_addr = ctx->wr[i*user_param->post_list + (j-1)].wr.rdma.remote_addr;
- if ((user_param->tst == BW) && user_param->size <= (cycle_buffer / 2))
- increase_rem_addr(&ctx->wr[i*user_param->post_list + j],user_param->size,j-1,ctx->rem_addr[i],WRITE);
+ if ((user_param->tst == BW) && user_param->size <= (ctx->cycle_buffer / 2))
+ increase_rem_addr(&ctx->wr[i*user_param->post_list + j],user_param->size,
+ j-1,ctx->rem_addr[i],WRITE,ctx->cache_line_size,ctx->cycle_buffer);
}
} else if (user_param->verb == ATOMIC) {
@@ -1970,7 +2094,8 @@ void ctx_set_send_reg_wqes(struct pingpong_context *ctx,
ctx->wr[i*user_param->post_list + j].wr.atomic.remote_addr = ctx->wr[i*user_param->post_list + j-1].wr.atomic.remote_addr;
if ((user_param->tst == BW))
- increase_rem_addr(&ctx->wr[i*user_param->post_list + j],user_param->size,j-1,ctx->rem_addr[i],ATOMIC);
+ increase_rem_addr(&ctx->wr[i*user_param->post_list + j],user_param->size,
+ j-1,ctx->rem_addr[i],ATOMIC,ctx->cache_line_size,ctx->cycle_buffer);
}
if (user_param->atomicType == FETCH_AND_ADD)
@@ -2033,10 +2158,10 @@ int ctx_set_recv_wqes(struct pingpong_context *ctx,struct perftest_parameters *u
}
for (k = 0; i < user_param->num_of_qps; i++,k++) {
- ctx->recv_sge_list[i].addr = (uintptr_t)ctx->buf + (num_of_qps + k)*BUFF_SIZE(ctx->size);
+ ctx->recv_sge_list[i].addr = (uintptr_t)ctx->buf + (num_of_qps + k)*BUFF_SIZE(ctx->size,ctx->cycle_buffer);
if (user_param->connection_type == UD)
- ctx->recv_sge_list[i].addr += (CACHE_LINE_SIZE - UD_ADDITION);
+ ctx->recv_sge_list[i].addr += (ctx->cache_line_size - UD_ADDITION);
ctx->recv_sge_list[i].length = SIZE(user_param->connection_type,user_param->size,1);
ctx->recv_sge_list[i].lkey = ctx->mr->lkey;
@@ -2066,13 +2191,13 @@ int ctx_set_recv_wqes(struct pingpong_context *ctx,struct perftest_parameters *u
}
}
- if ((user_param->tst == BW) && user_param->size <= (cycle_buffer / 2)) {
+ if ((user_param->tst == BW) && user_param->size <= (ctx->cycle_buffer / 2)) {
increase_loc_addr(&ctx->recv_sge_list[i],
user_param->size,
j,
ctx->rx_buffer_addr[i],
- user_param->connection_type);
+ user_param->connection_type,ctx->cache_line_size,ctx->cycle_buffer);
}
}
}
@@ -2136,9 +2261,9 @@ int ctx_set_credit_wqes(struct pingpong_context *ctx,
static int clean_scq_credit(int send_cnt,struct pingpong_context *ctx,struct perftest_parameters *user_param)
{
- int i= 0, sne = 0;
- struct ibv_wc *swc = NULL;
-
+ int i= 0, sne = 0;
+ struct ibv_wc *swc = NULL;
+ int return_value = 0;
if (!send_cnt)
return 0;
@@ -2150,19 +2275,22 @@ static int clean_scq_credit(int send_cnt,struct pingpong_context *ctx,struct per
if (swc[i].status != IBV_WC_SUCCESS) {
fprintf(stderr, "Poll send CQ error status=%u qp %d\n",
swc[i].status,(int)swc[i].wr_id);
- return 1;
+ return_value = 1;
+ goto cleaning;
}
send_cnt--;
}
} else if (sne < 0) {
fprintf(stderr, "Poll send CQ to clean credit failed ne=%d\n",sne);
- return 1;
+ return_value = 1;
+ goto cleaning;
}
} while(send_cnt > 0);
+cleaning:
free(swc);
- return 0;
+ return return_value;
}
/******************************************************************************
@@ -2170,15 +2298,16 @@ static int clean_scq_credit(int send_cnt,struct pingpong_context *ctx,struct per
******************************************************************************/
int perform_warm_up(struct pingpong_context *ctx,struct perftest_parameters *user_param) {
- int ne,index,warmindex,warmupsession;
- int err = 0;
+ int ne,index,warmindex,warmupsession;
+ int err = 0;
#if defined(HAVE_VERBS_EXP)
- struct ibv_exp_send_wr *bad_exp_wr = NULL;
+ struct ibv_exp_send_wr *bad_exp_wr = NULL;
#endif
- struct ibv_send_wr *bad_wr = NULL;
- struct ibv_wc wc;
- struct ibv_wc *wc_for_cleaning = NULL;
- int num_of_qps = user_param->num_of_qps;
+ struct ibv_send_wr *bad_wr = NULL;
+ struct ibv_wc wc;
+ struct ibv_wc *wc_for_cleaning = NULL;
+ int num_of_qps = user_param->num_of_qps;
+ int return_value = 0;
if(user_param->duplex && (user_param->use_xrc || user_param->connection_type == DC))
num_of_qps /= 2;
@@ -2194,16 +2323,17 @@ int perform_warm_up(struct pingpong_context *ctx,struct perftest_parameters *use
for (warmindex = 0 ;warmindex < warmupsession ;warmindex += user_param->post_list) {
#if defined(HAVE_VERBS_EXP)
- if (user_param->use_exp == 1)
- err = (ctx->exp_post_send_func_pointer)(ctx->qp[index],&ctx->exp_wr[index*user_param->post_list],&bad_exp_wr);
- else
- err = (ctx->post_send_func_pointer)(ctx->qp[index],&ctx->wr[index*user_param->post_list],&bad_wr);
+ if (user_param->use_exp == 1)
+ err = (ctx->exp_post_send_func_pointer)(ctx->qp[index],&ctx->exp_wr[index*user_param->post_list],&bad_exp_wr);
+ else
+ err = (ctx->post_send_func_pointer)(ctx->qp[index],&ctx->wr[index*user_param->post_list],&bad_wr);
#else
err = ibv_post_send(ctx->qp[index],&ctx->wr[index*user_param->post_list],&bad_wr);
#endif
- if (err) {
- fprintf(stderr,"Couldn't post send during warm up: qp %d scnt=%d \n",index,warmindex);
- return 1;
+ if (err) {
+ fprintf(stderr,"Couldn't post send during warm up: qp %d scnt=%d \n",index,warmindex);
+ return_value = 1;
+ goto cleaning;
}
}
@@ -2212,19 +2342,25 @@ int perform_warm_up(struct pingpong_context *ctx,struct perftest_parameters *use
ne = ibv_poll_cq(ctx->send_cq,1,&wc);
if (ne > 0) {
- if (wc.status != IBV_WC_SUCCESS)
- return 1;
+ if (wc.status != IBV_WC_SUCCESS) {
+ return_value = 1;
+ goto cleaning;
+ }
warmindex -= user_param->post_list;
- } else if (ne < 0)
- return 1;
+ } else if (ne < 0) {
+ return_value = 1;
+ goto cleaning;
+ }
} while (warmindex);
}
+
+cleaning:
free(wc_for_cleaning);
- return 0;
+ return return_value;
}
/******************************************************************************
@@ -2232,28 +2368,29 @@ int perform_warm_up(struct pingpong_context *ctx,struct perftest_parameters *use
******************************************************************************/
int run_iter_bw(struct pingpong_context *ctx,struct perftest_parameters *user_param) {
- uint64_t totscnt = 0;
- uint64_t totccnt = 0;
- int i = 0;
- int index,ne;
- uint64_t tot_iters;
- int err = 0;
+ uint64_t totscnt = 0;
+ uint64_t totccnt = 0;
+ int i = 0;
+ int index,ne;
+ uint64_t tot_iters;
+ int err = 0;
#if defined(HAVE_VERBS_EXP)
- struct ibv_exp_send_wr *bad_exp_wr = NULL;
+ struct ibv_exp_send_wr *bad_exp_wr = NULL;
#endif
- struct ibv_send_wr *bad_wr = NULL;
- struct ibv_wc *wc = NULL;
- int num_of_qps = user_param->num_of_qps;
+ struct ibv_send_wr *bad_wr = NULL;
+ struct ibv_wc *wc = NULL;
+ int num_of_qps = user_param->num_of_qps;
/* Rate Limiter*/
- int rate_limit_pps = 0;
- double gap_time = 0; //in usec
- cycles_t gap_cycles = 0; //in cycles
- cycles_t gap_deadline = 0;
- unsigned int number_of_bursts = 0;
- int burst_iter = 0;
- int is_sending_burst = 0;
- int cpu_mhz = 0;
+ int rate_limit_pps = 0;
+ double gap_time = 0; //in usec
+ cycles_t gap_cycles = 0; //in cycles
+ cycles_t gap_deadline = 0;
+ unsigned int number_of_bursts = 0;
+ int burst_iter = 0;
+ int is_sending_burst = 0;
+ int cpu_mhz = 0;
+ int return_value = 0;
/**/
ALLOCATE(wc ,struct ibv_wc ,CTX_POLL_BATCH);
@@ -2279,7 +2416,8 @@ int run_iter_bw(struct pingpong_context *ctx,struct perftest_parameters *user_pa
if (user_param->test_type == DURATION && user_param->state != START_STATE && user_param->margin > 0) {
fprintf(stderr, "Failed: margin is not long enough (taking samples before warmup ends)\n");
fprintf(stderr, "Please increase margin or decrease tx_depth\n");
- return 1;
+ return_value = 1;
+ goto cleaning;
}
if (user_param->test_type == ITERATIONS && user_param->noPeak == ON)
@@ -2300,7 +2438,8 @@ int run_iter_bw(struct pingpong_context *ctx,struct perftest_parameters *user_pa
break;
default:
fprintf(stderr, " Failed: Unknown rate limit units\n");
- return 1;
+ return_value = 1;
+ goto cleaning;
}
cpu_mhz = get_cpu_mhz(user_param->cpu_freq_f);
if (cpu_mhz <= 0) {
@@ -2362,24 +2501,31 @@ int run_iter_bw(struct pingpong_context *ctx,struct perftest_parameters *user_pa
#endif
if (err) {
fprintf(stderr,"Couldn't post send: qp %d scnt=%lu \n",index,ctx->scnt[index]);
- return 1;
+ return_value = 1;
+ goto cleaning;
}
- if (user_param->post_list == 1 && user_param->size <= (cycle_buffer / 2)) {
+ if (user_param->post_list == 1 && user_param->size <= (ctx->cycle_buffer / 2)) {
#ifdef HAVE_VERBS_EXP
if (user_param->use_exp == 1)
- increase_loc_addr(ctx->exp_wr[index].sg_list,user_param->size,ctx->scnt[index],ctx->my_addr[index],0);
+ increase_loc_addr(ctx->exp_wr[index].sg_list,user_param->size,
+ ctx->scnt[index],ctx->my_addr[index],0,ctx->cache_line_size,ctx->cycle_buffer);
else
#endif
- increase_loc_addr(ctx->wr[index].sg_list,user_param->size,ctx->scnt[index],ctx->my_addr[index],0);
+ increase_loc_addr(ctx->wr[index].sg_list,user_param->size,ctx->scnt[index],
+ ctx->my_addr[index],0,ctx->cache_line_size,ctx->cycle_buffer);
if (user_param->verb != SEND) {
#ifdef HAVE_VERBS_EXP
if (user_param->use_exp == 1)
- increase_exp_rem_addr(&ctx->exp_wr[index],user_param->size,ctx->scnt[index],ctx->rem_addr[index],user_param->verb);
+ increase_exp_rem_addr(&ctx->exp_wr[index],user_param->size,
+ ctx->scnt[index],ctx->rem_addr[index],user_param->verb,ctx->cache_line_size,
+ ctx->cycle_buffer);
else
#endif
- increase_rem_addr(&ctx->wr[index],user_param->size,ctx->scnt[index],ctx->rem_addr[index],user_param->verb);
+ increase_rem_addr(&ctx->wr[index],user_param->size,
+ ctx->scnt[index],ctx->rem_addr[index],user_param->verb,ctx->cache_line_size,
+ ctx->cycle_buffer);
}
}
@@ -2410,7 +2556,8 @@ int run_iter_bw(struct pingpong_context *ctx,struct perftest_parameters *user_pa
if (user_param->use_event) {
if (ctx_notify_events(ctx->channel)) {
fprintf(stderr, "Couldn't request CQ notification\n");
- return 1;
+ return_value = 1;
+ goto cleaning;
}
}
@@ -2421,6 +2568,8 @@ int run_iter_bw(struct pingpong_context *ctx,struct perftest_parameters *user_pa
if (wc[i].status != IBV_WC_SUCCESS)
{
NOTIFY_COMP_ERROR_SEND(wc[i],totscnt,totccnt);
+ return_value = 1;
+ goto cleaning;
}
ctx->ccnt[(int)wc[i].wr_id] += user_param->cq_mod;
totccnt += user_param->cq_mod;
@@ -2434,12 +2583,19 @@ int run_iter_bw(struct pingpong_context *ctx,struct perftest_parameters *user_pa
}
if (user_param->test_type==DURATION && user_param->state == SAMPLE_STATE)
+ {
+ if (user_param->report_per_port)
+ {
+ user_param->iters_per_port[user_param->port_by_qp[(int)wc[i].wr_id]] += user_param->cq_mod;
+ }
user_param->iters += user_param->cq_mod;
+ }
}
} else if (ne < 0) {
fprintf(stderr, "poll CQ failed %d\n",ne);
- return 1;
+ return_value = 1;
+ goto cleaning;
}
}
}
@@ -2447,8 +2603,10 @@ int run_iter_bw(struct pingpong_context *ctx,struct perftest_parameters *user_pa
if (user_param->noPeak == ON && user_param->test_type == ITERATIONS)
user_param->tcompleted[0] = get_cycles();
+cleaning:
+
free(wc);
- return 0;
+ return return_value;
}
/******************************************************************************
@@ -2477,17 +2635,18 @@ static inline void set_on_first_rx_packet(struct perftest_parameters *user_param
******************************************************************************/
int run_iter_bw_server(struct pingpong_context *ctx, struct perftest_parameters *user_param)
{
- uint64_t rcnt = 0;
- int ne,i;
- uint64_t tot_iters;
+ uint64_t rcnt = 0;
+ int ne,i;
+ uint64_t tot_iters;
uint64_t *rcnt_for_qp = NULL;
struct ibv_wc *wc = NULL;
- struct ibv_recv_wr *bad_wr_recv = NULL;
- struct ibv_wc *swc = NULL;
- long *scredit_for_qp = NULL;
- int tot_scredit = 0;
- int firstRx = 1;
- int size_per_qp = (user_param->use_srq) ? user_param->rx_depth/user_param->num_of_qps : user_param->rx_depth;
+ struct ibv_recv_wr *bad_wr_recv = NULL;
+ struct ibv_wc *swc = NULL;
+ long *scredit_for_qp = NULL;
+ int tot_scredit = 0;
+ int firstRx = 1;
+ int size_per_qp = (user_param->use_srq) ? user_param->rx_depth/user_param->num_of_qps : user_param->rx_depth;
+ int return_value = 0;
ALLOCATE(wc ,struct ibv_wc ,CTX_POLL_BATCH);
ALLOCATE(swc ,struct ibv_wc ,user_param->tx_depth);
@@ -2503,12 +2662,21 @@ int run_iter_bw_server(struct pingpong_context *ctx, struct perftest_parameters
else
tot_iters = user_param->iters*user_param->num_of_qps;
+ if (user_param->test_type == ITERATIONS) {
+ check_alive_data.is_events = user_param->use_event;
+ signal(SIGALRM, check_alive);
+ alarm(60);
+ }
+
+ check_alive_data.g_total_iters = tot_iters;
+
while (rcnt < tot_iters || (user_param->test_type == DURATION && user_param->state != END_STATE)) {
if (user_param->use_event) {
if (ctx_notify_events(ctx->channel)) {
fprintf(stderr ," Failed to notify events to CQ");
- return 1;
+ return_value = 1;
+ goto cleaning;
}
}
@@ -2528,36 +2696,47 @@ int run_iter_bw_server(struct pingpong_context *ctx, struct perftest_parameters
if (wc[i].status != IBV_WC_SUCCESS) {
NOTIFY_COMP_ERROR_RECV(wc[i],rcnt_for_qp[0]);
+ return_value = 1;
+ goto cleaning;
}
rcnt_for_qp[wc[i].wr_id]++;
rcnt++;
+ check_alive_data.current_totrcnt = rcnt;
- if (user_param->test_type==DURATION && user_param->state == SAMPLE_STATE)
+ if (user_param->test_type==DURATION && user_param->state == SAMPLE_STATE)
+ {
+ if (user_param->report_per_port)
+ {
+ user_param->iters_per_port[user_param->port_by_qp[(int)wc[i].wr_id]]++;
+ }
user_param->iters++;
+ }
if (user_param->test_type==DURATION || rcnt_for_qp[wc[i].wr_id] + size_per_qp <= user_param->iters) {
if (user_param->use_srq) {
if (ibv_post_srq_recv(ctx->srq, &ctx->rwr[wc[i].wr_id],&bad_wr_recv)) {
fprintf(stderr, "Couldn't post recv SRQ. QP = %d: counter=%lu\n",(int)wc[i].wr_id,rcnt);
- return 1;
+ return_value = 1;
+ goto cleaning;
}
} else {
if (ibv_post_recv(ctx->qp[wc[i].wr_id],&ctx->rwr[wc[i].wr_id],&bad_wr_recv)) {
fprintf(stderr, "Couldn't post recv Qp=%d rcnt=%ld\n",(int)wc[i].wr_id,rcnt_for_qp[wc[i].wr_id]);
- return 15;
+ return_value = 15;
+ goto cleaning;
}
}
- if (SIZE(user_param->connection_type,user_param->size,!(int)user_param->machine) <= (cycle_buffer / 2)) {
+ if (SIZE(user_param->connection_type,user_param->size,!(int)user_param->machine) <= (ctx->cycle_buffer / 2)) {
increase_loc_addr(ctx->rwr[wc[i].wr_id].sg_list,
user_param->size,
rcnt_for_qp[wc[i].wr_id] + size_per_qp,
ctx->rx_buffer_addr[wc[i].wr_id],
- user_param->connection_type);
+ user_param->connection_type,ctx->cache_line_size,ctx->cycle_buffer);
}
}
@@ -2577,20 +2756,23 @@ int run_iter_bw_server(struct pingpong_context *ctx, struct perftest_parameters
fprintf(stderr, "Poll send CQ error status=%u qp %d credit=%lu scredit=%lu\n",
swc[j].status,(int)swc[j].wr_id,
rcnt_for_qp[swc[j].wr_id],scredit_for_qp[swc[j].wr_id]);
- return 1;
+ return_value = 1;
+ goto cleaning;
}
scredit_for_qp[swc[j].wr_id]--;
tot_scredit--;
}
} else if (sne < 0) {
fprintf(stderr, "Poll send CQ failed ne=%d\n",sne);
- return 1;
+ return_value = 1;
+ goto cleaning;
}
}
if (ibv_post_send(ctx->qp[wc[i].wr_id],&ctx->ctrl_wr[wc[i].wr_id],&bad_wr)) {
fprintf(stderr,"Couldn't post send qp %d credit = %lu\n",
(int)wc[i].wr_id,rcnt_for_qp[wc[i].wr_id]);
- return 1;
+ return_value = 1;
+ goto cleaning;
}
scredit_for_qp[wc[i].wr_id]++;
tot_scredit++;
@@ -2601,29 +2783,47 @@ int run_iter_bw_server(struct pingpong_context *ctx, struct perftest_parameters
} while (ne > 0);
- if (ne < 0) {
+ if (ne < 0)
+ {
fprintf(stderr, "Poll Recieve CQ failed %d\n", ne);
- return 1;
+ return_value = 1;
+ goto cleaning;
+ }
+ else if (ne == 0)
+ {
+ if (check_alive_data.to_exit)
+ {
+ user_param->check_alive_exited = 1;
+ return_value = 0;
+ goto cleaning;
+ }
}
+
+
+
}
if (user_param->test_type == ITERATIONS)
user_param->tcompleted[0] = get_cycles();
+cleaning:
if (ctx->send_rcredit) {
if (clean_scq_credit(tot_scredit, ctx, user_param))
- return 1;
+ return_value = 1;
}
+
/*
+ //print rcnt per rss child qp.
if (user_param->use_rss) {
for (i = 1; i < user_param->num_of_qps; i++)
fprintf(stderr,"child %d count = %ld\n",i,rcnt_for_qp[i]);
}*/
+ check_alive_data.last_totrcnt=0;
free(wc);
free(rcnt_for_qp);
free(swc);
free(scredit_for_qp);
- return 0;
+ return return_value;
}
/******************************************************************************
@@ -2631,16 +2831,17 @@ int run_iter_bw_server(struct pingpong_context *ctx, struct perftest_parameters
******************************************************************************/
int run_iter_bw_infinitely(struct pingpong_context *ctx,struct perftest_parameters *user_param)
{
- int i,j = 0;
- int index = 0,ne;
- int err = 0;
+ int i,j = 0;
+ int index = 0,ne;
+ int err = 0;
#if defined(HAVE_VERBS_EXP)
- struct ibv_exp_send_wr *bad_exp_wr = NULL;
+ struct ibv_exp_send_wr *bad_exp_wr = NULL;
#endif
- uint64_t *scnt_for_qp = NULL;
- struct ibv_send_wr *bad_wr = NULL;
- struct ibv_wc *wc = NULL;
- int num_of_qps = user_param->num_of_qps;
+ uint64_t *scnt_for_qp = NULL;
+ struct ibv_send_wr *bad_wr = NULL;
+ struct ibv_wc *wc = NULL;
+ int num_of_qps = user_param->num_of_qps;
+ int return_value = 0;
ALLOCATE(wc ,struct ibv_wc ,CTX_POLL_BATCH);
ALLOCATE(scnt_for_qp,uint64_t,user_param->num_of_qps);
@@ -2689,7 +2890,8 @@ int run_iter_bw_infinitely(struct pingpong_context *ctx,struct perftest_paramete
#endif
if (err) {
fprintf(stderr,"Couldn't post send: %d scnt=%lu \n",index,ctx->scnt[index]);
- return 1;
+ return_value = 1;
+ goto cleaning;
}
ctx->scnt[index] += user_param->post_list;
scnt_for_qp[index] += user_param->post_list;
@@ -2703,17 +2905,26 @@ int run_iter_bw_infinitely(struct pingpong_context *ctx,struct perftest_paramete
for (i = 0; i < ne; i++) {
if (wc[i].status != IBV_WC_SUCCESS)
+ {
NOTIFY_COMP_ERROR_SEND(wc[i],ctx->scnt[(int)wc[i].wr_id],ctx->scnt[(int)wc[i].wr_id]);
-
+ return_value = 1;
+ goto cleaning;
+ }
ctx->scnt[(int)wc[i].wr_id]--;
user_param->iters++;
}
} else if (ne < 0) {
fprintf(stderr, "poll CQ failed %d\n",ne);
- return 1;
+ return_value = 1;
+ goto cleaning;
}
}
+
+cleaning:
+ free(scnt_for_qp);
+ free(wc);
+ return return_value;
}
/******************************************************************************
@@ -2728,6 +2939,7 @@ int run_iter_bw_infinitely_server(struct pingpong_context *ctx, struct perftest_
uint64_t *rcnt_for_qp = NULL;
uint64_t *ccnt_for_qp = NULL;
int *scredit_for_qp = NULL;
+ int return_value = 0;
ALLOCATE(wc ,struct ibv_wc ,CTX_POLL_BATCH);
ALLOCATE(swc ,struct ibv_wc ,user_param->tx_depth);
@@ -2751,21 +2963,24 @@ int run_iter_bw_infinitely_server(struct pingpong_context *ctx, struct perftest_
if (wc[i].status != IBV_WC_SUCCESS) {
fprintf(stderr,"A completion with Error in run_infinitely_bw_server function");
- return 1;
+ return_value = 1;
+ goto cleaning;
}
if (user_param->use_srq) {
if (ibv_post_srq_recv(ctx->srq, &ctx->rwr[wc[i].wr_id],&bad_wr_recv)) {
fprintf(stderr, "Couldn't post recv SRQ. QP = %d:\n",(int)wc[i].wr_id);
- return 1;
+ return_value = 1;
+ goto cleaning;
}
} else {
if (ibv_post_recv(ctx->qp[wc[i].wr_id],&ctx->rwr[wc[i].wr_id],&bad_wr_recv)) {
fprintf(stderr, "Couldn't post recv Qp=%d\n",(int)wc[i].wr_id);
- return 15;
+ return_value = 15;
+ goto cleaning;
}
if (ctx->send_rcredit) {
rcnt_for_qp[wc[i].wr_id]++;
@@ -2785,20 +3000,23 @@ int run_iter_bw_infinitely_server(struct pingpong_context *ctx, struct perftest_
fprintf(stderr, "Poll send CQ error status=%u qp %d credit=%lu scredit=%lu\n",
swc[j].status,(int)swc[j].wr_id,
rcnt_for_qp[swc[j].wr_id],ccnt_for_qp[swc[j].wr_id]);
- return 1;
+ return_value = 1;
+ goto cleaning;
}
ccnt_for_qp[swc[j].wr_id]--;
}
} else if (sne < 0) {
fprintf(stderr, "Poll send CQ failed ne=%d\n",sne);
- return 1;
+ return_value = 1;
+ goto cleaning;
}
}
if (ibv_post_send(ctx->qp[wc[i].wr_id],&ctx->ctrl_wr[wc[i].wr_id],&bad_wr)) {
fprintf(stderr,"Couldn't post send qp %d credit=%lu\n",
(int)wc[i].wr_id,rcnt_for_qp[wc[i].wr_id]);
- return 1;
+ return_value = 1;
+ goto cleaning;
}
ccnt_for_qp[wc[i].wr_id]++;
scredit_for_qp[wc[i].wr_id] = 0;
@@ -2809,9 +3027,18 @@ int run_iter_bw_infinitely_server(struct pingpong_context *ctx, struct perftest_
} else if (ne < 0) {
fprintf(stderr, "Poll Recieve CQ failed %d\n", ne);
- return 1;
+ return_value = 1;
+ goto cleaning;
}
}
+
+cleaning:
+ free(wc);
+ free(swc);
+ free(rcnt_for_qp);
+ free(ccnt_for_qp);
+ free(scredit_for_qp);
+ return return_value;
}
/******************************************************************************
@@ -2820,28 +3047,29 @@ int run_iter_bw_infinitely_server(struct pingpong_context *ctx, struct perftest_
int run_iter_bi(struct pingpong_context *ctx,
struct perftest_parameters *user_param) {
- uint64_t totscnt = 0;
- uint64_t totccnt = 0;
- uint64_t totrcnt = 0;
- int i,index = 0;
- int ne = 0;
- int err = 0;
- uint64_t *rcnt_for_qp = NULL;
- uint64_t tot_iters = 0;
- uint64_t iters = 0;
- int tot_scredit = 0;
- int *scredit_for_qp = NULL;
- struct ibv_wc *wc = NULL;
- struct ibv_wc *wc_tx = NULL;
- struct ibv_recv_wr *bad_wr_recv = NULL;
+ uint64_t totscnt = 0;
+ uint64_t totccnt = 0;
+ uint64_t totrcnt = 0;
+ int i,index = 0;
+ int ne = 0;
+ int err = 0;
+ uint64_t *rcnt_for_qp = NULL;
+ uint64_t tot_iters = 0;
+ uint64_t iters = 0;
+ int tot_scredit = 0;
+ int *scredit_for_qp = NULL;
+ struct ibv_wc *wc = NULL;
+ struct ibv_wc *wc_tx = NULL;
+ struct ibv_recv_wr *bad_wr_recv = NULL;
#if defined(HAVE_VERBS_EXP)
- struct ibv_exp_send_wr *bad_exp_wr = NULL;
+ struct ibv_exp_send_wr *bad_exp_wr = NULL;
#endif
- struct ibv_send_wr *bad_wr = NULL;
- int num_of_qps = user_param->num_of_qps;
+ struct ibv_send_wr *bad_wr = NULL;
+ int num_of_qps = user_param->num_of_qps;
// This is to ensure SERVER will not start to send packets before CLIENT start the test.
- int before_first_rx = ON;
- int size_per_qp = (user_param->use_srq) ? user_param->rx_depth/user_param->num_of_qps : user_param->rx_depth;
+ int before_first_rx = ON;
+ int size_per_qp = (user_param->use_srq) ? user_param->rx_depth/user_param->num_of_qps : user_param->rx_depth;
+ int return_value = 0;
ALLOCATE(wc_tx,struct ibv_wc,CTX_POLL_BATCH);
ALLOCATE(rcnt_for_qp,uint64_t,user_param->num_of_qps);
@@ -2875,6 +3103,7 @@ int run_iter_bi(struct pingpong_context *ctx,
}
if (user_param->test_type == ITERATIONS) {
+ check_alive_data.is_events = user_param->use_event;
signal(SIGALRM, check_alive);
alarm(60);
}
@@ -2921,16 +3150,19 @@ int run_iter_bi(struct pingpong_context *ctx,
#endif
if (err) {
fprintf(stderr,"Couldn't post send: qp %d scnt=%lu \n",index,ctx->scnt[index]);
- return 1;
+ return_value = 1;
+ goto cleaning;
}
- if (user_param->post_list == 1 && user_param->size <= (cycle_buffer / 2)) {
+ if (user_param->post_list == 1 && user_param->size <= (ctx->cycle_buffer / 2)) {
#ifdef HAVE_VERBS_EXP
if (user_param->use_exp == 1)
- increase_loc_addr(ctx->exp_wr[index].sg_list,user_param->size,ctx->scnt[index],ctx->my_addr[index],0);
+ increase_loc_addr(ctx->exp_wr[index].sg_list,user_param->size,ctx->scnt[index],
+ ctx->my_addr[index],0,ctx->cache_line_size,ctx->cycle_buffer);
else
#endif
- increase_loc_addr(ctx->wr[index].sg_list,user_param->size,ctx->scnt[index],ctx->my_addr[index],0);
+ increase_loc_addr(ctx->wr[index].sg_list,user_param->size,ctx->scnt[index],
+ ctx->my_addr[index],0,ctx->cache_line_size,ctx->cycle_buffer);
}
ctx->scnt[index] += user_param->post_list;
@@ -2950,7 +3182,8 @@ int run_iter_bi(struct pingpong_context *ctx,
if (ctx_notify_events(ctx->channel)) {
fprintf(stderr,"Failed to notify events to CQ");
- return 1;
+ return_value = 1;
+ goto cleaning;
}
}
ne = ibv_poll_cq(ctx->recv_cq,user_param->rx_depth,wc);
@@ -2973,6 +3206,8 @@ int run_iter_bi(struct pingpong_context *ctx,
for (i = 0; i < ne; i++) {
if (wc[i].status != IBV_WC_SUCCESS) {
NOTIFY_COMP_ERROR_RECV(wc[i],totrcnt);
+ return_value = 1;
+ goto cleaning;
}
rcnt_for_qp[wc[i].wr_id]++;
@@ -2980,28 +3215,37 @@ int run_iter_bi(struct pingpong_context *ctx,
check_alive_data.current_totrcnt = totrcnt;
if (user_param->test_type==DURATION && user_param->state == SAMPLE_STATE)
+ {
+ if (user_param->report_per_port)
+ {
+ user_param->iters_per_port[user_param->port_by_qp[(int)wc[i].wr_id]]++;
+ }
user_param->iters++;
+ }
if (user_param->test_type==DURATION || rcnt_for_qp[wc[i].wr_id] + size_per_qp <= user_param->iters) {
if (user_param->use_srq) {
if (ibv_post_srq_recv(ctx->srq, &ctx->rwr[wc[i].wr_id],&bad_wr_recv)) {
fprintf(stderr, "Couldn't post recv SRQ. QP = %d: counter=%d\n",(int)wc[i].wr_id,(int)totrcnt);
- return 1;
+ return_value = 1;
+ goto cleaning;
}
} else {
if (ibv_post_recv(ctx->qp[wc[i].wr_id],&ctx->rwr[wc[i].wr_id],&bad_wr_recv)) {
fprintf(stderr, "Couldn't post recv Qp=%d rcnt=%lu\n",(int)wc[i].wr_id,rcnt_for_qp[wc[i].wr_id]);
- return 15;
+ return_value = 15;
+ goto cleaning;
}
}
- if (SIZE(user_param->connection_type,user_param->size,!(int)user_param->machine) <= (cycle_buffer / 2)) {
+ if (SIZE(user_param->connection_type,user_param->size,!(int)user_param->machine) <= (ctx->cycle_buffer / 2)) {
increase_loc_addr(ctx->rwr[wc[i].wr_id].sg_list,
user_param->size,
rcnt_for_qp[wc[i].wr_id] + size_per_qp -1,
- ctx->rx_buffer_addr[wc[i].wr_id],user_param->connection_type);
+ ctx->rx_buffer_addr[wc[i].wr_id],user_param->connection_type,
+ ctx->cache_line_size,ctx->cycle_buffer);
}
}
if (ctx->send_rcredit) {
@@ -3020,7 +3264,8 @@ int run_iter_bi(struct pingpong_context *ctx,
fprintf(stderr, "Poll send CQ error status=%u qp %d credit=%lu scredit=%d\n",
credit_wc.status,(int)credit_wc.wr_id,
rcnt_for_qp[credit_wc.wr_id],scredit_for_qp[credit_wc.wr_id]);
- return 1;
+ return_value = 1;
+ goto cleaning;
}
if (credit_wc.opcode == IBV_WC_RDMA_WRITE) {
@@ -3041,12 +3286,14 @@ int run_iter_bi(struct pingpong_context *ctx,
}
} else if (sne < 0) {
fprintf(stderr, "Poll send CQ ne=%d\n",sne);
- return 1;
+ return_value = 1;
+ goto cleaning;
}
}
if (ibv_post_send(ctx->qp[wc[i].wr_id],&ctx->ctrl_wr[wc[i].wr_id],&bad_wr)) {
fprintf(stderr,"Couldn't post send: qp%lu credit=%lu\n",wc[i].wr_id,rcnt_for_qp[wc[i].wr_id]);
- return 1;
+ return_value = 1;
+ goto cleaning;
}
scredit_for_qp[wc[i].wr_id]++;
tot_scredit++;
@@ -3056,7 +3303,16 @@ int run_iter_bi(struct pingpong_context *ctx,
} else if (ne < 0) {
fprintf(stderr, "poll CQ failed %d\n", ne);
- return FAILURE;
+ return_value = FAILURE;
+ goto cleaning;
+ }
+ else if (ne == 0) {
+ if (check_alive_data.to_exit)
+ {
+ user_param->check_alive_exited = 1;
+ return_value = 0;
+ goto cleaning;
+ }
}
ne = ibv_poll_cq(ctx->send_cq,CTX_POLL_BATCH,wc_tx);
@@ -3064,12 +3320,17 @@ int run_iter_bi(struct pingpong_context *ctx,
if (ne > 0) {
for (i = 0; i < ne; i++) {
if (wc_tx[i].status != IBV_WC_SUCCESS)
- NOTIFY_COMP_ERROR_SEND(wc_tx[i],totscnt,totccnt);
+ {
+ NOTIFY_COMP_ERROR_SEND(wc_tx[i],totscnt,totccnt);
+ return_value = 1;
+ goto cleaning;
+ }
if (wc_tx[i].opcode == IBV_WC_RDMA_WRITE) {
if (!ctx->send_rcredit) {
fprintf(stderr, "Polled RDMA_WRITE completion without recv credit request\n");
- return 1;
+ return_value = 1;
+ goto cleaning;
}
scredit_for_qp[wc_tx[i].wr_id]--;
tot_scredit--;
@@ -3084,14 +3345,22 @@ int run_iter_bi(struct pingpong_context *ctx,
else
user_param->tcompleted[totccnt-1] = get_cycles();
}
+
if (user_param->test_type==DURATION && user_param->state == SAMPLE_STATE)
+ {
+ if (user_param->report_per_port)
+ {
+ user_param->iters_per_port[user_param->port_by_qp[(int)wc[i].wr_id]] += user_param->cq_mod;
+ }
user_param->iters += user_param->cq_mod;
+ }
}
}
} else if (ne < 0) {
fprintf(stderr, "poll CQ failed %d\n", ne);
- return FAILURE;
+ return_value = FAILURE;
+ goto cleaning;
}
}
@@ -3101,15 +3370,17 @@ int run_iter_bi(struct pingpong_context *ctx,
if (ctx->send_rcredit) {
if (clean_scq_credit(tot_scredit, ctx, user_param))
- return 1;
+ return_value = 1;
+ goto cleaning;
}
+cleaning:
check_alive_data.last_totrcnt=0;
free(rcnt_for_qp);
free(scredit_for_qp);
free(wc);
free(wc_tx);
- return 0;
+ return return_value;
}
/******************************************************************************
@@ -3121,19 +3392,19 @@ int run_iter_lat_write(struct pingpong_context *ctx,struct perftest_parameters *
uint64_t ccnt = 0;
uint64_t rcnt = 0;
int ne;
- int err = 0;
- int poll_buf_offset = 0;
+ int err = 0;
+ int poll_buf_offset = 0;
volatile char *poll_buf = NULL;
volatile char *post_buf = NULL;
#if defined(HAVE_VERBS_EXP)
- struct ibv_exp_send_wr *bad_exp_wr = NULL;
+ struct ibv_exp_send_wr *bad_exp_wr = NULL;
#endif
struct ibv_send_wr *bad_wr = NULL;
struct ibv_wc wc;
- int cpu_mhz = get_cpu_mhz(user_param->cpu_freq_f);
- int total_gap_cycles = user_param->latency_gap * cpu_mhz;
- cycles_t end_cycle, start_gap=0;
+ int cpu_mhz = get_cpu_mhz(user_param->cpu_freq_f);
+ int total_gap_cycles = user_param->latency_gap * cpu_mhz;
+ cycles_t end_cycle, start_gap=0;
#ifdef HAVE_VERBS_EXP
if (user_param->use_exp == 1) {
@@ -3154,15 +3425,18 @@ int run_iter_lat_write(struct pingpong_context *ctx,struct perftest_parameters *
if((user_param->use_xrc || user_param->connection_type == DC))
poll_buf_offset = 1;
post_buf = (char*)ctx->buf + user_param->size - 1;
- poll_buf = (char*)ctx->buf + (user_param->num_of_qps + poll_buf_offset)*BUFF_SIZE(ctx->size) + user_param->size - 1;
+ poll_buf = (char*)ctx->buf + (user_param->num_of_qps + poll_buf_offset)*BUFF_SIZE(ctx->size,ctx->cycle_buffer) + user_param->size - 1;
// Duration support in latency tests.
if (user_param->test_type == DURATION) {
duration_param=user_param;
duration_param->state = START_STATE;
signal(SIGALRM, catch_alarm);
- alarm(user_param->margin);
user_param->iters = 0;
+ if (user_param->margin > 0)
+ alarm(user_param->margin);
+ else
+ catch_alarm(0);
}
/* Done with setup. Start the test. */
@@ -3188,18 +3462,18 @@ int run_iter_lat_write(struct pingpong_context *ctx,struct perftest_parameters *
user_param->tposted[scnt] = get_cycles();
*post_buf = (char)++scnt;
- #if defined(HAVE_VERBS_EXP)
+ #if defined(HAVE_VERBS_EXP)
if (user_param->use_exp == 1)
- err = (ctx->exp_post_send_func_pointer)(ctx->qp[0],&ctx->exp_wr[0],&bad_exp_wr);
+ err = (ctx->exp_post_send_func_pointer)(ctx->qp[0],&ctx->exp_wr[0],&bad_exp_wr);
else
err = (ctx->post_send_func_pointer)(ctx->qp[0],&ctx->wr[0],&bad_wr);
#else
err = ibv_post_send(ctx->qp[0],&ctx->wr[0],&bad_wr);
#endif
if (err) {
- fprintf(stderr,"Couldn't post send: scnt=%lu\n",scnt);
- return 1;
- }
+ fprintf(stderr,"Couldn't post send: scnt=%lu\n",scnt);
+ return 1;
+ }
}
if (user_param->test_type == DURATION && user_param->state == END_STATE)
@@ -3212,7 +3486,10 @@ int run_iter_lat_write(struct pingpong_context *ctx,struct perftest_parameters *
if(ne > 0) {
if (wc.status != IBV_WC_SUCCESS)
+ {
NOTIFY_COMP_ERROR_SEND(wc,scnt,ccnt);
+ return 1;
+ }
ccnt++;
if (user_param->test_type==DURATION && user_param->state == SAMPLE_STATE)
@@ -3232,18 +3509,18 @@ int run_iter_lat_write(struct pingpong_context *ctx,struct perftest_parameters *
******************************************************************************/
int run_iter_lat(struct pingpong_context *ctx,struct perftest_parameters *user_param)
{
- uint64_t scnt = 0;
- int ne;
- int err = 0;
+ uint64_t scnt = 0;
+ int ne;
+ int err = 0;
#if defined(HAVE_VERBS_EXP)
- struct ibv_exp_send_wr *bad_exp_wr = NULL;
+ struct ibv_exp_send_wr *bad_exp_wr = NULL;
#endif
- struct ibv_send_wr *bad_wr = NULL;
- struct ibv_wc wc;
+ struct ibv_send_wr *bad_wr = NULL;
+ struct ibv_wc wc;
- int cpu_mhz = get_cpu_mhz(user_param->cpu_freq_f);
- int total_gap_cycles = user_param->latency_gap * cpu_mhz;
- cycles_t end_cycle, start_gap=0;
+ int cpu_mhz = get_cpu_mhz(user_param->cpu_freq_f);
+ int total_gap_cycles = user_param->latency_gap * cpu_mhz;
+ cycles_t end_cycle, start_gap=0;
#ifdef HAVE_VERBS_EXP
if (user_param->use_exp == 1) {
@@ -3262,8 +3539,11 @@ int run_iter_lat(struct pingpong_context *ctx,struct perftest_parameters *user_p
duration_param=user_param;
duration_param->state = START_STATE;
signal(SIGALRM, catch_alarm);
- alarm(user_param->margin);
user_param->iters = 0;
+ if (user_param->margin > 0)
+ alarm(user_param->margin);
+ else
+ catch_alarm(0);
}
while (scnt < user_param->iters || (user_param->test_type == DURATION && user_param->state != END_STATE)) {
@@ -3279,15 +3559,15 @@ int run_iter_lat(struct pingpong_context *ctx,struct perftest_parameters *user_p
#if defined(HAVE_VERBS_EXP)
if (user_param->use_exp == 1)
- err = (ctx->exp_post_send_func_pointer)(ctx->qp[0],&ctx->exp_wr[0],&bad_exp_wr);
+ err = (ctx->exp_post_send_func_pointer)(ctx->qp[0],&ctx->exp_wr[0],&bad_exp_wr);
else
err = (ctx->post_send_func_pointer)(ctx->qp[0],&ctx->wr[0],&bad_wr);
#else
err = ibv_post_send(ctx->qp[0],&ctx->wr[0],&bad_wr);
#endif
if (err) {
- fprintf(stderr,"Couldn't post send: scnt=%lu\n",scnt);
- return 1;
+ fprintf(stderr,"Couldn't post send: scnt=%lu\n",scnt);
+ return 1;
}
if (user_param->test_type == DURATION && user_param->state == END_STATE)
@@ -3304,9 +3584,11 @@ int run_iter_lat(struct pingpong_context *ctx,struct perftest_parameters *user_p
ne = ibv_poll_cq(ctx->send_cq, 1, &wc);
if(ne > 0) {
- if (wc.status != IBV_WC_SUCCESS)
+ if (wc.status != IBV_WC_SUCCESS)
+ {
NOTIFY_COMP_ERROR_SEND(wc,scnt,scnt);
-
+ return 1;
+ }
if (user_param->test_type==DURATION && user_param->state == SAMPLE_STATE)
user_param->iters++;
@@ -3325,22 +3607,22 @@ int run_iter_lat(struct pingpong_context *ctx,struct perftest_parameters *user_p
******************************************************************************/
int run_iter_lat_send(struct pingpong_context *ctx,struct perftest_parameters *user_param)
{
- uint64_t scnt = 0; //sent packets counter
- uint64_t rcnt = 0; //received packets counter
- int poll = 0;
- int ne;
- int err = 0;
- struct ibv_wc wc;
- struct ibv_recv_wr *bad_wr_recv;
+ uint64_t scnt = 0; //sent packets counter
+ uint64_t rcnt = 0; //received packets counter
+ int poll = 0;
+ int ne;
+ int err = 0;
+ struct ibv_wc wc;
+ struct ibv_recv_wr *bad_wr_recv;
#if defined(HAVE_VERBS_EXP)
- struct ibv_exp_send_wr *bad_exp_wr;
+ struct ibv_exp_send_wr *bad_exp_wr;
#endif
- struct ibv_send_wr *bad_wr;
+ struct ibv_send_wr *bad_wr;
int firstRx = 1;
- int size_per_qp = (user_param->use_srq) ? user_param->rx_depth/user_param->num_of_qps : user_param->rx_depth;
- int cpu_mhz = get_cpu_mhz(user_param->cpu_freq_f);
- int total_gap_cycles = user_param->latency_gap * cpu_mhz;
- cycles_t end_cycle, start_gap=0;
+ int size_per_qp = (user_param->use_srq) ? user_param->rx_depth/user_param->num_of_qps : user_param->rx_depth;
+ int cpu_mhz = get_cpu_mhz(user_param->cpu_freq_f);
+ int total_gap_cycles = user_param->latency_gap * cpu_mhz;
+ cycles_t end_cycle, start_gap=0;
if (user_param->connection_type != RawEth) {
#if defined(HAVE_VERBS_EXP)
@@ -3396,8 +3678,10 @@ int run_iter_lat_send(struct pingpong_context *ctx,struct perftest_parameters *u
}
if (wc.status != IBV_WC_SUCCESS)
+ {
NOTIFY_COMP_ERROR_RECV(wc,rcnt);
-
+ return 1;
+ }
rcnt++;
if (user_param->test_type==DURATION && user_param->state == SAMPLE_STATE)
@@ -3455,19 +3739,18 @@ int run_iter_lat_send(struct pingpong_context *ctx,struct perftest_parameters *u
break;
//send the packet that's in index 0 on the buffer
- #if defined(HAVE_VERBS_EXP)
+ #if defined(HAVE_VERBS_EXP)
if (user_param->use_exp == 1)
- err = (ctx->exp_post_send_func_pointer)(ctx->qp[0],&ctx->exp_wr[0],&bad_exp_wr);
+ err = (ctx->exp_post_send_func_pointer)(ctx->qp[0],&ctx->exp_wr[0],&bad_exp_wr);
else
err = (ctx->post_send_func_pointer)(ctx->qp[0],&ctx->wr[0],&bad_wr);
#else
err = ibv_post_send(ctx->qp[0],&ctx->wr[0],&bad_wr);
#endif
if (err) {
- fprintf(stderr,"Couldn't post send: scnt=%lu \n",scnt);
- return 1;
- }
-
+ fprintf(stderr,"Couldn't post send: scnt=%lu \n",scnt);
+ return 1;
+ }
if (poll == 1) {
@@ -3494,8 +3777,10 @@ int run_iter_lat_send(struct pingpong_context *ctx,struct perftest_parameters *u
}
if (s_wc.status != IBV_WC_SUCCESS)
+ {
NOTIFY_COMP_ERROR_SEND(s_wc,scnt,scnt)
-
+ return 1;
+ }
poll = 0;
#if defined(HAVE_VERBS_EXP)
@@ -3558,8 +3843,17 @@ void check_alive(int sig) {
check_alive_data.last_totrcnt = check_alive_data.current_totrcnt;
alarm(60);
} else if (check_alive_data.current_totrcnt == check_alive_data.last_totrcnt && check_alive_data.current_totrcnt < check_alive_data.g_total_iters) {
- fprintf(stderr,"Did not get Message for 120 Seconds, exiting..\nTotal Received=%d , Total Iters Required=%d\n",check_alive_data.current_totrcnt, check_alive_data.g_total_iters);
- exit(1);
+ fprintf(stderr," Did not get Message for 120 Seconds, exiting..\n Total Received=%d, Total Iters Required=%d\n",check_alive_data.current_totrcnt, check_alive_data.g_total_iters);
+
+ if (check_alive_data.is_events)
+ { // Can't report BW, as we are stuck in event_loop
+ fprintf(stderr," Due to this issue, Perftest cannot produce a report when in event mode.\n");
+ exit(0);
+ }
+ else
+ { // exit nice from run_iter function and report known bw/mr
+ check_alive_data.to_exit = 1;
+ }
}
}
diff --git a/src/perftest_resources.h b/src/perftest_resources.h
index 66898f3..23f8ee3 100755
--- a/src/perftest_resources.h
+++ b/src/perftest_resources.h
@@ -66,7 +66,6 @@
#include "perftest_parameters.h"
-#define CACHE_LINE_SIZE (64)
#define NUM_OF_RETRIES (10)
@@ -90,18 +89,16 @@
#define CLIENT_FD "/tmp/xrc_domain_client"
#endif
-//global variables
-extern int cycle_buffer;
#define NOTIFY_COMP_ERROR_SEND(wc,scnt,ccnt) \
{ fprintf(stderr," Completion with error at client\n"); \
fprintf(stderr," Failed status %d: wr_id %d syndrom 0x%x\n",wc.status,(int) wc.wr_id,wc.vendor_err); \
- fprintf(stderr, "scnt=%lu, ccnt=%lu\n",scnt, ccnt); return 1;}
+ fprintf(stderr, "scnt=%lu, ccnt=%lu\n",scnt, ccnt); }
#define NOTIFY_COMP_ERROR_RECV(wc,rcnt) \
{ fprintf(stderr," Completion with error at server\n"); \
fprintf(stderr," Failed status %d: wr_id %d syndrom 0x%x\n",wc.status,(int) wc.wr_id,wc.vendor_err); \
- fprintf(stderr," rcnt=%lu\n",rcnt); return 1;}
+ fprintf(stderr," rcnt=%lu\n",rcnt); }
// Macro to determine packet size in case of UD.
// The UD addition is for the GRH .
@@ -110,15 +107,15 @@ extern int cycle_buffer;
// Macro to define the buffer size (according to "Nahalem" chip set).
// for small message size (under 4K) , we allocate 4K buffer , and the RDMA write
// verb will write in cycle on the buffer. this improves the BW in "Nahalem" systems.
-#define BUFF_SIZE(size) ((size < cycle_buffer) ? (cycle_buffer) : (size))
+#define BUFF_SIZE(size,cycle_buffer) ((size < cycle_buffer) ? (cycle_buffer) : (size))
// UD addition to the buffer.
-#define IF_UD_ADD(type) ((type == UD) ? (CACHE_LINE_SIZE) : (0))
+#define IF_UD_ADD(type,cache_line_size) ((type == UD) ? (cache_line_size) : (0))
// Macro that defines the adress where we write in RDMA.
// If message size is smaller then CACHE_LINE size then we write in CACHE_LINE jumps.
-#define INC(size) ((size > CACHE_LINE_SIZE) ? ((size%CACHE_LINE_SIZE == 0) ? \
- (size) : (CACHE_LINE_SIZE*(size/CACHE_LINE_SIZE+1))) : (CACHE_LINE_SIZE))
+#define INC(size,cache_line_size) ((size > cache_line_size) ? ((size%cache_line_size == 0) ? \
+ (size) : (cache_line_size*(size/cache_line_size+1))) : (cache_line_size))
#define UD_MSG_2_EXP(size) ((log(size))/(log(2)))
@@ -165,6 +162,8 @@ struct pingpong_context {
struct ibv_send_wr *ctrl_wr;
int send_rcredit;
int credit_cnt;
+ int cache_line_size;
+ int cycle_buffer;
#ifdef HAVE_XRCD
struct ibv_xrcd *xrc_domain;
int fd;
@@ -182,9 +181,10 @@ struct pingpong_context {
int qpn;
int psn;
unsigned rkey;
- unsigned long long vaddr;
- union ibv_gid gid;
+ unsigned long long vaddr;
+ union ibv_gid gid;
unsigned srqn;
+ int gid_index;
};
/******************************************************************************
@@ -643,15 +643,15 @@ void gen_udp_header(void* UDP_header_buffer,int* sPort ,int* dPort,uint32_t sadd
*/
#if defined(HAVE_VERBS_EXP)
-static __inline void increase_exp_rem_addr(struct ibv_exp_send_wr *wr,int size,uint64_t scnt,uint64_t prim_addr,VerbType verb) {
+static __inline void increase_exp_rem_addr(struct ibv_exp_send_wr *wr,int size,uint64_t scnt,uint64_t prim_addr,VerbType verb, int cache_line_size, int cycle_buffer) {
if (verb == ATOMIC)
- wr->wr.atomic.remote_addr += INC(size);
+ wr->wr.atomic.remote_addr += INC(size,cache_line_size);
else
- wr->wr.rdma.remote_addr += INC(size);
+ wr->wr.rdma.remote_addr += INC(size,cache_line_size);
- if ( ((scnt+1) % (cycle_buffer/ INC(size))) == 0) {
+ if ( ((scnt+1) % (cycle_buffer/ INC(size,cache_line_size))) == 0) {
if (verb == ATOMIC)
wr->wr.atomic.remote_addr = prim_addr;
@@ -661,15 +661,15 @@ static __inline void increase_exp_rem_addr(struct ibv_exp_send_wr *wr,int size,u
}
}
#endif
-static __inline void increase_rem_addr(struct ibv_send_wr *wr,int size,uint64_t scnt,uint64_t prim_addr,VerbType verb) {
+static __inline void increase_rem_addr(struct ibv_send_wr *wr,int size,uint64_t scnt,uint64_t prim_addr,VerbType verb, int cache_line_size, int cycle_buffer) {
if (verb == ATOMIC)
- wr->wr.atomic.remote_addr += INC(size);
+ wr->wr.atomic.remote_addr += INC(size,cache_line_size);
else
- wr->wr.rdma.remote_addr += INC(size);
+ wr->wr.rdma.remote_addr += INC(size,cache_line_size);
- if ( ((scnt+1) % (cycle_buffer/ INC(size))) == 0) {
+ if ( ((scnt+1) % (cycle_buffer/ INC(size,cache_line_size))) == 0) {
if (verb == ATOMIC)
wr->wr.atomic.remote_addr = prim_addr;
@@ -693,11 +693,11 @@ static __inline void increase_rem_addr(struct ibv_send_wr *wr,int size,uint64_t
* prim_addr - The address of the original buffer.
* server_is_ud - Indication to weather we are in UD mode.
*/
-static __inline void increase_loc_addr(struct ibv_sge *sg,int size,uint64_t rcnt,uint64_t prim_addr,int server_is_ud) {
+static __inline void increase_loc_addr(struct ibv_sge *sg,int size,uint64_t rcnt,uint64_t prim_addr,int server_is_ud, int cache_line_size, int cycle_buffer) {
- sg->addr += INC(size);
+ sg->addr += INC(size,cache_line_size);
- if ( ((rcnt+1) % (cycle_buffer/ INC(size))) == 0 )
+ if ( ((rcnt+1) % (cycle_buffer/ INC(size,cache_line_size))) == 0 )
sg->addr = prim_addr;
}
@@ -742,6 +742,11 @@ void catch_alarm_infintely(int sig) ;
int ctx_modify_dc_qp_to_init(struct ibv_qp *qp,struct perftest_parameters *user_param);
int perform_warm_up(struct pingpong_context *ctx,struct perftest_parameters *user_param);
+
+#ifdef HAVE_MASKED_ATOMICS
+struct ibv_qp* ctx_atomic_qp_create(struct pingpong_context *ctx,
+ struct perftest_parameters *user_param);
+#endif
/******************************************************************************
*
******************************************************************************/
diff --git a/src/raw_ethernet_resources.c b/src/raw_ethernet_resources.c
index 8acd928..18c9776 100755
--- a/src/raw_ethernet_resources.c
+++ b/src/raw_ethernet_resources.c
@@ -50,18 +50,23 @@
struct perftest_parameters* duration_param;
int check_flow_steering_support() {
- char* file_name = "/sys/module/mlx4_core/parameters/log_num_mgm_entry_size";
- FILE *fp;
- char line[3];
- fp = fopen(file_name, "r"); //open file , read only
- fgets(line,3,fp);
- if (strcmp(line,"-7") && strcmp(line,"-1")) {
- fprintf(stderr,"flow steering is not supported.\n");
- fprintf(stderr,"please add to /etc/modprobe.d/mlnx.conf : options mlx4_core log_num_mgm_entry_size=-1\n");
- fprintf(stderr,"and restart the driver: /etc/init.d/openibd restart \n");
- return 1;
- }
- return 0;
+ char* file_name = "/sys/module/mlx4_core/parameters/log_num_mgm_entry_size";
+ FILE *fp;
+ char line[4];
+ fp = fopen(file_name, "r"); //open file , read only
+ fgets(line,4,fp);
+ int val = atoi(line);
+
+ if (val >= 0) {
+ fprintf(stderr,"flow steering is not supported.\n");
+ fprintf(stderr," please run: echo options mlx4_core log_num_mgm_entry_size=-1 >> /etc/modprobe.d/mlnx.conf\n");
+ fprintf(stderr," and restart the driver: /etc/init.d/openibd restart \n");
+ fclose(fp);
+ return 1;
+ }
+
+ fclose(fp);
+ return 0;
}
@@ -194,6 +199,11 @@ void print_spec(struct ibv_flow_attr* flow_rules,struct perftest_parameters* use
#endif
void* header_buff = (void*)flow_rules;
+ if (user_param->output != FULL_VERBOSITY)
+ {
+ return;
+ }
+
if (flow_rules == NULL) {
printf("error : spec is NULL\n");
return;
@@ -360,6 +370,11 @@ void print_tcp_header(struct TCP_header* tcp_header)
void print_pkt(void* pkt,struct perftest_parameters *user_param)
{
+ if (user_param->output != FULL_VERBOSITY)
+ {
+ return;
+ }
+
if(NULL == pkt)
{
printf("pkt is null:error happened can't print packet\n");
@@ -440,9 +455,9 @@ void create_raw_eth_pkt( struct perftest_parameters *user_param,
if (user_param->tst == BW) {
//fill ctx buffer with same packets
- if (ctx->size <= (cycle_buffer / 2)) {
- while (offset < cycle_buffer-INC(ctx->size)) {
- offset += INC(ctx->size);
+ if (ctx->size <= (ctx->cycle_buffer / 2)) {
+ while (offset < ctx->cycle_buffer-INC(ctx->size,ctx->cache_line_size)) {
+ offset += INC(ctx->size,ctx->cache_line_size);
eth_header = (void*)ctx->buf+offset;
build_pkt_on_buffer(eth_header,my_dest_info,rem_dest_info,
user_param,eth_type,ip_next_protocol,
@@ -650,24 +665,25 @@ int calc_flow_rules_size(int is_ip_header,int is_udp_header)
******************************************************************************/
int run_iter_fw(struct pingpong_context *ctx,struct perftest_parameters *user_param)
{
- uint64_t totscnt = 0;
- uint64_t totccnt = 0;
- uint64_t totrcnt = 0;
- int i,index = 0;
- int ne = 0;
- int err = 0;
- uint64_t *rcnt_for_qp = NULL;
- uint64_t tot_iters = 0;
- uint64_t iters = 0;
- struct ibv_wc *wc = NULL;
- struct ibv_wc *wc_tx = NULL;
+ uint64_t totscnt = 0;
+ uint64_t totccnt = 0;
+ uint64_t totrcnt = 0;
+ int i,index = 0;
+ int ne = 0;
+ int err = 0;
+ uint64_t *rcnt_for_qp = NULL;
+ uint64_t tot_iters = 0;
+ uint64_t iters = 0;
+ struct ibv_wc *wc = NULL;
+ struct ibv_wc *wc_tx = NULL;
struct ibv_recv_wr *bad_wr_recv = NULL;
#if defined(HAVE_VERBS_EXP)
struct ibv_exp_send_wr *bad_exp_wr = NULL;
#endif
struct ibv_send_wr *bad_wr = NULL;
- int firstRx = 1;
- int rwqe_sent = user_param->rx_depth;
+ int firstRx = 1;
+ int rwqe_sent = user_param->rx_depth;
+ int return_value = 0;
ALLOCATE(wc,struct ibv_wc,CTX_POLL_BATCH);
ALLOCATE(wc_tx,struct ibv_wc,CTX_POLL_BATCH);
@@ -725,16 +741,19 @@ int run_iter_fw(struct pingpong_context *ctx,struct perftest_parameters *user_pa
#endif
if(err) {
fprintf(stderr,"Couldn't post send: qp %d scnt=%lu \n",index,ctx->scnt[index]);
- return 1;
+ return_value = 1;
+ goto cleaning;
}
- if (user_param->post_list == 1 && user_param->size <= (cycle_buffer / 2)) {
+ if (user_param->post_list == 1 && user_param->size <= (ctx->cycle_buffer / 2)) {
#ifdef HAVE_VERBS_EXP
if (user_param->use_exp == 1)
- increase_loc_addr(ctx->exp_wr[index].sg_list,user_param->size,ctx->scnt[index],ctx->my_addr[index],0);
+ increase_loc_addr(ctx->exp_wr[index].sg_list,user_param->size,
+ ctx->scnt[index],ctx->my_addr[index],0,ctx->cache_line_size,ctx->cycle_buffer);
else
#endif
- increase_loc_addr(ctx->wr[index].sg_list,user_param->size,ctx->scnt[index],ctx->my_addr[index],0);
+ increase_loc_addr(ctx->wr[index].sg_list,user_param->size,
+ ctx->scnt[index],ctx->my_addr[index],0,ctx->cache_line_size,ctx->cycle_buffer);
}
ctx->scnt[index] += user_param->post_list;
totscnt += user_param->post_list;
@@ -754,7 +773,8 @@ int run_iter_fw(struct pingpong_context *ctx,struct perftest_parameters *user_pa
if (ctx_notify_events(ctx->channel)) {
fprintf(stderr,"Failed to notify events to CQ");
- return 1;
+ return_value = 1;
+ goto cleaning;
}
}
@@ -780,7 +800,8 @@ int run_iter_fw(struct pingpong_context *ctx,struct perftest_parameters *user_pa
}
} else if (ne < 0) {
fprintf(stderr, "poll CQ failed %d\n", ne);
- return 1;
+ return_value = 1;
+ goto cleaning;
}
}
if ((totccnt < tot_iters) || (user_param->test_type == DURATION && user_param->state != END_STATE)) {
@@ -806,19 +827,22 @@ int run_iter_fw(struct pingpong_context *ctx,struct perftest_parameters *user_pa
}
} else if (ne < 0) {
fprintf(stderr, "poll CQ failed %d\n", ne);
- return 1;
+ return_value = 1;
+ goto cleaning;
}
while (rwqe_sent - totccnt < user_param->rx_depth) { // Post more than buffer_size
if (user_param->test_type==DURATION || rcnt_for_qp[0] + user_param->rx_depth <= user_param->iters) {
if (ibv_post_recv(ctx->qp[0],&ctx->rwr[0],&bad_wr_recv)) {
fprintf(stderr, "Couldn't post recv Qp=%d rcnt=%lu\n",0,rcnt_for_qp[0]);
- return 15;
+ return_value = 15;
+ goto cleaning;
}
- if (SIZE(user_param->connection_type,user_param->size,!(int)user_param->machine) <= (cycle_buffer / 2)) {
+ if (SIZE(user_param->connection_type,user_param->size,!(int)user_param->machine) <= (ctx->cycle_buffer / 2)) {
increase_loc_addr(ctx->rwr[0].sg_list,
user_param->size,
rwqe_sent ,
- ctx->rx_buffer_addr[0],user_param->connection_type);
+ ctx->rx_buffer_addr[0],user_param->connection_type,
+ ctx->cache_line_size,ctx->cycle_buffer);
}
}
rwqe_sent++;
@@ -831,8 +855,9 @@ int run_iter_fw(struct pingpong_context *ctx,struct perftest_parameters *user_pa
if (user_param->noPeak == ON && user_param->test_type == ITERATIONS)
user_param->tcompleted[0] = get_cycles();
+cleaning:
free(rcnt_for_qp);
free(wc);
free(wc_tx);
- return 0;
+ return return_value;
}
diff --git a/src/raw_ethernet_resources.h b/src/raw_ethernet_resources.h
index 5816c22..e25ec31 100644
--- a/src/raw_ethernet_resources.h
+++ b/src/raw_ethernet_resources.h
@@ -13,6 +13,7 @@
#include "perftest_resources.h"
#include "multicast_resources.h"
#include "perftest_communication.h"
+#include <asm/byteorder.h>
#define INFO "INFO"
#define TRACE "TRACE"
@@ -58,8 +59,13 @@ struct ETH_header {
}__attribute__((packed));
struct IP_V4_header{
- uint8_t ihl:4;
- uint8_t version:4;
+#if defined(__LITTLE_ENDIAN_BITFIELD)
+ uint8_t ihl:4;
+ uint8_t version:4;
+#elif defined(__BIG_ENDIAN_BITFIELD)
+ uint8_t version:4;
+ uint8_t ihl:4;
+#endif
uint8_t tos;
uint16_t tot_len;
uint16_t id;
diff --git a/src/raw_ethernet_send_bw.c b/src/raw_ethernet_send_bw.c
index 6fc25ad..df70b26 100755
--- a/src/raw_ethernet_send_bw.c
+++ b/src/raw_ethernet_send_bw.c
@@ -63,11 +63,14 @@ int main(int argc, char *argv[]) {
#ifdef HAVE_RAW_ETH_EXP
struct ibv_exp_flow *flow_create_result = NULL;
struct ibv_exp_flow_attr *flow_rules = NULL;
+ struct ibv_exp_flow *flow_promisc = NULL;
#else
struct ibv_flow *flow_create_result = NULL;
struct ibv_flow_attr *flow_rules = NULL;
#endif
+ union ibv_gid mgid;
+
/* init default values to user's parameters */
memset(&ctx, 0,sizeof(struct pingpong_context));
memset(&user_param, 0 , sizeof(struct perftest_parameters));
@@ -93,8 +96,39 @@ int main(int argc, char *argv[]) {
return 1;
}
+ //Multicast stuff
+ if (user_param.raw_mcast)
+ {
+ //Transform IPv4 to Multicast MAC
+ user_param.dest_mac[0] = 0x01;
+ user_param.dest_mac[1] = 0x00;
+ user_param.dest_mac[2] = 0x5e;
+ user_param.dest_mac[3] = (user_param.server_ip >> 8) & 0x7f;
+ user_param.dest_mac[4] = (user_param.server_ip >> 16) & 0xff;
+ user_param.dest_mac[5] = (user_param.server_ip >> 24) & 0xff;
+
+ /* Build up MGID (128bits, 16bytes) */
+ memset (&mgid, 0, sizeof (union ibv_gid));
+ memcpy (&mgid.raw[10], &user_param.dest_mac[0], 6);
+
+ //Multicast send so no response UDP port
+ user_param.client_port = 0;
+
+ }
+
if (user_param.use_rss)
- user_param.num_of_qps = 3; //parent rss and 2 child_rx
+ {
+ //if num_of_qps is not even, set it to 2.
+ //need to add a check if num_of_qps is in 2^n form.
+ if (user_param.num_of_qps % 2)
+ {
+ user_param.num_of_qps = 2;
+ }
+
+ //add another one for rss parent QP
+ user_param.num_of_qps += 1; //parent rss + 2^n child_rx
+ }
+
// Finding the IB device selected (or default if no selected).
ib_dev = ctx_find_dev(user_param.ib_devname);
if (!ib_dev) {
@@ -126,7 +160,7 @@ int main(int argc, char *argv[]) {
return 1;
}
- if(user_param.machine == SERVER || user_param.duplex) {
+ if ( !user_param.raw_mcast && (user_param.machine == SERVER || user_param.duplex)) {
print_spec(flow_rules,&user_param);
}
@@ -159,33 +193,11 @@ int main(int argc, char *argv[]) {
}
}
- //attaching the qp to the spec
- if(user_param.machine == SERVER || user_param.duplex) {
- #ifdef HAVE_RAW_ETH_EXP
- flow_create_result = ibv_exp_create_flow(ctx.qp[0], flow_rules);
- #else
- flow_create_result = ibv_create_flow(ctx.qp[0], flow_rules);
- #endif
- if (!flow_create_result){
- perror("error");
- fprintf(stderr, "Couldn't attach QP\n");
- return FAILURE;
- }
- }
-
//build raw Ethernet packets on ctx buffer
if((user_param.machine == CLIENT || user_param.duplex) && !user_param.mac_fwd){
create_raw_eth_pkt(&user_param,&ctx, &my_dest_info , &rem_dest_info);
}
- if (user_param.output == FULL_VERBOSITY) {
- printf(RESULT_LINE);
- if (user_param.raw_qos)
- printf((user_param.report_fmt == MBS ? RESULT_FMT_QOS : RESULT_FMT_G_QOS));
- else
- printf((user_param.report_fmt == MBS ? RESULT_FMT : RESULT_FMT_G));
- printf((user_param.cpu_util_data.enable ? RESULT_EXT_CPU_UTIL : RESULT_EXT));
- }
// Prepare IB resources for rtr/rts.
if (user_param.work_rdma_cm == OFF) {
if (ctx_connect(&ctx,NULL,&user_param,NULL)) {
@@ -194,6 +206,67 @@ int main(int argc, char *argv[]) {
return 1;
}
}
+
+ if (user_param.raw_mcast)
+ {
+ if (user_param.machine == SERVER)
+ {
+ //join Multicast group by MGID
+ ibv_attach_mcast(ctx.qp[0], &mgid, 0);
+ printf(PERF_RAW_MGID_FMT,"MGID",
+ mgid.raw[0], mgid.raw[1],
+ mgid.raw[2], mgid.raw[3],
+ mgid.raw[4], mgid.raw[5],
+ mgid.raw[6], mgid.raw[7],
+ mgid.raw[8], mgid.raw[9],
+ mgid.raw[10],mgid.raw[11],
+ mgid.raw[12],mgid.raw[13],
+ mgid.raw[14],mgid.raw[15]);
+ }
+ }
+ else
+ {
+ //attaching the qp to the spec
+ if(user_param.machine == SERVER || user_param.duplex) {
+ #ifdef HAVE_RAW_ETH_EXP
+ flow_create_result = ibv_exp_create_flow(ctx.qp[0], flow_rules);
+ #else
+ flow_create_result = ibv_create_flow(ctx.qp[0], flow_rules);
+ #endif
+ if (!flow_create_result){
+ perror("error");
+ fprintf(stderr, "Couldn't attach QP\n");
+ return FAILURE;
+ }
+
+ #ifdef HAVE_RAW_ETH_EXP
+ if (user_param.use_promiscuous) {
+ struct ibv_exp_flow_attr attr = {
+ .type = IBV_EXP_FLOW_ATTR_ALL_DEFAULT,
+ .num_of_specs = 0,
+ .port = user_param.ib_port,
+ .flags = 0
+ };
+
+ if ((flow_promisc = ibv_exp_create_flow(ctx.qp[0], &attr)) == NULL) {
+ perror("error");
+ fprintf(stderr, "Couldn't attach promiscous rule QP\n");
+ }
+ }
+ #endif
+
+ }
+ }
+
+ if (user_param.output == FULL_VERBOSITY) {
+ printf(RESULT_LINE);
+ if (user_param.raw_qos)
+ printf((user_param.report_fmt == MBS ? RESULT_FMT_QOS : RESULT_FMT_G_QOS));
+ else
+ printf((user_param.report_fmt == MBS ? RESULT_FMT : RESULT_FMT_G));
+ printf((user_param.cpu_util_data.enable ? RESULT_EXT_CPU_UTIL : RESULT_EXT));
+ }
+
if (user_param.test_method == RUN_REGULAR) {
if (user_param.machine == CLIENT || user_param.duplex) {
ctx_set_send_wqes(&ctx,&user_param,NULL);
@@ -267,16 +340,38 @@ int main(int argc, char *argv[]) {
}
if(user_param.machine == SERVER || user_param.duplex) {
- #ifdef HAVE_RAW_ETH_EXP
- if (ibv_exp_destroy_flow(flow_create_result)) {
- #else
- if (ibv_destroy_flow(flow_create_result)) {
- #endif
- perror("error");
- fprintf(stderr, "Couldn't Destory flow\n");
- return FAILURE;
+
+ if (user_param.raw_mcast)
+ {
+ if (ibv_detach_mcast(ctx.qp[0], &mgid,0))
+ {
+ perror("error");
+ fprintf(stderr,"Couldn't leave multicast group\n");
+ }
+ }
+ else
+ {
+ #ifdef HAVE_RAW_ETH_EXP
+ if (user_param.use_promiscuous) {
+ if (ibv_exp_destroy_flow(flow_promisc)) {
+ perror("error");
+ fprintf(stderr, "Couldn't Destory promisc flow\n");
+ return FAILURE;
+ }
+ }
+ #endif
+
+ #ifdef HAVE_RAW_ETH_EXP
+ if (ibv_exp_destroy_flow(flow_create_result)) {
+ #else
+ if (ibv_destroy_flow(flow_create_result)) {
+ #endif
+ perror("error");
+ fprintf(stderr, "Couldn't Destory flow\n");
+ return FAILURE;
+ }
+ free(flow_rules);
}
- free(flow_rules);
}
if (destroy_ctx(&ctx, &user_param)) {
@@ -290,7 +385,9 @@ int main(int argc, char *argv[]) {
return 1;
}
- printf(RESULT_LINE);
+ if (user_param.output == FULL_VERBOSITY)
+ printf(RESULT_LINE);
+
DEBUG_LOG(TRACE,"<<<<<<%s",__FUNCTION__);
return 0;
}
diff --git a/src/raw_ethernet_send_lat.c b/src/raw_ethernet_send_lat.c
index 339dcdb..e7c9e37 100755
--- a/src/raw_ethernet_send_lat.c
+++ b/src/raw_ethernet_send_lat.c
@@ -62,6 +62,7 @@ int main(int argc, char *argv[])
#ifdef HAVE_RAW_ETH_EXP
struct ibv_exp_flow *flow_create_result = NULL;
struct ibv_exp_flow_attr *flow_rules = NULL;
+ struct ibv_exp_flow *flow_promisc = NULL;
#else
struct ibv_flow *flow_create_result = NULL;
struct ibv_flow_attr *flow_rules = NULL;
@@ -189,6 +190,22 @@ int main(int argc, char *argv[])
return FAILURE;
}
+#ifdef HAVE_RAW_ETH_EXP
+ if (user_param.use_promiscuous) {
+ struct ibv_exp_flow_attr attr = {
+ .type = IBV_EXP_FLOW_ATTR_ALL_DEFAULT,
+ .num_of_specs = 0,
+ .port = user_param.ib_port,
+ .flags = 0
+ };
+
+ if ((flow_promisc = ibv_exp_create_flow(ctx.qp[0], &attr)) == NULL) {
+ perror("error");
+ fprintf(stderr, "Couldn't attach promiscous rule QP\n");
+ }
+ }
+#endif
+
//build ONE Raw Ethernet packets on ctx buffer
create_raw_eth_pkt(&user_param,&ctx, &my_dest_info , &rem_dest_info);
@@ -228,6 +245,16 @@ int main(int argc, char *argv[])
user_param.test_type == ITERATIONS ? print_report_lat(&user_param) :
print_report_lat_duration(&user_param);
+ //destory promisc flow
+#ifdef HAVE_RAW_ETH_EXP
+ if (user_param.use_promiscuous) {
+ if (ibv_exp_destroy_flow(flow_promisc)) {
+ perror("error");
+ fprintf(stderr, "Couldn't Destory promisc flow\n");
+ return FAILURE;
+ }
+ }
+#endif
//destroy flow
@@ -251,7 +278,9 @@ int main(int argc, char *argv[])
return 1;
}
- printf(RESULT_LINE);
+ if (user_param.output == FULL_VERBOSITY)
+ printf(RESULT_LINE);
+
DEBUG_LOG(TRACE,"<<<<<<%s",__FUNCTION__);
return 0;
diff --git a/src/read_bw.c b/src/read_bw.c
index 84ded4b..36dd156 100755
--- a/src/read_bw.c
+++ b/src/read_bw.c
@@ -113,6 +113,8 @@ int main(int argc, char *argv[]) {
exchange_versions(&user_comm, &user_param);
+ check_sys_data(&user_comm, &user_param);
+
// See if MTU and link type are valid and supported.
if (check_mtu(ctx.context,&user_param, &user_comm)) {
fprintf(stderr, " Couldn't get context for the device\n");
@@ -181,6 +183,16 @@ int main(int argc, char *argv[]) {
ctx_print_pingpong_data(&rem_dest[i],&user_comm);
}
+ if (user_param.work_rdma_cm == OFF)
+ {
+ if (ctx_check_gid_compatibility(&my_dest[0], &rem_dest[0]))
+ {
+ fprintf(stderr,"\n Found Incompatibility issue with GID types.\n");
+ fprintf(stderr," Please Try to use a different IP version.\n\n");
+ return 1;
+ }
+ }
+
if (user_param.work_rdma_cm == OFF) {
if (ctx_connect(&ctx,rem_dest,&user_param,my_dest)) {
@@ -196,10 +208,17 @@ int main(int argc, char *argv[]) {
}
if (user_param.output == FULL_VERBOSITY) {
- printf(RESULT_LINE);
- printf((user_param.report_fmt == MBS ? RESULT_FMT : RESULT_FMT_G));
+ if (user_param.report_per_port) {
+ printf(RESULT_LINE_PER_PORT);
+ printf((user_param.report_fmt == MBS ? RESULT_FMT_PER_PORT : RESULT_FMT_G_PER_PORT));
+ }
+ else {
+ printf(RESULT_LINE);
+ printf((user_param.report_fmt == MBS ? RESULT_FMT : RESULT_FMT_G));
+ }
printf((user_param.cpu_util_data.enable ? RESULT_EXT_CPU_UTIL : RESULT_EXT));
}
+
// For half duplex tests, server just waits for client to exit
if (user_param.machine == SERVER && !user_param.duplex) {
@@ -208,7 +227,7 @@ int main(int argc, char *argv[]) {
return FAILURE;
}
- xchg_bw_reports(&user_comm, &my_bw_rep,&rem_bw_rep);
+ xchg_bw_reports(&user_comm, &my_bw_rep,&rem_bw_rep,atof(user_param.rem_version));
print_full_bw_report(&user_param, &rem_bw_rep, NULL);
if (ctx_close_connection(&user_comm,&my_dest[0],&rem_dest[0])) {
@@ -216,7 +235,10 @@ int main(int argc, char *argv[]) {
return 1;
}
if (user_param.output == FULL_VERBOSITY) {
- printf(RESULT_LINE);
+ if (user_param.report_per_port)
+ printf(RESULT_LINE_PER_PORT);
+ else
+ printf(RESULT_LINE);
}
if (user_param.work_rdma_cm == ON) {
@@ -270,7 +292,7 @@ int main(int argc, char *argv[]) {
print_report_bw(&user_param,&my_bw_rep);
if (user_param.duplex) {
- xchg_bw_reports(&user_comm, &my_bw_rep,&rem_bw_rep);
+ xchg_bw_reports(&user_comm, &my_bw_rep,&rem_bw_rep,atof(user_param.rem_version));
print_full_bw_report(&user_param, &my_bw_rep, &rem_bw_rep);
}
}
@@ -299,7 +321,7 @@ int main(int argc, char *argv[]) {
print_report_bw(&user_param,&my_bw_rep);
if (user_param.duplex) {
- xchg_bw_reports(&user_comm, &my_bw_rep,&rem_bw_rep);
+ xchg_bw_reports(&user_comm, &my_bw_rep,&rem_bw_rep,atof(user_param.rem_version));
print_full_bw_report(&user_param, &my_bw_rep, &rem_bw_rep);
}
@@ -329,8 +351,12 @@ int main(int argc, char *argv[]) {
}
if (user_param.output == FULL_VERBOSITY) {
- printf(RESULT_LINE);
+ if (user_param.report_per_port)
+ printf(RESULT_LINE_PER_PORT);
+ else
+ printf(RESULT_LINE);
}
+
// For half duplex tests, server just waits for client to exit
if (user_param.machine == CLIENT && !user_param.duplex) {
@@ -339,7 +365,7 @@ int main(int argc, char *argv[]) {
return FAILURE;
}
- xchg_bw_reports(&user_comm, &my_bw_rep,&rem_bw_rep);
+ xchg_bw_reports(&user_comm, &my_bw_rep,&rem_bw_rep,atof(user_param.rem_version));
}
if (ctx_close_connection(&user_comm,&my_dest[0],&rem_dest[0])) {
diff --git a/src/read_lat.c b/src/read_lat.c
index 3f8544f..7e299b7 100755
--- a/src/read_lat.c
+++ b/src/read_lat.c
@@ -122,6 +122,8 @@ int main(int argc, char *argv[]) {
exchange_versions(&user_comm, &user_param);
+ check_sys_data(&user_comm, &user_param);
+
// See if MTU and link type are valid and supported.
if (check_mtu(ctx.context,&user_param, &user_comm)) {
fprintf(stderr, " Couldn't get context for the device\n");
@@ -195,6 +197,16 @@ int main(int argc, char *argv[]) {
ctx_print_pingpong_data(&rem_dest[i],&user_comm);
}
+ if (user_param.work_rdma_cm == OFF)
+ {
+ if (ctx_check_gid_compatibility(&my_dest[0], &rem_dest[0]))
+ {
+ fprintf(stderr,"\n Found Incompatibility issue with GID types.\n");
+ fprintf(stderr," Please Try to use a different IP version.\n\n");
+ return 1;
+ }
+ }
+
if (user_param.work_rdma_cm == OFF) {
if (ctx_connect(&ctx,rem_dest,&user_param,my_dest)) {
diff --git a/src/send_bw.c b/src/send_bw.c
index 20dfcab..bc11d28 100755
--- a/src/send_bw.c
+++ b/src/send_bw.c
@@ -234,6 +234,8 @@ int main(int argc, char *argv[]) {
exchange_versions(&user_comm, &user_param);
+ check_sys_data(&user_comm, &user_param);
+
// See if MTU and link type are valid and supported.
if (check_mtu(ctx.context,&user_param, &user_comm)) {
fprintf(stderr, " Couldn't get context for the device\n");
@@ -305,6 +307,17 @@ int main(int argc, char *argv[]) {
ctx_print_pingpong_data(&rem_dest[i],&user_comm);
}
+
+ if (user_param.work_rdma_cm == OFF)
+ {
+ if (ctx_check_gid_compatibility(&my_dest[0], &rem_dest[0]))
+ {
+ fprintf(stderr,"\n Found Incompatibility issue with GID types.\n");
+ fprintf(stderr," Please Try to use a different IP version.\n\n");
+ return 1;
+ }
+ }
+
/* If credit for available recieve buffers is necessary,
* the credit sending is done via RDMA WRITE ops and the ctx_hand_shake above
* is used to exchange the rkeys and buf addresses for the RDMA WRITEs */
@@ -360,10 +373,19 @@ int main(int argc, char *argv[]) {
}
if (user_param.output == FULL_VERBOSITY) {
- printf(RESULT_LINE);
- printf((user_param.report_fmt == MBS ? RESULT_FMT : RESULT_FMT_G));
+ if (user_param.report_per_port)
+ {
+ printf(RESULT_LINE_PER_PORT);
+ printf((user_param.report_fmt == MBS ? RESULT_FMT_PER_PORT : RESULT_FMT_G_PER_PORT));
+ }
+ else
+ {
+ printf(RESULT_LINE);
+ printf((user_param.report_fmt == MBS ? RESULT_FMT : RESULT_FMT_G));
+ }
printf((user_param.cpu_util_data.enable ? RESULT_EXT_CPU_UTIL : RESULT_EXT));
}
+
if (user_param.test_method == RUN_ALL) {
if (user_param.connection_type == UD)
@@ -394,8 +416,8 @@ int main(int argc, char *argv[]) {
ctx.credit_buf[j] = 0;
}
- if (user_param.duplex) {
-
+ if (user_param.duplex)
+ {
if(run_iter_bi(&ctx,&user_param))
return 17;
@@ -415,14 +437,18 @@ int main(int argc, char *argv[]) {
print_report_bw(&user_param,&my_bw_rep);
if (user_param.duplex && user_param.test_type != DURATION) {
- xchg_bw_reports(&user_comm, &my_bw_rep,&rem_bw_rep);
+ xchg_bw_reports(&user_comm, &my_bw_rep,&rem_bw_rep,atof(user_param.rem_version));
print_full_bw_report(&user_param, &my_bw_rep, &rem_bw_rep);
}
-
if (ctx_hand_shake(&user_comm,&my_dest[0],&rem_dest[0])) {
fprintf(stderr,"Failed to exchange data between server and clients\n");
return 1;
}
+
+ //Check if last iteration ended well in UC/UD
+ if (user_param.check_alive_exited) {
+ break;
+ }
}
} else if (user_param.test_method == RUN_REGULAR) {
@@ -461,7 +487,7 @@ int main(int argc, char *argv[]) {
print_report_bw(&user_param,&my_bw_rep);
if (user_param.duplex && user_param.test_type != DURATION) {
- xchg_bw_reports(&user_comm, &my_bw_rep,&rem_bw_rep);
+ xchg_bw_reports(&user_comm, &my_bw_rep,&rem_bw_rep,atof(user_param.rem_version));
print_full_bw_report(&user_param, &my_bw_rep, &rem_bw_rep);
}
@@ -515,7 +541,10 @@ int main(int argc, char *argv[]) {
}
if (user_param.output == FULL_VERBOSITY) {
- printf(RESULT_LINE);
+ if (user_param.report_per_port)
+ printf(RESULT_LINE_PER_PORT);
+ else
+ printf(RESULT_LINE);
}
if (ctx_close_connection(&user_comm,&my_dest[0],&rem_dest[0])) {
@@ -528,7 +557,6 @@ int main(int argc, char *argv[]) {
fprintf(stderr,"Couldn't Destory all SEND resources\n");
return FAILURE;
}
-
if (user_param.work_rdma_cm == ON)
if (destroy_ctx(user_comm.rdma_ctx,user_comm.rdma_params)) {
fprintf(stderr,"Failed to destroy resources\n");
diff --git a/src/send_lat.c b/src/send_lat.c
index 07455fc..8d40314 100755
--- a/src/send_lat.c
+++ b/src/send_lat.c
@@ -286,6 +286,8 @@ int main(int argc, char *argv[]) {
exchange_versions(&user_comm, &user_param);
+ check_sys_data(&user_comm, &user_param);
+
// See if MTU and link type are valid and supported.
if (check_mtu(ctx.context,&user_param, &user_comm)) {
fprintf(stderr, " Couldn't get context for the device\n");
@@ -353,6 +355,16 @@ int main(int argc, char *argv[]) {
ctx_print_pingpong_data(&rem_dest[i],&user_comm);
}
+ if (user_param.work_rdma_cm == OFF)
+ {
+ if (ctx_check_gid_compatibility(&my_dest[0], &rem_dest[0]))
+ {
+ fprintf(stderr,"\n Found Incompatibility issue with GID types.\n");
+ fprintf(stderr," Please Try to use a different IP version.\n\n");
+ return 1;
+ }
+ }
+
if (user_param.use_mcg) {
memcpy(mcg_params.base_mgid.raw,mcg_params.mgid.raw,16);
diff --git a/src/write_bw.c b/src/write_bw.c
index d49ceac..124d8cc 100755
--- a/src/write_bw.c
+++ b/src/write_bw.c
@@ -116,6 +116,8 @@ int main(int argc, char *argv[]) {
sleep(1);
exchange_versions(&user_comm, &user_param);
+ check_sys_data(&user_comm, &user_param);
+
// See if MTU and link type are valid and supported.
if (check_mtu(ctx.context,&user_param, &user_comm)) {
fprintf(stderr, " Couldn't get context for the device\n");
@@ -183,6 +185,16 @@ int main(int argc, char *argv[]) {
ctx_print_pingpong_data(&rem_dest[i],&user_comm);
}
+ if (user_param.work_rdma_cm == OFF)
+ {
+ if (ctx_check_gid_compatibility(&my_dest[0], &rem_dest[0]))
+ {
+ fprintf(stderr,"\n Found Incompatibility issue with GID types.\n");
+ fprintf(stderr," Please Try to use a different IP version.\n\n");
+ return 1;
+ }
+ }
+
if (user_param.work_rdma_cm == OFF) {
if (ctx_connect(&ctx,rem_dest,&user_param,my_dest)) {
fprintf(stderr," Unable to Connect the HCA's through the link\n");
@@ -197,8 +209,15 @@ int main(int argc, char *argv[]) {
}
if (user_param.output == FULL_VERBOSITY) {
- printf(RESULT_LINE);
- printf((user_param.report_fmt == MBS ? RESULT_FMT : RESULT_FMT_G));
+ if (user_param.report_per_port) {
+ printf(RESULT_LINE_PER_PORT);
+ printf((user_param.report_fmt == MBS ? RESULT_FMT_PER_PORT : RESULT_FMT_G_PER_PORT));
+ }
+ else {
+ printf(RESULT_LINE);
+ printf((user_param.report_fmt == MBS ? RESULT_FMT : RESULT_FMT_G));
+ }
+
printf((user_param.cpu_util_data.enable ? RESULT_EXT_CPU_UTIL : RESULT_EXT));
}
@@ -210,7 +229,7 @@ int main(int argc, char *argv[]) {
return FAILURE;
}
- xchg_bw_reports(&user_comm, &my_bw_rep,&rem_bw_rep);
+ xchg_bw_reports(&user_comm, &my_bw_rep,&rem_bw_rep,atof(user_param.rem_version));
print_full_bw_report(&user_param, &rem_bw_rep, NULL);
if (ctx_close_connection(&user_comm,&my_dest[0],&rem_dest[0])) {
@@ -219,7 +238,10 @@ int main(int argc, char *argv[]) {
}
if (user_param.output == FULL_VERBOSITY) {
- printf(RESULT_LINE);
+ if (user_param.report_per_port)
+ printf(RESULT_LINE_PER_PORT);
+ else
+ printf(RESULT_LINE);
}
if (user_param.work_rdma_cm == ON) {
@@ -267,7 +289,7 @@ int main(int argc, char *argv[]) {
print_report_bw(&user_param,&my_bw_rep);
if (user_param.duplex) {
- xchg_bw_reports(&user_comm, &my_bw_rep,&rem_bw_rep);
+ xchg_bw_reports(&user_comm, &my_bw_rep,&rem_bw_rep,atof(user_param.rem_version));
print_full_bw_report(&user_param, &my_bw_rep, &rem_bw_rep);
}
}
@@ -298,7 +320,7 @@ int main(int argc, char *argv[]) {
print_report_bw(&user_param,&my_bw_rep);
if (user_param.duplex) {
- xchg_bw_reports(&user_comm, &my_bw_rep,&rem_bw_rep);
+ xchg_bw_reports(&user_comm, &my_bw_rep,&rem_bw_rep,atof(user_param.rem_version));
print_full_bw_report(&user_param, &my_bw_rep, &rem_bw_rep);
}
@@ -328,7 +350,10 @@ int main(int argc, char *argv[]) {
}
if (user_param.output == FULL_VERBOSITY) {
- printf(RESULT_LINE);
+ if (user_param.report_per_port)
+ printf(RESULT_LINE_PER_PORT);
+ else
+ printf(RESULT_LINE);
}
// For half duplex tests, server just waits for client to exit
@@ -339,7 +364,7 @@ int main(int argc, char *argv[]) {
return FAILURE;
}
- xchg_bw_reports(&user_comm, &my_bw_rep,&rem_bw_rep);
+ xchg_bw_reports(&user_comm, &my_bw_rep,&rem_bw_rep,atof(user_param.rem_version));
}
// Closing connection.
if (ctx_close_connection(&user_comm,&my_dest[0],&rem_dest[0])) {
diff --git a/src/write_lat.c b/src/write_lat.c
index 4941729..e195c0e 100755
--- a/src/write_lat.c
+++ b/src/write_lat.c
@@ -122,6 +122,8 @@ int main(int argc, char *argv[]) {
exchange_versions(&user_comm, &user_param);
+ check_sys_data(&user_comm, &user_param);
+
// See if MTU and link type are valid and supported.
if (check_mtu(ctx.context,&user_param, &user_comm)) {
fprintf(stderr, " Couldn't get context for the device\n");
@@ -195,6 +197,16 @@ int main(int argc, char *argv[]) {
ctx_print_pingpong_data(&rem_dest[i],&user_comm);
};
+ if (user_param.work_rdma_cm == OFF)
+ {
+ if (ctx_check_gid_compatibility(&my_dest[0], &rem_dest[0]))
+ {
+ fprintf(stderr,"\n Found Incompatibility issue with GID types.\n");
+ fprintf(stderr," Please Try to use a different IP version.\n\n");
+ return 1;
+ }
+ }
+
if (user_param.work_rdma_cm == OFF) {
if (ctx_connect(&ctx,rem_dest,&user_param,my_dest)) {
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-ofed/perftest.git
More information about the Pkg-ofed-commits
mailing list