diff --git a/opal/mca/common/libfabric/libfabric/Makefile.am b/opal/mca/common/libfabric/libfabric/Makefile.am index 382f8d72a7..3ed403e551 100644 --- a/opal/mca/common/libfabric/libfabric/Makefile.am +++ b/opal/mca/common/libfabric/libfabric/Makefile.am @@ -87,11 +87,12 @@ _sockets_files = \ if HAVE_SOCKETS_DL pkglib_LTLIBRARIES += libsockets-fi.la libsockets_fi_la_SOURCES = $(_sockets_files) $(common_srcs) -libsockets_fi_la_LIBADD = $(linkback) +libsockets_fi_la_LIBADD = $(linkback) $(sockets_shm_LIBS) libsockets_fi_la_LDFLAGS = -module -avoid-version -shared -export-dynamic libsockets_fi_la_DEPENDENCIES = $(linkback) else !HAVE_SOCKETS_DL src_libfabric_la_SOURCES += $(_sockets_files) +src_libfabric_la_LIBADD += $(sockets_shm_LIBS) endif !HAVE_SOCKETS_DL endif HAVE_SOCKETS @@ -312,6 +313,7 @@ real_man_pages = \ man/fi_av.3 \ man/fi_cm.3 \ man/fi_cntr.3 \ + man/fi_control.3 \ man/fi_cq.3 \ man/fi_direct.7 \ man/fi_domain.3 \ diff --git a/opal/mca/common/libfabric/libfabric/README b/opal/mca/common/libfabric/libfabric/README index 2dc3f84c6b..2d0c88d576 100644 --- a/opal/mca/common/libfabric/libfabric/README +++ b/opal/mca/common/libfabric/libfabric/README @@ -1,7 +1,7 @@ This README is for userspace RDMA fabric library. -Version Libfabric v1.0.0rc1 -Released on 2015-02-13 +Version Libfabric v1.0.0rc3 +Released on 2015-02-20 Building ======== diff --git a/opal/mca/common/libfabric/libfabric/config.h.in b/opal/mca/common/libfabric/libfabric/config.h.in index d9c3a37aec..c63e0d70bb 100644 --- a/opal/mca/common/libfabric/libfabric/config.h.in +++ b/opal/mca/common/libfabric/libfabric/config.h.in @@ -70,6 +70,9 @@ /* assembler has .symver support */ #undef HAVE_SYMVER_SUPPORT +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_MMAN_H + /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H diff --git a/opal/mca/common/libfabric/libfabric/configure.ac b/opal/mca/common/libfabric/libfabric/configure.ac index 8263e80078..7268b782f7 100644 --- a/opal/mca/common/libfabric/libfabric/configure.ac +++ b/opal/mca/common/libfabric/libfabric/configure.ac @@ -1,7 +1,7 @@ dnl Process this file with autoconf to produce a configure script. AC_PREREQ(2.57) -AC_INIT([libfabric], [1.0.0rc1], [ofiwg@lists.openfabrics.org]) +AC_INIT([libfabric], [1.0.0rc3], [ofiwg@lists.openfabrics.org]) AC_CONFIG_SRCDIR([src/fabric.c]) AC_CONFIG_AUX_DIR(config) AC_CONFIG_MACRO_DIR(config) diff --git a/opal/mca/common/libfabric/libfabric/libfabric.spec b/opal/mca/common/libfabric/libfabric/libfabric.spec index 4b24058e7c..f8a8a5768c 100644 --- a/opal/mca/common/libfabric/libfabric/libfabric.spec +++ b/opal/mca/common/libfabric/libfabric/libfabric.spec @@ -1,5 +1,5 @@ Name: libfabric -Version: 1.0.0rc1 +Version: 1.0.0rc3 Release: 1%{?dist} Summary: User-space RDMA Fabric Interfaces Group: System Environment/Libraries @@ -61,5 +61,5 @@ rm -rf %{buildroot} %{_mandir}/man7/* %changelog -* Mon Jan 19 2015 Maintainer Name 1.0.0 -- TODO: Release manager fill this out for initial release +* Mon Feb 16 2015 Open Fabrics Interfaces Working Group 1.0.0 +- Release 1.0.0rc2 diff --git a/opal/mca/common/libfabric/libfabric/libfabric.spec.in b/opal/mca/common/libfabric/libfabric/libfabric.spec.in index 25f448927e..64a01f05a3 100644 --- a/opal/mca/common/libfabric/libfabric/libfabric.spec.in +++ b/opal/mca/common/libfabric/libfabric/libfabric.spec.in @@ -61,5 +61,5 @@ rm -rf %{buildroot} %{_mandir}/man7/* %changelog -* Mon Jan 19 2015 Maintainer Name 1.0.0 -- TODO: Release manager fill this out for initial release +* Mon Feb 16 2015 Open Fabrics Interfaces Working Group 1.0.0 +- Release 1.0.0rc2 diff --git a/opal/mca/common/libfabric/libfabric/man/fabric.7 b/opal/mca/common/libfabric/libfabric/man/fabric.7 index e48e28175e..2b75150992 100644 --- a/opal/mca/common/libfabric/libfabric/man/fabric.7 +++ b/opal/mca/common/libfabric/libfabric/man/fabric.7 @@ -1,4 +1,4 @@ -.TH fabric 7 "2014\-12\-15" "Libfabric Programmer\[aq]s Manual" "Libfabric v1.0.0rc1" +.TH fabric 7 "2014\-12\-15" "Libfabric Programmer\[aq]s Manual" "Libfabric v1.0.0rc3" .SH NAME .PP Fabric Interface Library diff --git a/opal/mca/common/libfabric/libfabric/man/fi_av.3 b/opal/mca/common/libfabric/libfabric/man/fi_av.3 index 887377d127..e730835191 100644 --- a/opal/mca/common/libfabric/libfabric/man/fi_av.3 +++ b/opal/mca/common/libfabric/libfabric/man/fi_av.3 @@ -1,4 +1,4 @@ -.TH fi_av 3 "2015\-02\-12" "Libfabric Programmer\[aq]s Manual" "Libfabric v1.0.0rc1" +.TH fi_av 3 "2015\-02\-12" "Libfabric Programmer\[aq]s Manual" "Libfabric v1.0.0rc3" .SH NAME .PP fi_av - Address vector operations diff --git a/opal/mca/common/libfabric/libfabric/man/fi_cm.3 b/opal/mca/common/libfabric/libfabric/man/fi_cm.3 index 5256bd8080..ae6faa6b6f 100644 --- a/opal/mca/common/libfabric/libfabric/man/fi_cm.3 +++ b/opal/mca/common/libfabric/libfabric/man/fi_cm.3 @@ -1,4 +1,4 @@ -.TH fi_cm 3 "2015\-01\-01" "Libfabric Programmer\[aq]s Manual" "Libfabric v1.0.0rc1" +.TH fi_cm 3 "2015\-01\-01" "Libfabric Programmer\[aq]s Manual" "Libfabric v1.0.0rc3" .SH NAME .PP fi_cm - Connection management operations diff --git a/opal/mca/common/libfabric/libfabric/man/fi_cntr.3 b/opal/mca/common/libfabric/libfabric/man/fi_cntr.3 index 29a08a5e6a..bec00b46b7 100644 --- a/opal/mca/common/libfabric/libfabric/man/fi_cntr.3 +++ b/opal/mca/common/libfabric/libfabric/man/fi_cntr.3 @@ -1,4 +1,4 @@ -.TH fi_cntr 3 "2015\-01\-29" "Libfabric Programmer\[aq]s Manual" "Libfabric v1.0.0rc1" +.TH fi_cntr 3 "2015\-01\-29" "Libfabric Programmer\[aq]s Manual" "Libfabric v1.0.0rc3" .SH NAME .PP fi_cntr - Completion and event counter operations diff --git a/opal/mca/common/libfabric/libfabric/man/fi_control.3 b/opal/mca/common/libfabric/libfabric/man/fi_control.3 new file mode 100644 index 0000000000..391fcb5f18 --- /dev/null +++ b/opal/mca/common/libfabric/libfabric/man/fi_control.3 @@ -0,0 +1,36 @@ +.TH fi_control 3 "2015\-02\-16" "Libfabric Programmer\[aq]s Manual" "Libfabric v1.0.0rc3" +.SH NAME +.PP +fi_control - Perform an operation on a fabric resource. +.SH SYNOPSIS +.IP +.nf +\f[C] +#include\ + +int\ fi_control(struct\ fid\ *fid,\ int\ command,\ void\ *arg); +\f[] +.fi +.SH ARGUMENTS +.PP +\f[I]fid\f[] : Fabric resource +.PP +\f[I]command\f[] : Operation to perform +.PP +\f[I]arg\f[] : Optional argument to the command +.SH DESCRIPTION +.PP +The fi_control operation is used to perform one or more operations on a +fabric resource. +Conceptually, fi_control is similar to the POSIX fcntl routine. +The exact behavior of using fi_control depends on the fabric resource +being operated on, the specified command, and any provided arguments for +the command. +For specific details, see the fabric resource specific help pages noted +below. +.SH SEE ALSO +.PP +\f[C]fi_endpoint\f[](3), \f[C]fi_cm\f[](3), \f[C]fi_cntr\f[](3), +\f[C]fi_cq\f[](3), \f[C]fi_eq\f[](3), +.SH AUTHORS +OpenFabrics. diff --git a/opal/mca/common/libfabric/libfabric/man/fi_cq.3 b/opal/mca/common/libfabric/libfabric/man/fi_cq.3 index b1c9ebb4d3..e83ee2450d 100644 --- a/opal/mca/common/libfabric/libfabric/man/fi_cq.3 +++ b/opal/mca/common/libfabric/libfabric/man/fi_cq.3 @@ -1,4 +1,4 @@ -.TH fi_cq 3 "2015\-02\-01" "Libfabric Programmer\[aq]s Manual" "Libfabric v1.0.0rc1" +.TH fi_cq 3 "2015\-02\-01" "Libfabric Programmer\[aq]s Manual" "Libfabric v1.0.0rc3" .SH NAME .PP fi_cq - Completion queue operations diff --git a/opal/mca/common/libfabric/libfabric/man/fi_direct.7 b/opal/mca/common/libfabric/libfabric/man/fi_direct.7 index 0d08a92b68..70eafa8514 100644 --- a/opal/mca/common/libfabric/libfabric/man/fi_direct.7 +++ b/opal/mca/common/libfabric/libfabric/man/fi_direct.7 @@ -1,4 +1,4 @@ -.TH fi_direct 7 "2014\-11\-21" "Libfabric Programmer\[aq]s Manual" "Libfabric v1.0.0rc1" +.TH fi_direct 7 "2014\-11\-21" "Libfabric Programmer\[aq]s Manual" "Libfabric v1.0.0rc3" .SH NAME .PP Direct fabric provider access diff --git a/opal/mca/common/libfabric/libfabric/man/fi_domain.3 b/opal/mca/common/libfabric/libfabric/man/fi_domain.3 index 37bf7085c2..c2454dc44c 100644 --- a/opal/mca/common/libfabric/libfabric/man/fi_domain.3 +++ b/opal/mca/common/libfabric/libfabric/man/fi_domain.3 @@ -1,4 +1,4 @@ -.TH fi_domain 3 "2015\-02\-01" "Libfabric Programmer\[aq]s Manual" "Libfabric v1.0.0rc1" +.TH fi_domain 3 "2015\-02\-01" "Libfabric Programmer\[aq]s Manual" "Libfabric v1.0.0rc3" .SH NAME .PP fi_domain - Open a fabric access domain diff --git a/opal/mca/common/libfabric/libfabric/man/fi_endpoint.3 b/opal/mca/common/libfabric/libfabric/man/fi_endpoint.3 index 933e58f800..4a6e0a97e1 100644 --- a/opal/mca/common/libfabric/libfabric/man/fi_endpoint.3 +++ b/opal/mca/common/libfabric/libfabric/man/fi_endpoint.3 @@ -1,4 +1,4 @@ -.TH fi_endpoint 3 "2015\-02\-12" "Libfabric Programmer\[aq]s Manual" "Libfabric v1.0.0rc1" +.TH fi_endpoint 3 "2015\-02\-12" "Libfabric Programmer\[aq]s Manual" "Libfabric v1.0.0rc3" .SH NAME .PP fi_endpoint - Fabric endpoint operations diff --git a/opal/mca/common/libfabric/libfabric/man/fi_eq.3 b/opal/mca/common/libfabric/libfabric/man/fi_eq.3 index b916c010d0..714eb28472 100644 --- a/opal/mca/common/libfabric/libfabric/man/fi_eq.3 +++ b/opal/mca/common/libfabric/libfabric/man/fi_eq.3 @@ -1,4 +1,4 @@ -.TH fi_eq 3 "2015\-02\-01" "Libfabric Programmer\[aq]s Manual" "Libfabric v1.0.0rc1" +.TH fi_eq 3 "2015\-02\-01" "Libfabric Programmer\[aq]s Manual" "Libfabric v1.0.0rc3" .SH NAME .PP fi_eq - Event queue operations diff --git a/opal/mca/common/libfabric/libfabric/man/fi_errno.3 b/opal/mca/common/libfabric/libfabric/man/fi_errno.3 index ca4726f559..64b0f1c489 100644 --- a/opal/mca/common/libfabric/libfabric/man/fi_errno.3 +++ b/opal/mca/common/libfabric/libfabric/man/fi_errno.3 @@ -1,4 +1,4 @@ -.TH fi_errno 3 "2015\-01\-08" "Libfabric Programmer\[aq]s Manual" "Libfabric v1.0.0rc1" +.TH fi_errno 3 "2015\-01\-08" "Libfabric Programmer\[aq]s Manual" "Libfabric v1.0.0rc3" .SH NAME .PP fi_errno - fabric errors diff --git a/opal/mca/common/libfabric/libfabric/man/fi_fabric.3 b/opal/mca/common/libfabric/libfabric/man/fi_fabric.3 index dc76f6857d..17d629851d 100644 --- a/opal/mca/common/libfabric/libfabric/man/fi_fabric.3 +++ b/opal/mca/common/libfabric/libfabric/man/fi_fabric.3 @@ -1,4 +1,4 @@ -.TH fi_fabric 3 "2015\-01\-24" "Libfabric Programmer\[aq]s Manual" "Libfabric v1.0.0rc1" +.TH fi_fabric 3 "2015\-01\-24" "Libfabric Programmer\[aq]s Manual" "Libfabric v1.0.0rc3" .SH NAME .PP fi_fabric - Fabric domain operations diff --git a/opal/mca/common/libfabric/libfabric/man/fi_getinfo.3 b/opal/mca/common/libfabric/libfabric/man/fi_getinfo.3 index 9bd185743d..709638fadc 100644 --- a/opal/mca/common/libfabric/libfabric/man/fi_getinfo.3 +++ b/opal/mca/common/libfabric/libfabric/man/fi_getinfo.3 @@ -1,4 +1,4 @@ -.TH fi_getinfo 3 "2015\-02\-11" "Libfabric Programmer\[aq]s Manual" "Libfabric v1.0.0rc1" +.TH fi_getinfo 3 "2015\-02\-11" "Libfabric Programmer\[aq]s Manual" "Libfabric v1.0.0rc3" .SH NAME .PP fi_getinfo / fi_freeinfo - Obtain / free fabric interface information diff --git a/opal/mca/common/libfabric/libfabric/man/fi_mr.3 b/opal/mca/common/libfabric/libfabric/man/fi_mr.3 index f2b3015f8f..f7ffc471ea 100644 --- a/opal/mca/common/libfabric/libfabric/man/fi_mr.3 +++ b/opal/mca/common/libfabric/libfabric/man/fi_mr.3 @@ -1,4 +1,4 @@ -.TH fi_mr 3 "2015\-01\-29" "Libfabric Programmer\[aq]s Manual" "Libfabric v1.0.0rc1" +.TH fi_mr 3 "2015\-01\-29" "Libfabric Programmer\[aq]s Manual" "Libfabric v1.0.0rc3" .SH NAME .PP fi_mr - Memory region operations diff --git a/opal/mca/common/libfabric/libfabric/man/fi_msg.3 b/opal/mca/common/libfabric/libfabric/man/fi_msg.3 index 6b6b46fdcc..d7f79ee6e9 100644 --- a/opal/mca/common/libfabric/libfabric/man/fi_msg.3 +++ b/opal/mca/common/libfabric/libfabric/man/fi_msg.3 @@ -1,4 +1,4 @@ -.TH fi_msg 3 "2015\-02\-06" "Libfabric Programmer\[aq]s Manual" "Libfabric v1.0.0rc1" +.TH fi_msg 3 "2015\-02\-06" "Libfabric Programmer\[aq]s Manual" "Libfabric v1.0.0rc3" .SH NAME .PP fi_msg - Message data transfer operations diff --git a/opal/mca/common/libfabric/libfabric/man/fi_poll.3 b/opal/mca/common/libfabric/libfabric/man/fi_poll.3 index 78afa7d67c..766a00a94b 100644 --- a/opal/mca/common/libfabric/libfabric/man/fi_poll.3 +++ b/opal/mca/common/libfabric/libfabric/man/fi_poll.3 @@ -1,4 +1,4 @@ -.TH fi_poll 3 "2015\-01\-29" "Libfabric Programmer\[aq]s Manual" "Libfabric v1.0.0rc1" +.TH fi_poll 3 "2015\-01\-29" "Libfabric Programmer\[aq]s Manual" "Libfabric v1.0.0rc3" .SH NAME .PP fi_poll - Polling and wait set operations diff --git a/opal/mca/common/libfabric/libfabric/man/fi_rma.3 b/opal/mca/common/libfabric/libfabric/man/fi_rma.3 index 15ecc7d0e9..fd71cc9c38 100644 --- a/opal/mca/common/libfabric/libfabric/man/fi_rma.3 +++ b/opal/mca/common/libfabric/libfabric/man/fi_rma.3 @@ -1,4 +1,4 @@ -.TH fi_rma 3 "2015\-01\-28" "Libfabric Programmer\[aq]s Manual" "Libfabric v1.0.0rc1" +.TH fi_rma 3 "2015\-01\-28" "Libfabric Programmer\[aq]s Manual" "Libfabric v1.0.0rc3" .SH NAME .PP fi_rma - Remote memory access operations diff --git a/opal/mca/common/libfabric/libfabric/man/fi_tagged.3 b/opal/mca/common/libfabric/libfabric/man/fi_tagged.3 index 2cbd1c902d..55f507c512 100644 --- a/opal/mca/common/libfabric/libfabric/man/fi_tagged.3 +++ b/opal/mca/common/libfabric/libfabric/man/fi_tagged.3 @@ -1,4 +1,4 @@ -.TH fi_tagged 3 "2015\-02\-12" "Libfabric Programmer\[aq]s Manual" "Libfabric v1.0.0rc1" +.TH fi_tagged 3 "2015\-02\-18" "Libfabric Programmer\[aq]s Manual" "Libfabric v1.0.0rc3" .SH NAME .PP fi_tagged - Tagged data transfer operations @@ -314,24 +314,6 @@ operations. the user. .PP \f[I]-FI_EOTHER\f[] : Indicates that an unspecified error occurred. -.SH NOTES -.SS Ordering -.PP -The order in which tags are matched is only defined for a pair of -sending and receiving endpoints. -The ordering is defined by the underlying protocol. -If a specific protocol is not selected for an endpoint, the libfabric -implementation will choose a protocol that satisfies the following -requirement from the MPI-3.0 specification (page 41, lines 1-5): -.RS -.PP -If a sender sends two messages in succession to the same destination, -and both match the same receive, then this operation cannot receive the -second message if the first one is still pending. -If a receiver posts two receives in succession, and both match the same -message, then the second receive operation cannot be satisfied by this -message, if the first one is still pending. -.RE .SH SEE ALSO .PP \f[C]fi_getinfo\f[](3), \f[C]fi_endpoint\f[](3), \f[C]fi_domain\f[](3), diff --git a/opal/mca/common/libfabric/libfabric/man/fi_trigger.3 b/opal/mca/common/libfabric/libfabric/man/fi_trigger.3 index 851fe71784..c525a28c8c 100644 --- a/opal/mca/common/libfabric/libfabric/man/fi_trigger.3 +++ b/opal/mca/common/libfabric/libfabric/man/fi_trigger.3 @@ -1,4 +1,4 @@ -.TH fi_trigger 3 "2015\-01\-01" "Libfabric Programmer\[aq]s Manual" "Libfabric v1.0.0rc1" +.TH fi_trigger 3 "2015\-01\-01" "Libfabric Programmer\[aq]s Manual" "Libfabric v1.0.0rc3" .SH NAME .PP fi_trigger - Triggered operations diff --git a/opal/mca/common/libfabric/libfabric/man/fi_version.3 b/opal/mca/common/libfabric/libfabric/man/fi_version.3 index 0063306b74..be35186e38 100644 --- a/opal/mca/common/libfabric/libfabric/man/fi_version.3 +++ b/opal/mca/common/libfabric/libfabric/man/fi_version.3 @@ -1,4 +1,4 @@ -.TH fi_version 3 "2015\-01\-08" "Libfabric Programmer\[aq]s Manual" "Libfabric v1.0.0rc1" +.TH fi_version 3 "2015\-01\-08" "Libfabric Programmer\[aq]s Manual" "Libfabric v1.0.0rc3" .SH NAME .PP fi_version - Version of the library interfaces diff --git a/opal/mca/common/libfabric/libfabric/prov/sockets/configure.m4 b/opal/mca/common/libfabric/libfabric/prov/sockets/configure.m4 index 021a5f8a90..0f21d59974 100644 --- a/opal/mca/common/libfabric/libfabric/prov/sockets/configure.m4 +++ b/opal/mca/common/libfabric/libfabric/prov/sockets/configure.m4 @@ -9,11 +9,31 @@ dnl $2: action if not configured successfully dnl AC_DEFUN([FI_SOCKETS_CONFIGURE],[ # Determine if we can support the sockets provider - sockets_happy=0 + sockets_h_happy=0 + sockets_shm_happy=0 AS_IF([test x"$enable_sockets" != x"no"], - [sockets_happy=1 - AC_CHECK_HEADER([sys/socket.h], [], [sockets_happy=0]) + [AC_CHECK_HEADER([sys/socket.h], [sockets_h_happy=1], + [sockets_h_happy=0]) + + + # check if shm_open is already present + AC_CHECK_FUNC([shm_open], + [sockets_shm_happy=1], + [sockets_shm_happy=0]) + + # look for shm_open in librt if not already present + AS_IF([test $sockets_shm_happy -eq 0], + [FI_CHECK_PACKAGE([sockets_shm], + [sys/mman.h], + [rt], + [shm_open], + [], + [], + [], + [sockets_shm_happy=1], + [sockets_shm_happy=0])]) ]) - AS_IF([test $sockets_happy -eq 1], [$1], [$2]) + AS_IF([test $sockets_h_happy -eq 1 && \ + test $sockets_shm_happy -eq 1], [$1], [$2]) ]) diff --git a/opal/mca/common/libfabric/libfabric/prov/sockets/src/sock.h b/opal/mca/common/libfabric/libfabric/prov/sockets/src/sock.h index 4c73d7b44a..ed7af56584 100644 --- a/opal/mca/common/libfabric/libfabric/prov/sockets/src/sock.h +++ b/opal/mca/common/libfabric/libfabric/prov/sockets/src/sock.h @@ -715,7 +715,8 @@ struct sock_cq { struct sock_conn_hdr { uint8_t type; - uint8_t reserved[7]; + uint8_t reserved[3]; + int32_t s_port; fid_t c_fid; fid_t s_fid; }; diff --git a/opal/mca/common/libfabric/libfabric/prov/sockets/src/sock_atomic.c b/opal/mca/common/libfabric/libfabric/prov/sockets/src/sock_atomic.c index d20ad6d288..ecd84957e2 100644 --- a/opal/mca/common/libfabric/libfabric/prov/sockets/src/sock_atomic.c +++ b/opal/mca/common/libfabric/libfabric/prov/sockets/src/sock_atomic.c @@ -488,6 +488,9 @@ static int sock_ep_atomic_valid(struct fid_ep *ep, enum fi_datatype datatype, } datatype_sz = fi_datatype_size(datatype); + if (datatype_sz == 0) + return -FI_ENOENT; + *count = (SOCK_EP_MAX_ATOMIC_SZ/datatype_sz); return 0; } diff --git a/opal/mca/common/libfabric/libfabric/prov/sockets/src/sock_av.c b/opal/mca/common/libfabric/libfabric/prov/sockets/src/sock_av.c index 796fa1d6e1..b5f4a485e2 100644 --- a/opal/mca/common/libfabric/libfabric/prov/sockets/src/sock_av.c +++ b/opal/mca/common/libfabric/libfabric/prov/sockets/src/sock_av.c @@ -513,6 +513,7 @@ static int sock_verify_av_attr(struct fi_av_attr *attr) int sock_av_open(struct fid_domain *domain, struct fi_av_attr *attr, struct fid_av **av, void *context) { + int ret = 0; struct sock_domain *dom; struct sock_av *_av; size_t table_sz, i; @@ -531,8 +532,8 @@ int sock_av_open(struct fid_domain *domain, struct fi_av_attr *attr, _av->key = calloc(_av->attr.count, sizeof(uint16_t)); if (!_av->key) { - free(_av); - return -FI_ENOMEM; + ret = -FI_ENOMEM; + goto err; } table_sz = sizeof(struct sock_av_table_hdr) + @@ -540,9 +541,10 @@ int sock_av_open(struct fid_domain *domain, struct fi_av_attr *attr, if (attr->name) { _av->name = calloc(1, FI_NAME_MAX); - if(!_av->name) - return -FI_ENOMEM; - + if(!_av->name) { + ret = -FI_ENOMEM; + goto err; + } strcpy(_av->name, attr->name); if (!(attr->flags & FI_READ)) flags |= O_CREAT; @@ -557,22 +559,24 @@ int sock_av_open(struct fid_domain *domain, struct fi_av_attr *attr, _av->shared_fd = shm_open(_av->name, flags, S_IRUSR | S_IWUSR); if (_av->shared_fd < 0) { SOCK_LOG_ERROR("shm_open failed\n"); - free(_av); - return -FI_EINVAL; + ret = -FI_EINVAL; + goto err; } if (ftruncate(_av->shared_fd, table_sz) == -1) { SOCK_LOG_ERROR("ftruncate failed\n"); shm_unlink(_av->name); - free(_av); - return -FI_EINVAL; + ret = -FI_EINVAL; + goto err; } _av->table_hdr = mmap(NULL, table_sz, PROT_READ | PROT_WRITE, MAP_SHARED, _av->shared_fd, 0); if (attr->flags & FI_READ) { - if (_av->table_hdr->size != _av->attr.count) - return -FI_EINVAL; + if (_av->table_hdr->size != _av->attr.count) { + ret = -FI_EINVAL; + goto err; + } } else { _av->table_hdr->size = _av->attr.count; _av->table_hdr->stored = 0; @@ -581,13 +585,15 @@ int sock_av_open(struct fid_domain *domain, struct fi_av_attr *attr, if (_av->table_hdr == MAP_FAILED) { SOCK_LOG_ERROR("mmap failed\n"); shm_unlink(_av->name); - free(_av); - return -FI_EINVAL; + ret = -FI_EINVAL; + goto err; } } else { _av->table_hdr = calloc(1, table_sz); - if (!_av->table_hdr) - return -FI_ENOMEM; + if (!_av->table_hdr) { + ret = -FI_ENOMEM; + goto err; + } _av->table_hdr->size = _av->attr.count; _av->table_hdr->req_sz = attr->count; } @@ -606,6 +612,7 @@ int sock_av_open(struct fid_domain *domain, struct fi_av_attr *attr, _av->av_fid.ops = &sock_at_ops; break; default: + ret = -FI_EINVAL; goto err; } @@ -618,6 +625,7 @@ int sock_av_open(struct fid_domain *domain, struct fi_av_attr *attr, break; default: SOCK_LOG_ERROR("Invalid address format: only IPv4 supported\n"); + ret = -FI_EINVAL; goto err; } _av->rx_ctx_bits = attr->rx_ctx_bits; @@ -627,5 +635,5 @@ int sock_av_open(struct fid_domain *domain, struct fi_av_attr *attr, return 0; err: free(_av); - return -EINVAL; + return ret; } diff --git a/opal/mca/common/libfabric/libfabric/prov/sockets/src/sock_cntr.c b/opal/mca/common/libfabric/libfabric/prov/sockets/src/sock_cntr.c index 2bdadbebe9..7e91f1a558 100644 --- a/opal/mca/common/libfabric/libfabric/prov/sockets/src/sock_cntr.c +++ b/opal/mca/common/libfabric/libfabric/prov/sockets/src/sock_cntr.c @@ -315,6 +315,9 @@ int sock_cntr_open(struct fid_domain *domain, struct fi_cntr_attr *attr, break; case FI_WAIT_SET: + if (!attr) + return -FI_EINVAL; + _cntr->waitset = attr->wait_set; _cntr->signal = 1; wait = container_of(attr->wait_set, struct sock_wait, wait_fid); diff --git a/opal/mca/common/libfabric/libfabric/prov/sockets/src/sock_comm.c b/opal/mca/common/libfabric/libfabric/prov/sockets/src/sock_comm.c index 4da1c0ebe4..495a82ed60 100644 --- a/opal/mca/common/libfabric/libfabric/prov/sockets/src/sock_comm.c +++ b/opal/mca/common/libfabric/libfabric/prov/sockets/src/sock_comm.c @@ -208,25 +208,29 @@ int sock_comm_buffer_init(struct sock_conn *conn) socklen_t optlen = sizeof(socklen_t); optval = 1; - setsockopt(conn->sock_fd, IPPROTO_TCP, TCP_NODELAY, - &optval, sizeof optval); + if (setsockopt(conn->sock_fd, IPPROTO_TCP, TCP_NODELAY, + &optval, sizeof optval)) + SOCK_LOG_ERROR("setsockopt failed\n"); flags = fcntl(conn->sock_fd, F_GETFL, 0); - fcntl(conn->sock_fd, F_SETFL, flags | O_NONBLOCK); + if (fcntl(conn->sock_fd, F_SETFL, flags | O_NONBLOCK)) + SOCK_LOG_ERROR("fcntl failed\n"); rbinit(&conn->inbuf, SOCK_COMM_BUF_SZ); rbinit(&conn->outbuf, SOCK_COMM_BUF_SZ); - setsockopt(conn->sock_fd, SOL_SOCKET, SO_RCVBUF, &size, optlen); - setsockopt(conn->sock_fd, SOL_SOCKET, SO_SNDBUF, &size, optlen); + if (setsockopt(conn->sock_fd, SOL_SOCKET, SO_RCVBUF, &size, optlen)) + SOCK_LOG_ERROR("setsockopt failed\n"); - getsockopt(conn->sock_fd, SOL_SOCKET, SO_RCVBUF, &size, &optlen); - SOCK_LOG_INFO("SO_RCVBUF: %d\n", size); - + if (setsockopt(conn->sock_fd, SOL_SOCKET, SO_SNDBUF, &size, optlen)) + SOCK_LOG_ERROR("setsockopt failed\n"); + + if (!getsockopt(conn->sock_fd, SOL_SOCKET, SO_RCVBUF, &size, &optlen)) + SOCK_LOG_INFO("SO_RCVBUF: %d\n", size); + optlen = sizeof(socklen_t); - getsockopt(conn->sock_fd, SOL_SOCKET, SO_SNDBUF, &size, &optlen); - SOCK_LOG_INFO("SO_SNDBUF: %d\n", size); - + if (!getsockopt(conn->sock_fd, SOL_SOCKET, SO_SNDBUF, &size, &optlen)) + SOCK_LOG_INFO("SO_SNDBUF: %d\n", size); return 0; } diff --git a/opal/mca/common/libfabric/libfabric/prov/sockets/src/sock_conn.c b/opal/mca/common/libfabric/libfabric/prov/sockets/src/sock_conn.c index 5197745a70..154b35f708 100644 --- a/opal/mca/common/libfabric/libfabric/prov/sockets/src/sock_conn.c +++ b/opal/mca/common/libfabric/libfabric/prov/sockets/src/sock_conn.c @@ -164,14 +164,16 @@ uint16_t sock_conn_map_connect(struct sock_domain *dom, } optval = 1; - setsockopt(conn_fd, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof optval); + if (setsockopt(conn_fd, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof optval)) + SOCK_LOG_ERROR("setsockopt failed\n"); memcpy(sa_ip, inet_ntoa(addr->sin_addr), INET_ADDRSTRLEN); SOCK_LOG_INFO("Connecting to: %s:%d\n", sa_ip, ntohs(((struct sockaddr_in*)addr)->sin_port)); flags = fcntl(conn_fd, F_GETFL, 0); - fcntl(conn_fd, F_SETFL, flags | O_NONBLOCK); + if (fcntl(conn_fd, F_SETFL, flags | O_NONBLOCK)) + SOCK_LOG_ERROR("fcntl failed\n"); fastlock_acquire(&map->lock); memcpy(&map->curr_addr, addr, sizeof(struct sockaddr_in)); @@ -191,40 +193,43 @@ uint16_t sock_conn_map_connect(struct sock_domain *dom, if (optval) { SOCK_LOG_ERROR("failed to connect %d - %s\n", optval, strerror(optval)); - close(conn_fd); - return 0; + ret = 0; + goto err; } } else { SOCK_LOG_ERROR("Timeout or error to connect %d - %s\n", optval, strerror(optval)); - close(conn_fd); - return 0; + ret = 0; + goto err; } } else { SOCK_LOG_ERROR("Error connecting %d - %s\n", errno, strerror(errno)); - close(conn_fd); - return 0; + ret = 0; + goto err; } } flags = fcntl(conn_fd, F_GETFL, 0); flags &= (~O_NONBLOCK); - fcntl(conn_fd, F_SETFL, flags); + if (fcntl(conn_fd, F_SETFL, flags)) + SOCK_LOG_ERROR("fcntl failed\n"); ret = send(conn_fd, &((struct sockaddr_in*)&dom->src_addr)->sin_port, sizeof(unsigned short), 0); if (ret != sizeof(unsigned short)) { SOCK_LOG_ERROR("Cannot exchange port\n"); - return 0; + ret = 0; + goto err; } ret = recv(conn_fd, &reply, sizeof(unsigned short), 0); if (ret != sizeof(unsigned short)) { SOCK_LOG_ERROR("Cannot exchange port: %d\n", ret); - return 0; + ret = 0; + goto err; } reply = ntohs(reply); @@ -248,6 +253,10 @@ uint16_t sock_conn_map_connect(struct sock_domain *dom, } return ret; + +err: + close(conn_fd); + return ret; } uint16_t sock_conn_map_match_or_connect(struct sock_domain *dom, @@ -270,13 +279,13 @@ static void *_sock_conn_listen(void *arg) struct sock_conn_map *map = &domain->r_cmap; struct addrinfo *s_res = NULL, *p; struct addrinfo hints; - int optval, flags, tmp; + int optval, flags; int listen_fd = 0, conn_fd, ret; struct sockaddr_in remote; socklen_t addr_size; struct pollfd poll_fds[2]; struct sockaddr_in addr; - char sa_ip[INET_ADDRSTRLEN]; + char sa_ip[INET_ADDRSTRLEN], tmp; unsigned short port, response; uint16_t index; @@ -297,11 +306,13 @@ static void *_sock_conn_listen(void *arg) listen_fd = socket(p->ai_family, p->ai_socktype, p->ai_protocol); if (listen_fd >= 0) { flags = fcntl(listen_fd, F_GETFL, 0); - fcntl(listen_fd, F_SETFL, flags | O_NONBLOCK); + if (fcntl(listen_fd, F_SETFL, flags | O_NONBLOCK)) + SOCK_LOG_ERROR("fcntl failed\n"); optval = 1; - setsockopt(listen_fd, SOL_SOCKET, SO_REUSEADDR, &optval, - sizeof optval); + if (setsockopt(listen_fd, SOL_SOCKET, SO_REUSEADDR, &optval, + sizeof optval)) + SOCK_LOG_ERROR("setsockopt failed\n"); if (!bind(listen_fd, s_res->ai_addr, s_res->ai_addrlen)) break; @@ -340,7 +351,11 @@ static void *_sock_conn_listen(void *arg) while(domain->listening) { if (poll(poll_fds, 2, -1) > 0) { if (poll_fds[1].revents & POLLIN) { - read(domain->signal_fds[1], &tmp, 1); + ret = read(domain->signal_fds[1], &tmp, 1); + if (ret != 1) { + SOCK_LOG_ERROR("Invalid signal\n"); + goto err; + } continue; } } else @@ -355,7 +370,11 @@ static void *_sock_conn_listen(void *arg) } addr_size = sizeof(struct sockaddr_in); - getpeername(conn_fd, (struct sockaddr *) &remote, &addr_size); + if (getpeername(conn_fd, (struct sockaddr *) &remote, &addr_size)) { + SOCK_LOG_ERROR("Failed to do getpeername\n"); + goto err; + } + memcpy(sa_ip, inet_ntoa(remote.sin_addr), INET_ADDRSTRLEN); SOCK_LOG_INFO("ACCEPT: %s, %d\n", sa_ip, ntohs(remote.sin_port)); @@ -400,7 +419,8 @@ static void *_sock_conn_listen(void *arg) return NULL; err: - close(listen_fd); + if (listen_fd > 0) + close(listen_fd); perror("listening thread failed"); return NULL; } diff --git a/opal/mca/common/libfabric/libfabric/prov/sockets/src/sock_cq.c b/opal/mca/common/libfabric/libfabric/prov/sockets/src/sock_cq.c index 05abc5fe79..fb5fb59e07 100644 --- a/opal/mca/common/libfabric/libfabric/prov/sockets/src/sock_cq.c +++ b/opal/mca/common/libfabric/libfabric/prov/sockets/src/sock_cq.c @@ -556,6 +556,9 @@ int sock_cq_open(struct fid_domain *domain, struct fi_cq_attr *attr, break; case FI_WAIT_SET: + if (!attr) + return -FI_EINVAL; + sock_cq->waitset = attr->wait_set; sock_cq->signal = 1; wait = container_of(attr->wait_set, struct sock_wait, wait_fid); diff --git a/opal/mca/common/libfabric/libfabric/prov/sockets/src/sock_dom.c b/opal/mca/common/libfabric/libfabric/prov/sockets/src/sock_dom.c index 0628f138fd..24522211f4 100644 --- a/opal/mca/common/libfabric/libfabric/prov/sockets/src/sock_dom.c +++ b/opal/mca/common/libfabric/libfabric/prov/sockets/src/sock_dom.c @@ -118,7 +118,8 @@ static int sock_dom_close(struct fid *fid) { struct sock_domain *dom; void *res; - int c; + int ret; + char c = 0; dom = container_of(fid, struct sock_domain, dom_fid.fid); if (atomic_get(&dom->ref)) { @@ -126,7 +127,12 @@ static int sock_dom_close(struct fid *fid) } dom->listening = 0; - write(dom->signal_fds[0], &c, 1); + ret = write(dom->signal_fds[0], &c, 1); + if (ret != 1) { + SOCK_LOG_ERROR("Failed to signal\n"); + return -FI_EINVAL; + } + if (pthread_join(dom->listen_thread, &res)) { SOCK_LOG_ERROR("could not join listener thread, errno = %d\n", errno); return -FI_EBUSY; @@ -462,7 +468,9 @@ int sock_domain(struct fid_fabric *fabric, struct fi_info *info, goto err; flags = fcntl(sock_domain->signal_fds[1], F_GETFL, 0); - fcntl(sock_domain->signal_fds[1], F_SETFL, flags | O_NONBLOCK); + if (fcntl(sock_domain->signal_fds[1], F_SETFL, flags | O_NONBLOCK)) + SOCK_LOG_ERROR("fcntl failed\n"); + sock_conn_listen(sock_domain); while(!(volatile int)sock_domain->listening) diff --git a/opal/mca/common/libfabric/libfabric/prov/sockets/src/sock_ep.c b/opal/mca/common/libfabric/libfabric/prov/sockets/src/sock_ep.c index 15435d8df9..e769b7815e 100644 --- a/opal/mca/common/libfabric/libfabric/prov/sockets/src/sock_ep.c +++ b/opal/mca/common/libfabric/libfabric/prov/sockets/src/sock_ep.c @@ -1252,7 +1252,9 @@ int sock_alloc_endpoint(struct fid_domain *domain, struct fi_info *info, /* default config */ sock_ep->min_multi_recv = SOCK_EP_MIN_MULTI_RECV; - memcpy(&sock_ep->info, info, sizeof(struct fi_info)); + if (info) { + memcpy(&sock_ep->info, info, sizeof(struct fi_info)); + } sock_ep->domain = sock_dom; atomic_inc(&sock_dom->ref); return 0; diff --git a/opal/mca/common/libfabric/libfabric/prov/sockets/src/sock_ep_dgram.c b/opal/mca/common/libfabric/libfabric/prov/sockets/src/sock_ep_dgram.c index c5dae32ef7..95462ea2a0 100644 --- a/opal/mca/common/libfabric/libfabric/prov/sockets/src/sock_ep_dgram.c +++ b/opal/mca/common/libfabric/libfabric/prov/sockets/src/sock_ep_dgram.c @@ -213,11 +213,11 @@ int sock_dgram_getinfo(uint32_t version, const char *node, const char *service, uint64_t flags, struct fi_info *hints, struct fi_info **info) { int ret; - int udp_sock; + int udp_sock = 0; socklen_t len; struct fi_info *_info; struct addrinfo sock_hints; - struct addrinfo *result = NULL; + struct addrinfo *result = NULL, *result_ptr = NULL; struct sockaddr_in *src_addr = NULL, *dest_addr = NULL; char sa_ip[INET_ADDRSTRLEN]; char hostname[HOST_NAME_MAX]; @@ -264,13 +264,14 @@ int sock_dgram_getinfo(uint32_t version, const char *node, const char *service, } ret = getaddrinfo(node ? node : hostname, service, - &sock_hints, &result); + &sock_hints, &result_ptr); if (ret != 0) { ret = FI_ENODATA; SOCK_LOG_INFO("getaddrinfo failed!\n"); goto err; } + result = result_ptr; while (result) { if (result->ai_family == AF_INET && result->ai_addrlen == sizeof(struct sockaddr_in)) @@ -290,16 +291,18 @@ int sock_dgram_getinfo(uint32_t version, const char *node, const char *service, goto err; } memcpy(src_addr, result->ai_addr, result->ai_addrlen); - freeaddrinfo(result); - } else if (node || service) { + freeaddrinfo(result_ptr); + result_ptr = NULL; + } else { - ret = getaddrinfo(node, service, &sock_hints, &result); + ret = getaddrinfo(node, service, &sock_hints, &result_ptr); if (ret != 0) { ret = FI_ENODATA; SOCK_LOG_INFO("getaddrinfo failed!\n"); goto err; } + result = result_ptr; while (result) { if (result->ai_family == AF_INET && result->ai_addrlen == sizeof(struct sockaddr_in)) @@ -321,6 +324,11 @@ int sock_dgram_getinfo(uint32_t version, const char *node, const char *service, memcpy(dest_addr, result->ai_addr, result->ai_addrlen); udp_sock = socket(AF_INET, SOCK_DGRAM, 0); + if (udp_sock < 0) { + ret = -FI_ENOMEM; + goto err; + } + ret = connect(udp_sock, result->ai_addr, result->ai_addrlen); if ( ret != 0) { @@ -338,15 +346,16 @@ int sock_dgram_getinfo(uint32_t version, const char *node, const char *service, ret = getsockname(udp_sock, (struct sockaddr*)src_addr, &len); if (ret != 0) { SOCK_LOG_ERROR("getsockname failed\n"); - close(udp_sock); ret = FI_ENODATA; goto err; } close(udp_sock); - freeaddrinfo(result); + udp_sock = 0; + freeaddrinfo(result_ptr); + result_ptr = NULL; } - if (hints->src_addr) { + if (hints && hints->src_addr) { if (!src_addr) { src_addr = calloc(1, sizeof(struct sockaddr_in)); if (!src_addr) { @@ -358,7 +367,7 @@ int sock_dgram_getinfo(uint32_t version, const char *node, const char *service, memcpy(src_addr, hints->src_addr, hints->src_addrlen); } - if (hints->dest_addr) { + if (hints && hints->dest_addr) { if (!dest_addr) { dest_addr = calloc(1, sizeof(struct sockaddr_in)); if (!dest_addr) { @@ -396,10 +405,15 @@ int sock_dgram_getinfo(uint32_t version, const char *node, const char *service, return 0; err: + if (udp_sock > 0) + close(udp_sock); if (src_addr) free(src_addr); if (dest_addr) free(dest_addr); + if (result_ptr) + freeaddrinfo(result_ptr); + SOCK_LOG_ERROR("fi_getinfo failed\n"); return ret; } diff --git a/opal/mca/common/libfabric/libfabric/prov/sockets/src/sock_ep_msg.c b/opal/mca/common/libfabric/libfabric/prov/sockets/src/sock_ep_msg.c index bbf6629616..651a4718b2 100644 --- a/opal/mca/common/libfabric/libfabric/prov/sockets/src/sock_ep_msg.c +++ b/opal/mca/common/libfabric/libfabric/prov/sockets/src/sock_ep_msg.c @@ -214,11 +214,11 @@ int sock_msg_getinfo(uint32_t version, const char *node, const char *service, uint64_t flags, struct fi_info *hints, struct fi_info **info) { int ret; - int udp_sock; + int udp_sock = 0; socklen_t len; struct fi_info *_info; struct addrinfo sock_hints; - struct addrinfo *result = NULL; + struct addrinfo *result = NULL, *result_ptr = NULL; struct sockaddr_in *src_addr = NULL, *dest_addr = NULL; char sa_ip[INET_ADDRSTRLEN]; char hostname[HOST_NAME_MAX]; @@ -265,13 +265,14 @@ int sock_msg_getinfo(uint32_t version, const char *node, const char *service, } ret = getaddrinfo(node ? node : hostname, service, - &sock_hints, &result); + &sock_hints, &result_ptr); if (ret != 0) { ret = FI_ENODATA; SOCK_LOG_INFO("getaddrinfo failed!\n"); goto err; } + result = result_ptr; while (result) { if (result->ai_family == AF_INET && result->ai_addrlen == sizeof(struct sockaddr_in)) @@ -291,16 +292,18 @@ int sock_msg_getinfo(uint32_t version, const char *node, const char *service, goto err; } memcpy(src_addr, result->ai_addr, result->ai_addrlen); - freeaddrinfo(result); - } else if (node || service) { + freeaddrinfo(result_ptr); + result_ptr = NULL; + } else { - ret = getaddrinfo(node, service, &sock_hints, &result); + ret = getaddrinfo(node, service, &sock_hints, &result_ptr); if (ret != 0) { ret = FI_ENODATA; SOCK_LOG_INFO("getaddrinfo failed!\n"); goto err; } + result = result_ptr; while (result) { if (result->ai_family == AF_INET && result->ai_addrlen == sizeof(struct sockaddr_in)) @@ -322,6 +325,11 @@ int sock_msg_getinfo(uint32_t version, const char *node, const char *service, memcpy(dest_addr, result->ai_addr, result->ai_addrlen); udp_sock = socket(AF_INET, SOCK_DGRAM, 0); + if (udp_sock < 0) { + ret = -FI_ENOMEM; + goto err; + } + ret = connect(udp_sock, result->ai_addr, result->ai_addrlen); if ( ret != 0) { @@ -339,20 +347,28 @@ int sock_msg_getinfo(uint32_t version, const char *node, const char *service, ret = getsockname(udp_sock, (struct sockaddr*)src_addr, &len); if (ret != 0) { SOCK_LOG_ERROR("getsockname failed\n"); - close(udp_sock); ret = FI_ENODATA; goto err; } close(udp_sock); - freeaddrinfo(result); + udp_sock = 0; + freeaddrinfo(result_ptr); + result_ptr = NULL; } - if (hints->src_addr) { + if (hints && hints->src_addr) { + if (!src_addr) { + src_addr = calloc(1, sizeof(struct sockaddr_in)); + if (!src_addr) { + ret = -FI_ENOMEM; + goto err; + } + } assert(hints->src_addrlen == sizeof(struct sockaddr_in)); memcpy(src_addr, hints->src_addr, hints->src_addrlen); } - if (hints->dest_addr) { + if (hints && hints->dest_addr) { if (!dest_addr) { dest_addr = calloc(1, sizeof(struct sockaddr_in)); if (!dest_addr) { @@ -365,26 +381,12 @@ int sock_msg_getinfo(uint32_t version, const char *node, const char *service, } if (dest_addr) { - if (!dest_addr) { - dest_addr = calloc(1, sizeof(struct sockaddr_in)); - if (!dest_addr) { - ret = -FI_ENOMEM; - goto err; - } - } memcpy(sa_ip, inet_ntoa(dest_addr->sin_addr), INET_ADDRSTRLEN); SOCK_LOG_INFO("dest_addr: family: %d, IP is %s\n", ((struct sockaddr_in*)dest_addr)->sin_family, sa_ip); } if (src_addr) { - if (!src_addr) { - src_addr = calloc(1, sizeof(struct sockaddr_in)); - if (!src_addr) { - ret = -FI_ENOMEM; - goto err; - } - } memcpy(sa_ip, inet_ntoa(src_addr->sin_addr), INET_ADDRSTRLEN); SOCK_LOG_INFO("src_addr: family: %d, IP is %s\n", ((struct sockaddr_in*)src_addr)->sin_family, sa_ip); @@ -404,25 +406,47 @@ int sock_msg_getinfo(uint32_t version, const char *node, const char *service, return 0; err: + if (udp_sock > 0) + close(udp_sock); if (src_addr) free(src_addr); if (dest_addr) free(dest_addr); + if (result_ptr) + freeaddrinfo(result_ptr); + SOCK_LOG_ERROR("fi_getinfo failed\n"); return ret; } static int sock_ep_cm_getname(fid_t fid, void *addr, size_t *addrlen) { - struct sock_ep *sock_ep; + struct sock_ep *sock_ep = NULL; + struct sock_pep *sock_pep = NULL; + if (*addrlen == 0) { *addrlen = sizeof(struct sockaddr_in); return -FI_ETOOSMALL; } - sock_ep = container_of(fid, struct sock_ep, ep.fid); *addrlen = MIN(*addrlen, sizeof(struct sockaddr_in)); - memcpy(addr, sock_ep->src_addr, *addrlen); + + switch(fid->fclass) { + + case FI_CLASS_EP: + sock_ep = container_of(fid, struct sock_ep, ep.fid); + memcpy(addr, sock_ep->src_addr, *addrlen); + break; + + case FI_CLASS_PEP: + sock_pep = container_of(fid, struct sock_pep, pep.fid); + memcpy(addr, &sock_pep->src_addr, *addrlen); + break; + + default: + SOCK_LOG_ERROR("Invalid argument\n"); + return -FI_EINVAL; + } return 0; } @@ -449,8 +473,9 @@ static int sock_ep_cm_create_socket() return 0; optval = 1; - setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, - &optval, sizeof optval); + if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, + &optval, sizeof optval)) + SOCK_LOG_ERROR("setsockopt failed\n"); return sock; } @@ -459,7 +484,7 @@ static int sock_ep_cm_send_msg(int sock_fd, const struct sockaddr_in *addr, void *msg, size_t len) { int ret, retry = 0; - unsigned char response; + unsigned char response = 0; struct sockaddr_in from_addr; socklen_t addr_len; char sa_ip[INET_ADDRSTRLEN] = {0}; @@ -516,19 +541,25 @@ static int sock_ep_cm_send_ack(int sock_fd, struct sockaddr_in *addr) static void *sock_msg_ep_listener_thread (void *data) { - struct sock_ep *ep = (struct sock_ep *)data; - struct sock_conn_response *conn_response = NULL; - - struct fi_eq_cm_entry cm_entry; + struct sock_ep *ep = data; + struct sock_conn_response *conn_response; + struct fi_eq_cm_entry *cm_entry; struct fi_eq_err_entry cm_err_entry; struct sockaddr_in from_addr; socklen_t addr_len; - int ret, user_data_sz; + int ret, user_data_sz, entry_sz; struct fid_ep *fid_ep; struct sock_ep *sock_ep; SOCK_LOG_INFO("Starting listener thread for EP: %p\n", ep); + conn_response = malloc(sizeof(*conn_response) + SOCK_EP_MAX_CM_DATA_SZ); + cm_entry = malloc(sizeof(*cm_entry) + SOCK_EP_MAX_CM_DATA_SZ); + if (!conn_response || !cm_entry) { + SOCK_LOG_ERROR("cannot allocate\n"); + return NULL; + } + ep->do_listen = 1; while((volatile int)ep->do_listen) { @@ -536,16 +567,6 @@ static void *sock_msg_ep_listener_thread (void *data) if (ret <= 0) continue; - if (conn_response == NULL) { - conn_response = (struct sock_conn_response*) - calloc(1, sizeof(*conn_response) + - SOCK_EP_MAX_CM_DATA_SZ); - if (!conn_response) { - SOCK_LOG_ERROR("cannot allocate\n"); - return NULL; - } - } - addr_len = sizeof(struct sockaddr_in); ret = recvfrom(ep->socket, (char*)conn_response, sizeof(*conn_response) + SOCK_EP_MAX_CM_DATA_SZ, @@ -559,56 +580,44 @@ static void *sock_msg_ep_listener_thread (void *data) !sock_ep_cm_send_ack(ep->socket, &from_addr)) continue; - user_data_sz = 0; + user_data_sz = ret - sizeof(*conn_response); + switch (conn_response->hdr.type) { - case SOCK_CONN_ACCEPT: SOCK_LOG_INFO("Received SOCK_CONN_ACCEPT\n"); - memset(&cm_entry, 0, sizeof(cm_entry)); - cm_entry.fid = conn_response->hdr.c_fid; + entry_sz = sizeof(*cm_entry) + user_data_sz; + memset(cm_entry, 0, sizeof *cm_entry); + cm_entry->fid = conn_response->hdr.c_fid; - if (ret > sizeof(struct sock_conn_response)) { - user_data_sz = ret - - sizeof(struct sock_conn_response); - memcpy(&cm_entry.data, - (char *)conn_response + - sizeof(struct sock_conn_response), - user_data_sz); - } + memcpy(&cm_entry->data, &conn_response->user_data, + user_data_sz); fid_ep = container_of(conn_response->hdr.c_fid, struct fid_ep, fid); sock_ep = container_of(fid_ep, struct sock_ep, ep); sock_ep->connected = 1; + + ((struct sockaddr_in*)sock_ep->dest_addr)->sin_port = + conn_response->hdr.s_port; + sock_ep_enable(&ep->ep); - if (sock_eq_report_event(ep->eq, FI_CONNECTED, &cm_entry, - sizeof(cm_entry) + user_data_sz, 0)) + if (sock_eq_report_event(ep->eq, FI_CONNECTED, cm_entry, + entry_sz, 0)) SOCK_LOG_ERROR("Error in writing to EQ\n"); break; case SOCK_CONN_REJECT: SOCK_LOG_INFO("Received SOCK_CONN_REJECT\n"); - memset(&cm_err_entry, 0, sizeof(cm_err_entry)); + memset(&cm_err_entry, 0, sizeof cm_err_entry); cm_err_entry.fid = conn_response->hdr.c_fid; - cm_err_entry.context = NULL; - cm_err_entry.data = 0; cm_err_entry.err = -FI_ECONNREFUSED; - cm_err_entry.prov_errno = 0; - cm_err_entry.err_data = NULL; - if (ret > sizeof(struct sock_conn_response)) { - user_data_sz = ret - - sizeof(struct sock_conn_response); - memcpy(&cm_entry.data, - (char *)conn_response + - sizeof(struct sock_conn_response), - user_data_sz); - } + /* TODO: Fix reporting err_data */ + //cm_err_entry->err_data = &conn_response->user_data; if (sock_eq_report_event(ep->eq, FI_ECONNREFUSED, &cm_err_entry, - sizeof (cm_err_entry) + - user_data_sz, 0)) + sizeof cm_err_entry, 0)) SOCK_LOG_ERROR("Error in writing to EQ\n"); goto out; @@ -616,12 +625,11 @@ static void *sock_msg_ep_listener_thread (void *data) SOCK_LOG_ERROR("Invalid event\n"); break; } - conn_response = NULL; } out: - if (conn_response) - free(conn_response); + free(conn_response); + free(cm_entry); close(ep->socket); ep->socket = 0; return NULL; @@ -644,6 +652,9 @@ static int sock_ep_cm_connect(struct fid_ep *ep, const void *addr, return -FI_ENOMEM; _ep->rem_ep_id = ((struct sockaddr *)addr)->sa_family; + ((struct sockaddr_in*)_ep->src_addr)->sin_port = + htons(atoi(_ep->domain->service)); + ((struct sockaddr *)addr)->sa_family = AF_INET; req->hdr.type = SOCK_CONN_REQ; @@ -651,7 +662,7 @@ static int sock_ep_cm_connect(struct fid_ep *ep, const void *addr, req->hdr.c_fid = &ep->fid; req->hdr.s_fid = 0; memcpy(&req->info, &_ep->info, sizeof(struct fi_info)); - memcpy(&req->src_addr, _ep->info.src_addr, sizeof(struct sockaddr_in)); + memcpy(&req->src_addr, _ep->src_addr, sizeof(struct sockaddr_in)); memcpy(&req->dest_addr, _ep->info.dest_addr, sizeof(struct sockaddr_in)); memcpy(&req->tx_attr, _ep->info.tx_attr, sizeof(struct fi_tx_attr)); memcpy(&req->rx_attr, _ep->info.rx_attr, sizeof(struct fi_rx_attr)); @@ -717,6 +728,7 @@ static int sock_ep_cm_accept(struct fid_ep *ep, const void *param, size_t paraml _ep->rem_ep_id = req->ep_id; response->hdr.type = SOCK_CONN_ACCEPT; response->hdr.s_fid = &ep->fid; + response->hdr.s_port = htons(atoi(_ep->domain->service)); _ep->socket = sock_ep_cm_create_socket(); if (!_ep->socket) { @@ -833,12 +845,16 @@ static int sock_pep_fi_bind(fid_t fid, struct fid *bfid, uint64_t flags) static int sock_pep_fi_close(fid_t fid) { - int c; + int ret; + char c = 0; struct sock_pep *pep; pep = container_of(fid, struct sock_pep, pep.fid); pep->do_listen = 0; - write(pep->signal_fds[0], &c, 1); + ret = write(pep->signal_fds[0], &c, 1); + if (ret != 1) + SOCK_LOG_ERROR("Failed to signal\n"); + pthread_join(pep->listener_thread, NULL); free(pep); return 0; @@ -878,14 +894,19 @@ static void *sock_pep_listener_thread (void *data) { struct sock_pep *pep = (struct sock_pep *)data; struct sock_conn_req *conn_req = NULL; - struct fi_eq_cm_entry cm_entry; + struct fi_eq_cm_entry *cm_entry; struct sockaddr_in from_addr; struct pollfd poll_fds[2]; socklen_t addr_len; - int ret, user_data_sz, tmp; + int ret, user_data_sz, entry_sz, tmp; SOCK_LOG_INFO("Starting listener thread for PEP: %p\n", pep); + cm_entry = malloc(sizeof(*cm_entry) + SOCK_EP_MAX_CM_DATA_SZ); + if (!cm_entry) { + SOCK_LOG_ERROR("cannot allocate\n"); + return NULL; + } poll_fds[0].fd = pep->socket; poll_fds[1].fd = pep->signal_fds[1]; @@ -896,19 +917,18 @@ static void *sock_pep_listener_thread (void *data) read(pep->signal_fds[1], &tmp, 1); continue; } - } else - return NULL; - - if (conn_req == NULL) { - conn_req = (struct sock_conn_req*)calloc(1, - sizeof(*conn_req) + - SOCK_EP_MAX_CM_DATA_SZ); - if (!conn_req) { - SOCK_LOG_ERROR("cannot allocate\n"); - return NULL; - } + } else { + break; } + if (conn_req == NULL) { + conn_req = malloc(sizeof(*conn_req) + SOCK_EP_MAX_CM_DATA_SZ); + if (!conn_req) { + SOCK_LOG_ERROR("cannot allocate\n"); + break; + } + } + addr_len = sizeof(struct sockaddr_in); ret = recvfrom(pep->socket, (char*)conn_req, sizeof(*conn_req) + SOCK_EP_MAX_CM_DATA_SZ, 0, @@ -918,8 +938,10 @@ static void *sock_pep_listener_thread (void *data) memcpy(&conn_req->from_addr, &from_addr, sizeof(struct sockaddr_in)); SOCK_LOG_INFO("Msg received: %d\n", ret); - memset(&cm_entry, 0, sizeof(cm_entry)); - user_data_sz = 0; + user_data_sz = ret - sizeof(*conn_req); + entry_sz = sizeof(*cm_entry) + user_data_sz; + + memset(cm_entry, 0, sizeof *cm_entry); if (conn_req->hdr.type == SOCK_CONN_REQ) { SOCK_LOG_INFO("Received SOCK_CONN_REQ\n"); @@ -929,26 +951,24 @@ static void *sock_pep_listener_thread (void *data) break; } - cm_entry.info = sock_ep_msg_process_info(conn_req); - cm_entry.info->connreq = (fi_connreq_t)conn_req; - if (ret > sizeof(struct sock_conn_req)) { - user_data_sz = ret - sizeof(struct sock_conn_req); - memcpy(&cm_entry.data, - (char *)conn_req + sizeof(struct sock_conn_req), - user_data_sz); - } + cm_entry->info = sock_ep_msg_process_info(conn_req); + cm_entry->info->connreq = (fi_connreq_t) conn_req; + + memcpy(&cm_entry->data, &conn_req->user_data, + user_data_sz); + conn_req = NULL; - if (sock_eq_report_event(pep->eq, FI_CONNREQ, &cm_entry, - sizeof(cm_entry) + user_data_sz, 0)) + if (sock_eq_report_event(pep->eq, FI_CONNREQ, cm_entry, + entry_sz, 0)) SOCK_LOG_ERROR("Error in writing to EQ\n"); } else { SOCK_LOG_ERROR("Invalid event\n"); } - conn_req = NULL; } if (conn_req) free(conn_req); + free(cm_entry); close(pep->socket); pep->socket = 0; return NULL; @@ -987,8 +1007,10 @@ static int sock_pep_create_listener_thread(struct sock_pep *pep) p->ai_protocol); if (pep->socket >= 0) { optval = 1; - setsockopt(pep->socket, SOL_SOCKET, SO_REUSEADDR, &optval, - sizeof optval); + if (setsockopt(pep->socket, SOL_SOCKET, SO_REUSEADDR, &optval, + sizeof optval)) + SOCK_LOG_ERROR("setsockopt failed\n"); + if (!bind(pep->socket, s_res->ai_addr, s_res->ai_addrlen)) break; close(pep->socket); @@ -1001,8 +1023,9 @@ static int sock_pep_create_listener_thread(struct sock_pep *pep) return -FI_EIO; optval = 1; - setsockopt(pep->socket, SOL_SOCKET, SO_REUSEADDR, &optval, - sizeof optval); + if (setsockopt(pep->socket, SOL_SOCKET, SO_REUSEADDR, &optval, + sizeof optval)) + SOCK_LOG_ERROR("setsockopt failed\n"); if (pep->src_addr.sin_port == 0) { addr_size = sizeof(addr); @@ -1084,7 +1107,7 @@ out: static struct fi_ops_cm sock_pep_cm_ops = { .size = sizeof(struct fi_ops_cm), - .getname = fi_no_getname, + .getname = sock_ep_cm_getname, .getpeer = fi_no_getpeer, .connect = fi_no_connect, .listen = sock_pep_listen, @@ -1146,6 +1169,8 @@ int sock_msg_passive_ep(struct fid_fabric *fabric, struct fi_info *info, goto err; } memcpy(&_pep->src_addr, result->ai_addr, result->ai_addrlen); + freeaddrinfo(result); + result = NULL; } _pep->info = *info; } else { @@ -1157,7 +1182,8 @@ int sock_msg_passive_ep(struct fid_fabric *fabric, struct fi_info *info, goto err; flags = fcntl(_pep->signal_fds[1], F_GETFL, 0); - fcntl(_pep->signal_fds[1], F_SETFL, flags | O_NONBLOCK); + if (fcntl(_pep->signal_fds[1], F_SETFL, flags | O_NONBLOCK)) + SOCK_LOG_ERROR("fcntl failed"); _pep->pep.fid.fclass = FI_CLASS_PEP; _pep->pep.fid.context = context; @@ -1169,6 +1195,8 @@ int sock_msg_passive_ep(struct fid_fabric *fabric, struct fi_info *info, *pep = &_pep->pep; return 0; err: + if (result) + freeaddrinfo(result); free(_pep); return ret; } diff --git a/opal/mca/common/libfabric/libfabric/prov/sockets/src/sock_ep_rdm.c b/opal/mca/common/libfabric/libfabric/prov/sockets/src/sock_ep_rdm.c index 76ea5b1a8d..346184d32e 100644 --- a/opal/mca/common/libfabric/libfabric/prov/sockets/src/sock_ep_rdm.c +++ b/opal/mca/common/libfabric/libfabric/prov/sockets/src/sock_ep_rdm.c @@ -215,11 +215,11 @@ int sock_rdm_getinfo(uint32_t version, const char *node, const char *service, uint64_t flags, struct fi_info *hints, struct fi_info **info) { int ret; - int udp_sock; + int udp_sock = 0; socklen_t len; struct fi_info *_info; struct addrinfo sock_hints; - struct addrinfo *result = NULL; + struct addrinfo *result = NULL, *result_ptr = NULL; struct sockaddr_in *src_addr = NULL, *dest_addr = NULL; char sa_ip[INET_ADDRSTRLEN]; char hostname[HOST_NAME_MAX]; @@ -262,13 +262,14 @@ int sock_rdm_getinfo(uint32_t version, const char *node, const char *service, } ret = getaddrinfo(node ? node : hostname, service, - &sock_hints, &result); + &sock_hints, &result_ptr); if (ret != 0) { ret = FI_ENODATA; SOCK_LOG_INFO("getaddrinfo failed!\n"); goto err; } + result = result_ptr; while (result) { if (result->ai_family == AF_INET && result->ai_addrlen == sizeof(struct sockaddr_in)) @@ -288,16 +289,18 @@ int sock_rdm_getinfo(uint32_t version, const char *node, const char *service, goto err; } memcpy(src_addr, result->ai_addr, result->ai_addrlen); - freeaddrinfo(result); - } else if (node || service) { + freeaddrinfo(result_ptr); + result_ptr = NULL; + } else { - ret = getaddrinfo(node, service, &sock_hints, &result); + ret = getaddrinfo(node, service, &sock_hints, &result_ptr); if (ret != 0) { ret = FI_ENODATA; SOCK_LOG_INFO("getaddrinfo failed!\n"); goto err; } + result = result_ptr; while (result) { if (result->ai_family == AF_INET && result->ai_addrlen == sizeof(struct sockaddr_in)) @@ -319,6 +322,11 @@ int sock_rdm_getinfo(uint32_t version, const char *node, const char *service, memcpy(dest_addr, result->ai_addr, result->ai_addrlen); udp_sock = socket(AF_INET, SOCK_DGRAM, 0); + if (udp_sock < 0) { + ret = -FI_ENOMEM; + goto err; + } + ret = connect(udp_sock, result->ai_addr, result->ai_addrlen); if ( ret != 0) { @@ -336,15 +344,16 @@ int sock_rdm_getinfo(uint32_t version, const char *node, const char *service, ret = getsockname(udp_sock, (struct sockaddr*)src_addr, &len); if (ret != 0) { SOCK_LOG_ERROR("getsockname failed\n"); - close(udp_sock); ret = FI_ENODATA; goto err; } close(udp_sock); - freeaddrinfo(result); + udp_sock = 0; + freeaddrinfo(result_ptr); + result_ptr = NULL; } - if (hints->src_addr) { + if (hints && hints->src_addr) { if (!src_addr) { src_addr = calloc(1, sizeof(struct sockaddr_in)); if (!src_addr) { @@ -356,7 +365,7 @@ int sock_rdm_getinfo(uint32_t version, const char *node, const char *service, memcpy(src_addr, hints->src_addr, hints->src_addrlen); } - if (hints->dest_addr) { + if (hints && hints->dest_addr) { if (!dest_addr) { dest_addr = calloc(1, sizeof(struct sockaddr_in)); if (!dest_addr) { @@ -394,10 +403,15 @@ int sock_rdm_getinfo(uint32_t version, const char *node, const char *service, return 0; err: + if (udp_sock > 0) + close(udp_sock); if (src_addr) free(src_addr); if (dest_addr) free(dest_addr); + if (result_ptr) + freeaddrinfo(result_ptr); + SOCK_LOG_ERROR("fi_getinfo failed\n"); return ret; } diff --git a/opal/mca/common/libfabric/libfabric/prov/sockets/src/sock_eq.c b/opal/mca/common/libfabric/libfabric/prov/sockets/src/sock_eq.c index 8ca2230463..16cafb6dfd 100644 --- a/opal/mca/common/libfabric/libfabric/prov/sockets/src/sock_eq.c +++ b/opal/mca/common/libfabric/libfabric/prov/sockets/src/sock_eq.c @@ -329,8 +329,10 @@ int sock_eq_openwait(struct sock_eq *eq, const char *service) p->ai_protocol); if (eq->wait_fd >= 0) { optval = 1; - setsockopt(eq->wait_fd, SOL_SOCKET, SO_REUSEADDR, &optval, - sizeof optval); + if (setsockopt(eq->wait_fd, SOL_SOCKET, SO_REUSEADDR, &optval, + sizeof optval)) + SOCK_LOG_ERROR("setsockopt failed\n"); + if (!bind(eq->wait_fd, s_res->ai_addr, s_res->ai_addrlen)) break; close(eq->wait_fd); @@ -344,7 +346,9 @@ int sock_eq_openwait(struct sock_eq *eq, const char *service) return -FI_EINVAL; } - fcntl(eq->wait_fd, F_SETFL, O_NONBLOCK); + if (fcntl(eq->wait_fd, F_SETFL, O_NONBLOCK)) + SOCK_LOG_ERROR("fcntl failed"); + memcpy(&eq->service, service, NI_MAXSERV); SOCK_LOG_INFO("open udp successfully\n"); @@ -410,6 +414,9 @@ int sock_eq_open(struct fid_fabric *fabric, struct fi_eq_attr *attr, break; case FI_WAIT_SET: + if (!attr) + return -FI_EINVAL; + sock_eq->waitset = attr->wait_set; sock_eq->signal = 1; break; diff --git a/opal/mca/common/libfabric/libfabric/prov/sockets/src/sock_msg.c b/opal/mca/common/libfabric/libfabric/prov/sockets/src/sock_msg.c index 54b856748e..253e52df4f 100644 --- a/opal/mca/common/libfabric/libfabric/prov/sockets/src/sock_msg.c +++ b/opal/mca/common/libfabric/libfabric/prov/sockets/src/sock_msg.c @@ -127,7 +127,7 @@ static ssize_t sock_ep_recv(struct fid_ep *ep, void *buf, size_t len, void *desc msg.iov_count = 1; msg.addr = src_addr; msg.context = context; - + msg.data = 0; return sock_ep_recvmsg(ep, &msg, 0); } @@ -142,6 +142,7 @@ static ssize_t sock_ep_recvv(struct fid_ep *ep, const struct iovec *iov, msg.iov_count = count; msg.addr = src_addr; msg.context = context; + msg.data = 0; return sock_ep_recvmsg(ep, &msg, 0); } @@ -392,7 +393,7 @@ static ssize_t sock_ep_trecv(struct fid_ep *ep, void *buf, size_t len, void *des msg.context = context; msg.tag = tag; msg.ignore = ignore; - + msg.data = 0; return sock_ep_trecvmsg(ep, &msg, 0); } @@ -409,6 +410,7 @@ static ssize_t sock_ep_trecvv(struct fid_ep *ep, const struct iovec *iov, msg.context = context; msg.tag = tag; msg.ignore = ignore; + msg.data = 0; return sock_ep_trecvmsg(ep, &msg, 0); } @@ -448,14 +450,19 @@ static ssize_t sock_ep_tsendmsg(struct fid_ep *ep, if (!conn) return -FI_EAGAIN; + memset(&tx_op, 0, sizeof(struct sock_op)); + tx_op.op = SOCK_OP_TSEND; + total_len = 0; if (SOCK_INJECT_OK(flags)) { for (i=0; i< msg->iov_count; i++) { total_len += msg->msg_iov[i].iov_len; } + tx_op.src_iov_len = total_len; assert(total_len <= SOCK_EP_MAX_INJECT_SZ); } else { total_len = msg->iov_count * sizeof(union sock_iov); + tx_op.src_iov_len = msg->iov_count; } total_len += sizeof(struct sock_op_tsend); @@ -469,10 +476,6 @@ static ssize_t sock_ep_tsendmsg(struct fid_ep *ep, } flags |= tx_ctx->attr.op_flags; - memset(&tx_op, 0, sizeof(struct sock_op)); - tx_op.op = SOCK_OP_TSEND; - tx_op.src_iov_len = msg->iov_count; - sock_tx_ctx_write(tx_ctx, &tx_op, sizeof(struct sock_op)); sock_tx_ctx_write(tx_ctx, &flags, sizeof(uint64_t)); sock_tx_ctx_write(tx_ctx, &msg->context, sizeof(uint64_t)); diff --git a/opal/mca/common/libfabric/libfabric/prov/sockets/src/sock_progress.c b/opal/mca/common/libfabric/libfabric/prov/sockets/src/sock_progress.c index 9b4621a410..5ec963b9c8 100644 --- a/opal/mca/common/libfabric/libfabric/prov/sockets/src/sock_progress.c +++ b/opal/mca/common/libfabric/libfabric/prov/sockets/src/sock_progress.c @@ -1409,7 +1409,6 @@ static int sock_pe_peek_hdr(struct sock_pe *pe, return -1; msg_hdr->msg_len = ntohll(msg_hdr->msg_len); - msg_hdr->rx_id = msg_hdr->rx_id; msg_hdr->flags = ntohll(msg_hdr->flags); msg_hdr->pe_entry_id = ntohs(msg_hdr->pe_entry_id); msg_hdr->ep_id = ntohs(msg_hdr->ep_id); @@ -1462,8 +1461,11 @@ static int sock_pe_read_hdr(struct sock_pe *pe, struct sock_rx_ctx *rx_ctx, } } - sock_pe_recv_field(pe_entry, (void*)msg_hdr, - sizeof(struct sock_msg_hdr), 0); + if (sock_pe_recv_field(pe_entry, (void*)msg_hdr, + sizeof(struct sock_msg_hdr), 0)) { + SOCK_LOG_ERROR("Failed to recv header\n"); + return -1; + } msg_hdr->msg_len = ntohll(msg_hdr->msg_len); msg_hdr->rx_id = msg_hdr->rx_id; @@ -2020,7 +2022,7 @@ static int sock_pe_new_tx_entry(struct sock_pe *pe, struct sock_tx_ctx *tx_ctx) msg_hdr->ep_id = sock_av_lookup_ep_id(tx_ctx->av, pe_entry->addr); } else { msg_hdr->rx_id = 0; - msg_hdr->ep_id = ep->rem_ep_id; + msg_hdr->ep_id = ((ep != NULL) ? ep->rem_ep_id : 0); } msg_hdr->dest_iov_len = pe_entry->pe.tx.tx_op.dest_iov_len; @@ -2074,8 +2076,6 @@ int sock_pe_progress_rx_ep(struct sock_pe *pe, struct sock_ep *ep, for (i=0; iused; i++) { conn = &map->table[i]; - if (!conn) - continue; if (rbused(&conn->outbuf)) sock_comm_flush(conn); diff --git a/opal/mca/common/libfabric/libfabric/prov/sockets/src/sock_rma.c b/opal/mca/common/libfabric/libfabric/prov/sockets/src/sock_rma.c index 37e70dd668..c5d7d88678 100644 --- a/opal/mca/common/libfabric/libfabric/prov/sockets/src/sock_rma.c +++ b/opal/mca/common/libfabric/libfabric/prov/sockets/src/sock_rma.c @@ -189,16 +189,21 @@ static ssize_t sock_ep_rma_readv(struct fid_ep *ep, const struct iovec *iov, void **desc, size_t count, fi_addr_t src_addr, uint64_t addr, uint64_t key, void *context) { + size_t len, i; struct fi_msg_rma msg; struct fi_rma_iov rma_iov; msg.msg_iov = iov; msg.desc = desc; msg.iov_count = count; + msg.rma_iov_count = 1; rma_iov.addr = addr; rma_iov.key = key; - rma_iov.len = 1; + + for (i = 0, len = 0; i < count; i++) + len += iov[i].iov_len; + rma_iov.len = len; msg.rma_iov = &rma_iov; msg.addr = src_addr; @@ -371,7 +376,7 @@ static ssize_t sock_ep_rma_writev(struct fid_ep *ep, for (i = 0, len = 0; i < count; i++) len += iov[i].iov_len; - + rma_iov.addr = addr; rma_iov.key = key; rma_iov.len = len; diff --git a/opal/mca/common/libfabric/libfabric/prov/sockets/src/sock_wait.c b/opal/mca/common/libfabric/libfabric/prov/sockets/src/sock_wait.c index fa3d2bce44..d46af7c8d0 100644 --- a/opal/mca/common/libfabric/libfabric/prov/sockets/src/sock_wait.c +++ b/opal/mca/common/libfabric/libfabric/prov/sockets/src/sock_wait.c @@ -82,7 +82,7 @@ static int sock_wait_init(struct sock_wait *wait, enum fi_wait_obj type) if (socketpair(AF_UNIX, SOCK_STREAM, 0, wait->wobj.fd)) return -errno; - fcntl(wait->wobj.fd[WAIT_READ_FD], F_GETFL, &flags); + flags = fcntl(wait->wobj.fd[WAIT_READ_FD], F_GETFL, 0); if (fcntl(wait->wobj.fd[WAIT_READ_FD], F_SETFL, flags | O_NONBLOCK)) { close(wait->wobj.fd[WAIT_READ_FD]); close(wait->wobj.fd[WAIT_WRITE_FD]); @@ -273,6 +273,8 @@ int sock_wait_open(struct fid_fabric *fabric, struct fi_wait_attr *attr, fab = container_of(fabric, struct sock_fabric, fab_fid); if (!attr || attr->wait_obj == FI_WAIT_UNSPEC) wait_obj_type = FI_WAIT_FD; + else + wait_obj_type = attr->wait_obj; wait = calloc(1, sizeof(*wait)); if (!wait) diff --git a/opal/mca/common/libfabric/libfabric/prov/usnic/src/usdf_av.c b/opal/mca/common/libfabric/libfabric/prov/usnic/src/usdf_av.c index d4817e072f..9e6e1b57f4 100644 --- a/opal/mca/common/libfabric/libfabric/prov/usnic/src/usdf_av.c +++ b/opal/mca/common/libfabric/libfabric/prov/usnic/src/usdf_av.c @@ -81,14 +81,16 @@ usdf_av_insert_async_complete(struct usdf_av_insert *insert) pthread_spin_lock(&av->av_lock); + usdf_timer_free(av->av_domain->dom_fabric, insert->avi_timer); + atomic_dec(&av->av_active_inserts); if (atomic_get(&av->av_active_inserts) == 0 && av->av_closing) { + pthread_spin_destroy(&av->av_lock); free(av); } else { pthread_spin_unlock(&av->av_lock); } - usdf_timer_free(av->av_domain->dom_fabric, insert->avi_timer); free(insert); } @@ -328,7 +330,7 @@ usdf_am_insert_sync(struct fid_av *fav, const void *addr, size_t count, const struct sockaddr_in *sin; struct usdf_av *av; struct usd_dest *u_dest; - struct usdf_dest *dest = dest; // supress uninit + struct usdf_dest *dest; int ret_count; int ret; int i; @@ -344,6 +346,8 @@ usdf_am_insert_sync(struct fid_av *fav, const void *addr, size_t count, /* XXX parallelize, this will also eliminate u_dest silliness */ for (i = 0; i < count; i++) { + dest = NULL; + u_dest = NULL; ret = usdf_av_alloc_dest(&dest); if (ret == 0) { ret = usd_create_dest(av->av_domain->dom_dev, @@ -352,12 +356,13 @@ usdf_am_insert_sync(struct fid_av *fav, const void *addr, size_t count, } if (ret == 0) { dest->ds_dest = *u_dest; - free(u_dest); fi_addr[i] = (fi_addr_t)dest; ++ret_count; } else { fi_addr[i] = FI_ADDR_NOTAVAIL; + free(dest); } + free(u_dest); ++sin; } @@ -389,7 +394,7 @@ usdf_am_lookup(struct fid_av *av, fi_addr_t fi_addr, void *addr, size_t *addrlen) { struct usdf_dest *dest; - struct sockaddr_in sin; + struct sockaddr_in sin = { 0 }; size_t copylen; dest = (struct usdf_dest *)(uintptr_t)fi_addr; @@ -467,6 +472,7 @@ usdf_av_close(struct fid *fid) av->av_closing = 1; pthread_spin_unlock(&av->av_lock); } else { + pthread_spin_destroy(&av->av_lock); free(av); } return 0; diff --git a/opal/mca/common/libfabric/libfabric/prov/usnic/src/usdf_cm.c b/opal/mca/common/libfabric/libfabric/prov/usnic/src/usdf_cm.c index d73f80e181..7622da1261 100644 --- a/opal/mca/common/libfabric/libfabric/prov/usnic/src/usdf_cm.c +++ b/opal/mca/common/libfabric/libfabric/prov/usnic/src/usdf_cm.c @@ -81,7 +81,7 @@ usdf_cm_msg_connreq_cleanup(struct usdf_connreq *crp) } if (crp->cr_pollitem.pi_rtn != NULL) { - epoll_ctl(fp->fab_epollfd, EPOLL_CTL_DEL, crp->cr_sockfd, NULL); + (void) epoll_ctl(fp->fab_epollfd, EPOLL_CTL_DEL, crp->cr_sockfd, NULL); crp->cr_pollitem.pi_rtn = NULL; } if (crp->cr_sockfd != -1) { diff --git a/opal/mca/common/libfabric/libfabric/prov/usnic/src/usdf_ep_msg.c b/opal/mca/common/libfabric/libfabric/prov/usnic/src/usdf_ep_msg.c index 5fbc48d75f..0a4d41859b 100644 --- a/opal/mca/common/libfabric/libfabric/prov/usnic/src/usdf_ep_msg.c +++ b/opal/mca/common/libfabric/libfabric/prov/usnic/src/usdf_ep_msg.c @@ -715,6 +715,9 @@ usdf_ep_msg_open(struct fid_domain *domain, struct fi_info *info, tx->tx_attr = *info->tx_attr; } else { ret = usdf_msg_fill_tx_attr(&tx->tx_attr); + if (ret != 0) { + goto fail; + } } TAILQ_INIT(&tx->t.msg.tx_free_wqe); TAILQ_INIT(&tx->t.msg.tx_ep_ready); diff --git a/opal/mca/common/libfabric/libfabric/prov/usnic/src/usdf_ep_rdm.c b/opal/mca/common/libfabric/libfabric/prov/usnic/src/usdf_ep_rdm.c index ab0c61a1f4..97c5eb3c4f 100644 --- a/opal/mca/common/libfabric/libfabric/prov/usnic/src/usdf_ep_rdm.c +++ b/opal/mca/common/libfabric/libfabric/prov/usnic/src/usdf_ep_rdm.c @@ -760,6 +760,9 @@ usdf_ep_rdm_open(struct fid_domain *domain, struct fi_info *info, tx->tx_attr = *info->tx_attr; } else { ret = usdf_rdm_fill_tx_attr(&tx->tx_attr); + if (ret != 0) { + goto fail; + } } TAILQ_INIT(&tx->t.rdm.tx_free_wqe); TAILQ_INIT(&tx->t.rdm.tx_rdc_ready); @@ -798,6 +801,9 @@ usdf_ep_rdm_open(struct fid_domain *domain, struct fi_info *info, rx->rx_attr = *info->rx_attr; } else { ret = usdf_rdm_fill_rx_attr(&rx->rx_attr); + if (ret != 0) { + goto fail; + } } TAILQ_INIT(&rx->r.rdm.rx_free_rqe); TAILQ_INIT(&rx->r.rdm.rx_posted_rqe); @@ -823,5 +829,8 @@ fail: free(tx); atomic_dec(&udp->dom_refcnt); } + if (ep != NULL) { + free(ep); + } return ret; } diff --git a/opal/mca/common/libfabric/libfabric/prov/usnic/src/usdf_eq.c b/opal/mca/common/libfabric/libfabric/prov/usnic/src/usdf_eq.c index b0fde4fb4f..8ed0a7dcc3 100644 --- a/opal/mca/common/libfabric/libfabric/prov/usnic/src/usdf_eq.c +++ b/opal/mca/common/libfabric/libfabric/prov/usnic/src/usdf_eq.c @@ -298,6 +298,7 @@ usdf_eq_read_fd(struct fid_eq *feq, uint32_t *event, void *buf, size_t len, ret = read(eq->eq_fd, &val, sizeof(val)); if (ret != sizeof(val)) { ret = -FI_EIO; + goto done; } } @@ -588,10 +589,10 @@ usdf_eq_open(struct fid_fabric *fabric, struct fi_eq_attr *attr, fail: if (eq != NULL) { - free(eq); if (eq->eq_ev_ring != NULL) { free(eq->eq_ev_ring); } + free(eq); } return ret; } diff --git a/opal/mca/common/libfabric/libfabric/prov/usnic/src/usdf_fabric.c b/opal/mca/common/libfabric/libfabric/prov/usnic/src/usdf_fabric.c index 3be257b7f0..bf7c1ba148 100644 --- a/opal/mca/common/libfabric/libfabric/prov/usnic/src/usdf_fabric.c +++ b/opal/mca/common/libfabric/libfabric/prov/usnic/src/usdf_fabric.c @@ -201,16 +201,6 @@ usdf_fill_info_dgram( size_t entries; int ret; - /* check that we are capable of what's requested */ - if ((hints->caps & ~USDF_DGRAM_CAPS) != 0) { - return -FI_ENODATA; - } - - /* app must support these modes */ - if ((hints->mode & USDF_DGRAM_REQ_MODE) != USDF_DGRAM_REQ_MODE) { - return -FI_ENODATA; - } - fi = fi_allocinfo_internal(); if (fi == NULL) { ret = -FI_ENOMEM; @@ -222,6 +212,18 @@ usdf_fill_info_dgram( if (hints != NULL) { fi->mode = hints->mode & USDF_DGRAM_SUPP_MODE; addr_format = hints->addr_format; + + /* check that we are capable of what's requested */ + if ((hints->caps & ~USDF_DGRAM_CAPS) != 0) { + ret = -FI_ENODATA; + goto fail; + } + + /* app must support these modes */ + if ((hints->mode & USDF_DGRAM_REQ_MODE) != USDF_DGRAM_REQ_MODE) { + ret = -FI_ENODATA; + goto fail; + } } else { fi->mode = USDF_DGRAM_SUPP_MODE; addr_format = FI_FORMAT_UNSPEC; @@ -363,16 +365,6 @@ usdf_fill_info_msg( uint32_t addr_format; int ret; - /* check that we are capable of what's requested */ - if ((hints->caps & ~USDF_MSG_CAPS) != 0) { - return -FI_ENODATA; - } - - /* app must support these modes */ - if ((hints->mode & USDF_MSG_REQ_MODE) != USDF_MSG_REQ_MODE) { - return -FI_ENODATA; - } - fi = fi_allocinfo_internal(); if (fi == NULL) { ret = -FI_ENOMEM; @@ -384,6 +376,18 @@ usdf_fill_info_msg( if (hints != NULL) { fi->mode = hints->mode & USDF_MSG_SUPP_MODE; addr_format = hints->addr_format; + + /* check that we are capable of what's requested */ + if ((hints->caps & ~USDF_MSG_CAPS) != 0) { + ret = -FI_ENODATA; + goto fail; + } + + /* app must support these modes */ + if ((hints->mode & USDF_MSG_REQ_MODE) != USDF_MSG_REQ_MODE) { + ret = -FI_ENODATA; + goto fail; + } } else { fi->mode = USDF_MSG_SUPP_MODE; addr_format = FI_FORMAT_UNSPEC; @@ -466,16 +470,6 @@ usdf_fill_info_rdm( uint32_t addr_format; int ret; - /* check that we are capable of what's requested */ - if ((hints->caps & ~USDF_RDM_CAPS) != 0) { - return -FI_ENODATA; - } - - /* app must support these modes */ - if ((hints->mode & USDF_RDM_REQ_MODE) != USDF_RDM_REQ_MODE) { - return -FI_ENODATA; - } - fi = fi_allocinfo_internal(); if (fi == NULL) { ret = -FI_ENOMEM; @@ -487,6 +481,17 @@ usdf_fill_info_rdm( if (hints != NULL) { fi->mode = hints->mode & USDF_RDM_SUPP_MODE; addr_format = hints->addr_format; + /* check that we are capable of what's requested */ + if ((hints->caps & ~USDF_RDM_CAPS) != 0) { + ret = -FI_ENODATA; + goto fail; + } + + /* app must support these modes */ + if ((hints->mode & USDF_RDM_REQ_MODE) != USDF_RDM_REQ_MODE) { + ret = -FI_ENODATA; + goto fail; + } } else { fi->mode = USDF_RDM_SUPP_MODE; addr_format = FI_FORMAT_UNSPEC; diff --git a/opal/mca/common/libfabric/libfabric/prov/usnic/src/usdf_msg.c b/opal/mca/common/libfabric/libfabric/prov/usnic/src/usdf_msg.c index 440fe45337..592154c38a 100644 --- a/opal/mca/common/libfabric/libfabric/prov/usnic/src/usdf_msg.c +++ b/opal/mca/common/libfabric/libfabric/prov/usnic/src/usdf_msg.c @@ -425,12 +425,12 @@ usdf_msg_send_segment(struct usdf_tx *tx, struct usdf_ep *ep) (sizeof(struct rudp_pkt) - sizeof(struct ether_header) - sizeof(struct iphdr)) + sent); -if (0) { +#if 0 if ((random() % 177) == 0 && resid == 0) { hdr->hdr.uh_eth.ether_type = 0; //printf("BORK seq %u\n", ep->e.msg.ep_next_tx_seq); } -} +#endif if (resid == 0) { hdr->msg.opcode = htons(RUDP_OP_LAST); diff --git a/opal/mca/common/libfabric/libfabric/prov/usnic/src/usdf_pep.c b/opal/mca/common/libfabric/libfabric/prov/usnic/src/usdf_pep.c index d54a41520e..24632fedff 100644 --- a/opal/mca/common/libfabric/libfabric/prov/usnic/src/usdf_pep.c +++ b/opal/mca/common/libfabric/libfabric/prov/usnic/src/usdf_pep.c @@ -149,10 +149,14 @@ usdf_pep_conn_info(struct usdf_connreq *crp) /* fill in dest addr */ ip->dest_addrlen = ip->src_addrlen; sin = calloc(1, ip->dest_addrlen); + if (sin == NULL) { + goto fail; + } sin->sin_family = AF_INET; sin->sin_addr.s_addr = reqp->creq_ipaddr; sin->sin_port = reqp->creq_port; + ip->dest_addr = sin; ip->connreq = crp; return ip; fail: @@ -322,7 +326,7 @@ usdf_pep_listen(struct fid_pep *fpep) ret = listen(pep->pep_sock, pep->pep_backlog); if (ret != 0) { - ret = -errno; + return -errno; } pep->pep_pollitem.pi_rtn = usdf_pep_listen_cb; @@ -334,7 +338,7 @@ usdf_pep_listen(struct fid_pep *fpep) return -errno; } - return ret; + return 0; } ssize_t diff --git a/opal/mca/common/libfabric/libfabric/prov/usnic/src/usdf_rdm.c b/opal/mca/common/libfabric/libfabric/prov/usnic/src/usdf_rdm.c index 3fd6cb9de3..0d9d75b5b2 100644 --- a/opal/mca/common/libfabric/libfabric/prov/usnic/src/usdf_rdm.c +++ b/opal/mca/common/libfabric/libfabric/prov/usnic/src/usdf_rdm.c @@ -706,12 +706,12 @@ PRINTF("TX 1seg=%lu, s/i = %u/%u\n", sent, ntohs(hdr->msg.m.rc_data.seqno), ntoh (sizeof(struct rudp_pkt) - sizeof(struct ether_header) - sizeof(struct iphdr)) + sent); -if (0) { +#if 0 if ((random() % 177) == 0 && resid == 0) { hdr->hdr.uh_eth.ether_type = 0; //printf("BORK seq %u, ID %u\n", rdc->dc_next_tx_seq, ntohl(wqe->rd_msg_id_be)); } -} +#endif if (resid == 0) { opcode |= RUDP_OP_LAST; diff --git a/opal/mca/common/libfabric/libfabric/prov/usnic/src/usnic_direct/usd_ib_sysfs.c b/opal/mca/common/libfabric/libfabric/prov/usnic/src/usnic_direct/usd_ib_sysfs.c index 9e4d757827..8ccd63c4f4 100644 --- a/opal/mca/common/libfabric/libfabric/prov/usnic/src/usnic_direct/usd_ib_sysfs.c +++ b/opal/mca/common/libfabric/libfabric/prov/usnic/src/usnic_direct/usd_ib_sysfs.c @@ -121,7 +121,8 @@ usd_ib_get_devlist( rc = -errno; goto out; } - n = read(fd, ibdev_buf, sizeof(ibdev_buf)); + memset(ibdev_buf, 0, sizeof(ibdev_buf)); + n = read(fd, ibdev_buf, sizeof(ibdev_buf) - 1); if (n == -1) { usd_perror("reading ibdev"); rc = -errno; @@ -141,12 +142,12 @@ usd_ib_get_devlist( rc = -errno; goto out; } - strncpy(idp->id_name, dent->d_name, sizeof(idp->id_name)); + strncpy(idp->id_name, dent->d_name, sizeof(idp->id_name) - 1); strncpy(idp->id_usnic_name, ibdev_buf, - sizeof(idp->id_usnic_name)); - snprintf(idp->id_dev_path, sizeof(idp->id_dev_path), + sizeof(idp->id_usnic_name) - 1); + snprintf(idp->id_dev_path, sizeof(idp->id_dev_path) - 1, "/dev/infiniband/%s", idp->id_name); - snprintf(idp->id_class_path, sizeof(idp->id_class_path), + snprintf(idp->id_class_path, sizeof(idp->id_class_path) - 1, "%s/device/infiniband/%s", dev_path, ibdev_buf); if (last_idp == NULL) { @@ -254,11 +255,7 @@ usd_get_iface( return -errno; } - /* allow for trailing newline */ - if (dev->ud_attrs.uda_ifname[n - 1] == '\n') - dev->ud_attrs.uda_ifname[n - 1] = '\0'; - else - dev->ud_attrs.uda_ifname[n] = '\0'; + dev->ud_attrs.uda_ifname[n - 1] = '\0'; return 0; } @@ -355,11 +352,7 @@ usd_get_firmware( usd_perror("reading fw_ver"); return -errno; } - /* allow for trailing newline */ - if (fw[n - 1] == '\n') - fw[n - 1] = '\0'; - else - fw[n] = '\0'; + fw[n - 1] = '\0'; return 0; } diff --git a/opal/mca/common/libfabric/libfabric/prov/usnic/src/usnic_direct/usd_socket.c b/opal/mca/common/libfabric/libfabric/prov/usnic/src/usnic_direct/usd_socket.c index a0d03c7691..c23cb8f4d8 100644 --- a/opal/mca/common/libfabric/libfabric/prov/usnic/src/usnic_direct/usd_socket.c +++ b/opal/mca/common/libfabric/libfabric/prov/usnic/src/usnic_direct/usd_socket.c @@ -110,6 +110,8 @@ usd_get_dev_if_info( if (ret == -1) goto out; dev->ud_arp_sockfd = s; + } else { + close(s); } return 0; diff --git a/opal/mca/common/libfabric/libfabric/prov/usnic/src/usnic_direct/usnic_ip_utils.c b/opal/mca/common/libfabric/libfabric/prov/usnic/src/usnic_direct/usnic_ip_utils.c index 3634a3eb90..bc07b08f92 100644 --- a/opal/mca/common/libfabric/libfabric/prov/usnic/src/usnic_direct/usnic_ip_utils.c +++ b/opal/mca/common/libfabric/libfabric/prov/usnic/src/usnic_direct/usnic_ip_utils.c @@ -65,7 +65,7 @@ int usnic_arp_lookup(char *ifname, uint32_t ipaddr, int sockfd, uint8_t *macaddr int status; memset(&req, 0, sizeof req); - strcpy(req.arp_dev, ifname); + strncpy(req.arp_dev, ifname, sizeof(req.arp_dev) - 1); memset(&sinp, 0, sizeof(sinp)); sinp.sin_family = AF_INET; sinp.sin_addr.s_addr = ipaddr; diff --git a/opal/mca/common/libfabric/libfabric/prov/verbs/src/fi_verbs.c b/opal/mca/common/libfabric/libfabric/prov/verbs/src/fi_verbs.c index 35204c5677..3dadf03d49 100644 --- a/opal/mca/common/libfabric/libfabric/prov/verbs/src/fi_verbs.c +++ b/opal/mca/common/libfabric/libfabric/prov/verbs/src/fi_verbs.c @@ -65,6 +65,8 @@ #define VERBS_PROV_VERS FI_VERSION(1,0) #define VERBS_WARN(...) FI_WARN(VERBS_PROV_NAME, __VA_ARGS__) +#define VERBS_INFO(...) FI_LOG(2, VERBS_PROV_NAME, __VA_ARGS__) +#define VERBS_DEBUG(...) FI_DEBUG(VERBS_PROV_NAME, __VA_ARGS__) #define VERBS_MSG_SIZE (1ULL << 31) #define VERBS_IB_PREFIX "IB-0x" @@ -222,7 +224,7 @@ static int fi_ibv_check_domain_attr(struct fi_domain_attr *attr) case FI_THREAD_COMPLETION: break; default: - VERBS_WARN("Invalid threading model\n"); + VERBS_INFO("Invalid threading model\n"); return -FI_ENODATA; } @@ -232,7 +234,7 @@ static int fi_ibv_check_domain_attr(struct fi_domain_attr *attr) case FI_PROGRESS_MANUAL: break; default: - VERBS_WARN("Given control progress mode not supported\n"); + VERBS_INFO("Given control progress mode not supported\n"); return -FI_ENODATA; } @@ -242,7 +244,7 @@ static int fi_ibv_check_domain_attr(struct fi_domain_attr *attr) case FI_PROGRESS_MANUAL: break; default: - VERBS_WARN("Given data progress mode not supported!\n"); + VERBS_INFO("Given data progress mode not supported!\n"); return -FI_ENODATA; } @@ -274,37 +276,37 @@ static int fi_ibv_check_ep_attr(struct fi_ep_attr *attr) return -FI_ENODATA; if (attr->total_buffered_recv) { - VERBS_WARN("Buffered Recv not supported\n"); + VERBS_INFO("Buffered Recv not supported\n"); return -FI_ENODATA; } if (attr->max_order_raw_size > verbs_ep_attr.max_order_raw_size) { - VERBS_WARN("max_order_raw_size exceeds supported size\n"); + VERBS_INFO("max_order_raw_size exceeds supported size\n"); return -FI_ENODATA; } if (attr->max_order_war_size) { - VERBS_WARN("max_order_war_size exceeds supported size\n"); + VERBS_INFO("max_order_war_size exceeds supported size\n"); return -FI_ENODATA; } if (attr->max_order_waw_size > verbs_ep_attr.max_order_waw_size) { - VERBS_WARN("max_order_waw_size exceeds supported size\n"); + VERBS_INFO("max_order_waw_size exceeds supported size\n"); return -FI_ENODATA; } if (attr->msg_order & ~(verbs_ep_attr.msg_order)) { - VERBS_WARN("Given msg ordering not supported\n"); + VERBS_INFO("Given msg ordering not supported\n"); return -FI_ENODATA; } if (attr->tx_ctx_cnt > verbs_ep_attr.tx_ctx_cnt) { - VERBS_WARN("tx_ctx_cnt exceeds supported size\n"); + VERBS_INFO("tx_ctx_cnt exceeds supported size\n"); return -FI_ENODATA; } if (attr->rx_ctx_cnt > verbs_ep_attr.rx_ctx_cnt) { - VERBS_WARN("rx_ctx_cnt exceeds supported size\n"); + VERBS_INFO("rx_ctx_cnt exceeds supported size\n"); return -FI_ENODATA; } @@ -314,22 +316,22 @@ static int fi_ibv_check_ep_attr(struct fi_ep_attr *attr) static int fi_ibv_check_rx_attr(struct fi_rx_attr *attr) { if (attr->caps & ~(verbs_rx_attr.caps)) { - VERBS_WARN("Given rx_attr->caps not supported\n"); + VERBS_INFO("Given rx_attr->caps not supported\n"); return -FI_ENODATA; } if ((attr->mode & verbs_rx_attr.mode) != verbs_rx_attr.mode) { - VERBS_WARN("Given rx_attr->mode not supported\n"); + VERBS_INFO("Given rx_attr->mode not supported\n"); return -FI_ENODATA; } if (attr->msg_order & ~(verbs_rx_attr.msg_order)) { - VERBS_WARN("Given rx_attr->msg_order not supported\n"); + VERBS_INFO("Given rx_attr->msg_order not supported\n"); return -FI_ENODATA; } if (attr->total_buffered_recv > verbs_rx_attr.total_buffered_recv) { - VERBS_WARN("Given rx_attr->total_buffered_recv exceeds supported size\n"); + VERBS_INFO("Given rx_attr->total_buffered_recv exceeds supported size\n"); return -FI_ENODATA; } @@ -339,22 +341,22 @@ static int fi_ibv_check_rx_attr(struct fi_rx_attr *attr) static int fi_ibv_check_tx_attr(struct fi_tx_attr *attr) { if (attr->caps & ~(verbs_tx_attr.caps)) { - VERBS_WARN("Given tx_attr->caps not supported\n"); + VERBS_INFO("Given tx_attr->caps not supported\n"); return -FI_ENODATA; } if ((attr->mode & verbs_tx_attr.mode) != verbs_tx_attr.mode) { - VERBS_WARN("Given tx_attr->mode not supported\n"); + VERBS_INFO("Given tx_attr->mode not supported\n"); return -FI_ENODATA; } if (attr->msg_order & ~(verbs_tx_attr.msg_order)) { - VERBS_WARN("Given tx_attr->msg_order not supported\n"); + VERBS_INFO("Given tx_attr->msg_order not supported\n"); return -FI_ENODATA; } if (attr->inject_size > verbs_tx_attr.inject_size) { - VERBS_WARN("Given tx_attr->inject_size exceeds supported size\n"); + VERBS_INFO("Given tx_attr->inject_size exceeds supported size\n"); return -FI_ENODATA; } @@ -416,22 +418,22 @@ static int fi_ibv_check_dev_limits(struct fi_domain_attr *domain_attr, struct ibv_device_attr *device_attr) { if (domain_attr->cq_cnt > device_attr->max_cq) { - VERBS_WARN("cq_cnt exceeds supported size\n"); + VERBS_INFO("cq_cnt exceeds supported size\n"); return -FI_ENODATA; } if (domain_attr->ep_cnt > device_attr->max_qp) { - VERBS_WARN("ep_cnt exceeds supported size\n"); + VERBS_INFO("ep_cnt exceeds supported size\n"); return -FI_ENODATA; } if (domain_attr->tx_ctx_cnt > device_attr->max_qp) { - VERBS_WARN("domain_attr: tx_ctx_cnt exceeds supported size\n"); + VERBS_INFO("domain_attr: tx_ctx_cnt exceeds supported size\n"); return -FI_ENODATA; } if (domain_attr->rx_ctx_cnt > device_attr->max_qp) { - VERBS_WARN("domain_attr: rx_ctx_cnt exceeds supported size\n"); + VERBS_INFO("domain_attr: rx_ctx_cnt exceeds supported size\n"); return -FI_ENODATA; } @@ -543,7 +545,7 @@ static int fi_ibv_fill_info_attr(struct ibv_context *ctx, struct fi_info *hints, fi->fabric_attr->name = strdup(VERBS_IWARP_FABRIC); break; default: - VERBS_WARN("Unknown transport type"); + VERBS_INFO("Unknown transport type"); return -FI_ENODATA; } @@ -2103,7 +2105,11 @@ fi_ibv_eq_open(struct fid_fabric *fabric, struct fi_eq_attr *attr, ret = -errno; goto err1; } - fcntl(_eq->channel->fd, F_GETFL, &flags); + flags = fcntl(_eq->channel->fd, F_GETFL); + if (flags < 0) { + ret = -errno; + goto err2; + } ret = fcntl(_eq->channel->fd, F_SETFL, flags | O_NONBLOCK); if (ret) { ret = -errno; @@ -2113,7 +2119,8 @@ fi_ibv_eq_open(struct fid_fabric *fabric, struct fi_eq_attr *attr, case FI_WAIT_NONE: break; default: - return -ENOSYS; + ret = -FI_ENOSYS; + goto err1; } _eq->flags = attr->flags; @@ -2418,17 +2425,22 @@ fi_ibv_cq_open(struct fid_domain *domain, struct fi_cq_attr *attr, goto err1; } - fcntl(_cq->channel->fd, F_GETFL, &flags); + flags = fcntl(_cq->channel->fd, F_GETFL); + if (flags < 0) { + ret = -errno; + goto err2; + } ret = fcntl(_cq->channel->fd, F_SETFL, flags | O_NONBLOCK); if (ret) { ret = -errno; - goto err1; + goto err2; } break; case FI_WAIT_NONE: break; default: - return -FI_ENOSYS; + ret = -FI_ENOSYS; + goto err1; } _cq->cq = ibv_create_cq(_cq->domain->verbs, attr->size, _cq, diff --git a/opal/mca/common/libfabric/libfabric/src/fabric.c b/opal/mca/common/libfabric/libfabric/src/fabric.c index 25224323b8..e6ea50d342 100644 --- a/opal/mca/common/libfabric/libfabric/src/fabric.c +++ b/opal/mca/common/libfabric/libfabric/src/fabric.c @@ -140,7 +140,6 @@ static int fi_register_provider(struct fi_provider *provider, void *dlhandle) cleanup: cleanup_provider(provider, dlhandle); - return ret; } @@ -171,47 +170,53 @@ static void fi_ini(void) fi_log_init(); #ifdef HAVE_LIBDL - struct dirent **liblist; - int n; + struct dirent **liblist = NULL; + int n = 0; char *lib, *provdir; void *dlhandle; struct fi_provider* (*inif)(void); /* If dlopen fails, assume static linking and just return without error */ - if (dlopen(NULL, RTLD_NOW) == NULL) { - goto done; + dlhandle = dlopen(NULL, RTLD_NOW); + if (dlhandle == NULL) { + goto libdl_done; } + dlclose(dlhandle); provdir = PROVDLDIR; n = scandir(provdir, &liblist, lib_filter, NULL); if (n < 0) - goto done; + goto libdl_done; while (n--) { if (asprintf(&lib, "%s/%s", provdir, liblist[n]->d_name) < 0) { FI_WARN(NULL, "asprintf failed to allocate memory\n"); - free(liblist[n]); - goto done; + goto libdl_done; } FI_DEBUG(NULL, "opening provider lib %s\n", lib); dlhandle = dlopen(lib, RTLD_NOW); - if (dlhandle == NULL) - FI_WARN(NULL, "dlopen(%s): %s\n", lib, dlerror()); - free(liblist[n]); + if (dlhandle == NULL) { + FI_WARN(NULL, "dlopen(%s): %s\n", lib, dlerror()); + free(lib); + continue; + } free(lib); inif = dlsym(dlhandle, "fi_prov_ini"); - if (inif == NULL) + if (inif == NULL) { FI_WARN(NULL, "dlsym: %s\n", dlerror()); - else + dlclose(dlhandle); + } else fi_register_provider((inif)(), dlhandle); } +libdl_done: + while (n-- > 0) + free(liblist[n]); free(liblist); -done: #endif fi_register_provider(PSM_INIT, NULL); @@ -227,8 +232,14 @@ unlock: static void __attribute__((destructor)) fi_fini(void) { - for (struct fi_prov *prov = prov_head; prov; prov = prov->next) + struct fi_prov *prov; + + while (prov_head) { + prov = prov_head; + prov_head = prov->next; cleanup_provider(prov->provider, prov->dlhandle); + free(prov); + } } static struct fi_prov *fi_getprov(const char *prov_name) diff --git a/opal/mca/common/libfabric/libfabric/src/fi_tostr.c b/opal/mca/common/libfabric/libfabric/src/fi_tostr.c index 8c963da91a..8ecaf46692 100644 --- a/opal/mca/common/libfabric/libfabric/src/fi_tostr.c +++ b/opal/mca/common/libfabric/libfabric/src/fi_tostr.c @@ -496,13 +496,17 @@ __attribute__((visibility ("default"))) char *DEFAULT_SYMVER_PRE(fi_tostr)(const void *data, enum fi_type datatype) { static char *buf = NULL; - uint64_t val64 = *(const uint64_t *) data; - uint32_t val32 = *(const uint32_t *) data; - int enumval = *(const int *) data; + uint64_t val64; + uint32_t val32; + int enumval; if (!data) return NULL; + val64 = *(const uint64_t *) data; + val32 = *(const uint32_t *) data; + enumval = *(const int *) data; + if (!buf) { buf = calloc(BUFSIZ, 1); if (!buf)