[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(&reg_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