Since 2c1619edef61a03cb516efaa81750784c3071d10 for linux kernel and 55843c4ab8f559679d28c559cc4d681836be769b for rdma-core, rdma cma supports RDMA_OPTION_ID_ACK_TIMEOUT. It's useful for RDMA out of sequence case. Because this feature is added recently, we have to check this in autogen.sh before building source code. Depend on production enviroument, tunning rdma ack timeout could get the best performance. Suggested by Bart and Ronnie, instead of using a fixed timeout value, add two methods to set rdma ack timeout value. 1, add URL variable 'LIBISCSI_RDMA_ACK_TIMEOUT'. This could works for a specified connection. 2, add env argument 'LIBISCSI_RDMA_ACK_TIMEOUT'. This works as a common setting for all the connection of a process. Test under different packet loss rate and different ack timeout, run fio (iodepth=1) in a guest os, I got this result: latency under packet loss rate 0.00001: timeout 19: avg 170.22, pct99.9 215 timeout 10: avg 160.08, pct99.9 215 timeout 8 : avg 146.39, pct99.9 177 timeout 7 : avg 148.37, pct99.9 211 latency under packet loss rate 0.0001: timeout 19: avg 949.23, pct99.9 306 timeout 10: avg 818.53, pct99.9 378 timeout 8 : avg 615.84, pct99.9 189 timeout 7 : avg 618.89, pct99.9 310 Base on this test report, setting ack timeout to 8(1048.576 usec) is a good choice in my test enviroument. Signed-off-by: zhenwei pi <pizhenwei@bytedance.com>
198 lines
6.5 KiB
Plaintext
198 lines
6.5 KiB
Plaintext
AC_PREREQ(2.50)
|
|
AC_INIT(libiscsi, m4_esyscmd([grep 'Version:' ./packaging/RPM/libiscsi.spec.in 2>/dev/null | head -1 | sed -e 's/[ \t]*Version:[ \t]*\([^ \t]*\)[ \t]*.*/\1/' | tr -d '\n']))
|
|
AC_CONFIG_SRCDIR([lib/init.c])
|
|
AC_CONFIG_MACRO_DIR([m4])
|
|
|
|
AM_INIT_AUTOMAKE([-Wall -Werror subdir-objects])
|
|
m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES])
|
|
m4_ifdef([AM_PROG_AR], [AM_PROG_AR])
|
|
AC_PROG_LIBTOOL
|
|
LT_INIT
|
|
|
|
AC_CANONICAL_HOST
|
|
AM_PROG_CC_C_O
|
|
|
|
enable_write_strings="yes"
|
|
|
|
case $host in
|
|
*solaris*)
|
|
enable_write_strings="no"
|
|
AC_CHECK_LIB([socket], [main], , [AC_MSG_ERROR([Can not find required library])])
|
|
AC_CHECK_LIB([nsl], [main], , [AC_MSG_ERROR([Can not find required library])])
|
|
;;
|
|
*)
|
|
;;
|
|
esac
|
|
|
|
AC_ARG_ENABLE([werror], [AS_HELP_STRING([--disable-werror],
|
|
[Disables building with -Werror by default])])
|
|
|
|
if test "$ac_cv_prog_gcc" = yes; then
|
|
WARN_CFLAGS="-Wall -W -Wshadow -Wstrict-prototypes -Wpointer-arith -Wcast-align -Wcast-qual -Wno-strict-aliasing -Wvla"
|
|
WARN_CFLAGS="$WARN_CFLAGS -Wno-unknown-warning-option -Wno-stringop-truncation"
|
|
if test "x$enable_werror" != "xno"; then
|
|
WARN_CFLAGS="$WARN_CFLAGS -Werror"
|
|
fi
|
|
if test "x$enable_write_strings" != "xno"; then
|
|
WARN_CFLAGS="$WARN_CFLAGS -Wwrite-strings"
|
|
fi
|
|
fi
|
|
AC_SUBST(WARN_CFLAGS)
|
|
|
|
AC_ARG_ENABLE([manpages],
|
|
[AC_HELP_STRING([--enable-manpages],
|
|
[Enable building the manpages])],
|
|
[ENABLE_MANPAGES=$enableval],
|
|
[ENABLE_MANPAGES="no"])
|
|
AM_CONDITIONAL(BUILD_MANPAGES,
|
|
[expr "$ENABLE_MANPAGES" : yes > /dev/null 2>&1])
|
|
|
|
AC_ARG_ENABLE([test_tool],
|
|
[AC_HELP_STRING([--enable-test-tool],
|
|
[Enable building test-tool (to test a remote server)])],
|
|
[ENABLE_TEST_TOOL=$enableval],
|
|
[ENABLE_TEST_TOOL=yes])
|
|
AM_CONDITIONAL([BUILD_TEST_TOOL],
|
|
[expr "$ENABLE_TEST_TOOL" : yes > /dev/null 2>&1])
|
|
|
|
AC_ARG_ENABLE([tests],
|
|
[AC_HELP_STRING([--enable-tests],
|
|
[Enable building tests])],
|
|
[ENABLE_TESTS=$enableval],
|
|
[ENABLE_TESTS=yes])
|
|
AM_CONDITIONAL([BUILD_TESTS],
|
|
[expr "$ENABLE_TESTS" : yes > /dev/null 2>&1])
|
|
|
|
AC_ARG_ENABLE([examples],
|
|
[AC_HELP_STRING([--enable-examples],
|
|
[Enable building examples])],
|
|
[ENABLE_EXAMPLES=$enableval],
|
|
[ENABLE_EXAMPLES=yes])
|
|
AM_CONDITIONAL([BUILD_EXAMPLES],
|
|
[expr "$ENABLE_EXAMPLES" : yes > /dev/null 2>&1])
|
|
|
|
AC_CONFIG_HEADER(config.h)
|
|
|
|
AC_CHECK_LIB([gcrypt], [gcry_control])
|
|
AM_CONDITIONAL([HAVE_LIBGCRYPT], [test $ac_cv_lib_gcrypt_gcry_control = yes])
|
|
|
|
AC_CACHE_CHECK([for sin_len in sock],libiscsi_cv_HAVE_SOCK_SIN_LEN,[
|
|
AC_TRY_COMPILE([#include <sys/types.h>
|
|
#include <sys/socket.h>
|
|
#include <netinet/in.h>],
|
|
[struct sockaddr_in sock; sock.sin_len = sizeof(sock);],
|
|
libiscsi_cv_HAVE_SOCK_SIN_LEN=yes,libiscsi_cv_HAVE_SOCK_SIN_LEN=no)])
|
|
if test x"$libiscsi_cv_HAVE_SOCK_SIN_LEN" = x"yes"; then
|
|
AC_DEFINE(HAVE_SOCK_SIN_LEN,1,[Whether the sockaddr_in struct has a sin_len property])
|
|
fi
|
|
|
|
AC_CACHE_CHECK([for sys filio.h],libiscsi_cv_NEED_SYS_FILIO_H,[
|
|
AC_TRY_COMPILE([#include <stdint.h>
|
|
#include <sys/filio.h>],
|
|
[int foo = FIONREAD],
|
|
libiscsi_cv_NEED_SYS_FILIO_H=yes,libiscsi_cv_NEED_SYS_FILIO_H=no)])
|
|
if test x"$libiscsi_cv_NEED_SYS_FILIO_H" = x"yes"; then
|
|
AC_DEFINE(NEED_SYS_FILIO_H,1,[Whether we need sys/filio.h])
|
|
fi
|
|
|
|
# check for sys/socket.h
|
|
dnl Check for sys/socket.h
|
|
AC_CHECK_HEADERS([sys/socket.h])
|
|
|
|
# check for netinet/tcp.h
|
|
dnl Check for netinet/tcp.h
|
|
AC_CHECK_HEADERS([netinet/tcp.h])
|
|
|
|
# check for netinet/in.h
|
|
dnl Check for netinet/in.h
|
|
AC_CHECK_HEADERS([netinet/in.h])
|
|
|
|
# check for arpa/inet.h
|
|
dnl Check for arpa/inet.h
|
|
AC_CHECK_HEADERS([arpa/inet.h])
|
|
|
|
# check for sys/uio.h
|
|
dnl Check for sys/uio.h
|
|
AC_CHECK_HEADERS([sys/uio.h])
|
|
|
|
# check for poll.h
|
|
dnl Check for poll.h
|
|
AC_CHECK_HEADERS([poll.h])
|
|
|
|
|
|
AC_CACHE_CHECK([for sockaddr_in6 support],libiscsi_cv_HAVE_SOCKADDR_IN6,[
|
|
AC_TRY_COMPILE([#include <sys/types.h>
|
|
#include <sys/socket.h>
|
|
#include <netinet/in.h>],
|
|
[struct sockaddr_in6 sock; int len = sizeof(sock);],
|
|
libiscsi_cv_HAVE_SOCKADDR_IN6=yes,libiscsi_cv_HAVE_SOCKADDR_IN6=no)])
|
|
if test x"$libiscsi_cv_HAVE_SOCKADDR_IN6" = x"yes"; then
|
|
AC_DEFINE(HAVE_SOCKADDR_IN6,1,[Whether we have IPv6 support])
|
|
fi
|
|
|
|
AC_CACHE_CHECK([for SG_IO support],libiscsi_cv_HAVE_SG_IO,[
|
|
AC_TRY_COMPILE([
|
|
#include <unistd.h>
|
|
#include <scsi/sg.h>],
|
|
[int sgio = SG_IO;],
|
|
libiscsi_cv_HAVE_SG_IO=yes,libiscsi_cv_HAVE_SG_IO=no)])
|
|
if test x"$libiscsi_cv_HAVE_SG_IO" = x"yes"; then
|
|
AC_DEFINE(HAVE_SG_IO,1,[Whether we have SG_IO support])
|
|
fi
|
|
|
|
AC_CACHE_CHECK([for iSER support],libiscsi_cv_HAVE_LINUX_ISER,[
|
|
AC_TRY_COMPILE([
|
|
#include <infiniband/verbs.h>
|
|
#include <rdma/rdma_cma.h>
|
|
#include <rdma/rdma_verbs.h>],
|
|
[int ibv = IBV_WC_SEND;],
|
|
libiscsi_cv_HAVE_LINUX_ISER=yes,libiscsi_cv_HAVE_LINUX_ISER=no)])
|
|
if test x"$libiscsi_cv_HAVE_LINUX_ISER" = x"yes"; then
|
|
AC_DEFINE(HAVE_LINUX_ISER,1,[Whether we have iSER support])
|
|
fi
|
|
AM_CONDITIONAL([HAVE_LINUX_ISER], [test $libiscsi_cv_HAVE_LINUX_ISER = yes])
|
|
|
|
AC_TRY_COMPILE([
|
|
#include <rdma/rdma_cma.h>],
|
|
[return RDMA_OPTION_ID_ACK_TIMEOUT;],
|
|
[AC_DEFINE([HAVE_RDMA_ACK_TIMEOUT],[1],[Define to 1 if you have RDMA ack timeout support])],)
|
|
|
|
AC_CACHE_CHECK([whether libcunit is available],
|
|
[ac_cv_have_cunit],
|
|
[ac_save_CFLAGS="$CFLAGS"
|
|
ac_save_LIBS="$LIBS"
|
|
CFLAGS="$CFLAGS $GLIB_CFLAGS"
|
|
LIBS="$GLIB_LIBS $LIBS -lcunit"
|
|
AC_TRY_LINK([
|
|
#include <CUnit/CUnit.h>
|
|
], [], [ac_cv_have_cunit=yes], [ac_cv_have_cunit=no])
|
|
CFLAGS="$ac_save_CFLAGS"
|
|
LIBS="$ac_save_LIBS"])
|
|
if ! test "$ac_cv_have_cunit" = yes ; then
|
|
AC_MSG_NOTICE(You need libcunit to build the test suite.)
|
|
AC_MSG_NOTICE(The scsi/iscsi test suite will not be built.)
|
|
fi
|
|
AM_CONDITIONAL(ISCSITEST, [test "$ac_cv_have_cunit" = yes -a "$enable_shared" = "yes"])
|
|
|
|
AC_CHECK_MEMBER([struct CU_SuiteInfo.pSetUpFunc],
|
|
[AC_DEFINE([HAVE_CU_SUITEINFO_PSETUPFUNC], 1,
|
|
[Define to 1 if struct CU_SuiteInfo has a member called pSetUpFunc])],
|
|
[], [[
|
|
#include <CUnit/CUnit.h>
|
|
#include <CUnit/TestDB.h>
|
|
]])
|
|
|
|
AC_SEARCH_LIBS(clock_gettime, rt, [
|
|
AC_DEFINE([HAVE_CLOCK_GETTIME],1,[Define if clock_gettime is available])])
|
|
|
|
|
|
AC_CONFIG_FILES([Makefile]
|
|
[doc/Makefile]
|
|
[examples/Makefile]
|
|
[lib/Makefile]
|
|
[test-tool/Makefile]
|
|
[tests/Makefile]
|
|
[utils/Makefile]
|
|
[libiscsi.pc])
|
|
AC_OUTPUT
|