[ofa-general] [PATCH] [DAPL] scm: add support for WinOF
Davis, Arlin R
arlin.r.davis at intel.com
Tue Feb 17 09:06:18 PST 2009
Thanks, applied.
Since this was in the CM code I had to do some regression testing before accepting.
>-----Original Message-----
>From: general-bounces at lists.openfabrics.org
>[mailto:general-bounces at lists.openfabrics.org] On Behalf Of Hefty, Sean
>Sent: Friday, February 13, 2009 2:55 PM
>To: Davis, Arlin R; general at lists.openfabrics.org;
>ofw at lists.openfabrics.org
>Subject: [ofa-general] [PATCH] [DAPL] scm: add support for WinOF
>
>Modify the openib_scm provider to support both OFED and WinOF releases.
>This takes advantage of having a libibverbs compatibility library.*
>
>Signed-off-by: Sean Hefty <sean.hefty at intel.com>
>---
>* If only there were a sockets compatility layer... gurgle
>This is only build tested for windows, but does run on Linux.
>
>diff --git a/Makefile.am b/Makefile.am
>index bfc93f7..5044e36 100755
>--- a/Makefile.am
>+++ b/Makefile.am
>@@ -49,7 +49,8 @@ dapl_udapl_libdaploscm_la_CFLAGS =
>$(AM_CFLAGS) -D_GNU_SOURCE $(OSFLAGS) $(XFLAG
> -DOPENIB -DCQ_WAIT_OBJECT \
> -I$(srcdir)/dat/include/
>-I$(srcdir)/dapl/include/ \
> -I$(srcdir)/dapl/common
>-I$(srcdir)/dapl/udapl/linux \
>- -I$(srcdir)/dapl/openib_scm
>+ -I$(srcdir)/dapl/openib_scm \
>+ -I$(srcdir)/dapl/openib_scm/linux
>
> if HAVE_LD_VERSION_SCRIPT
> dat_version_script =
>-Wl,--version-script=$(srcdir)/dat/udat/libdat2.map
>diff --git a/dapl/openib_scm/README b/dapl/openib_scm/README
>deleted file mode 100644
>index 239dfe6..0000000
>--- a/dapl/openib_scm/README
>+++ /dev/null
>@@ -1,40 +0,0 @@
>-
>-OpenIB uDAPL provider using socket-based CM, in leiu of
>uCM/uAT, to setup QP/channels.
>-
>-to build:
>-
>-cd dapl/udapl
>-make VERBS=openib_scm clean
>-make VERBS=openib_scm
>-
>-
>-Modifications to common code:
>-
>-- added dapl/openib_scm directory
>-
>- dapl/udapl/Makefile
>-
>-New files for openib_scm provider
>-
>- dapl/openib/dapl_ib_cq.c
>- dapl/openib/dapl_ib_dto.h
>- dapl/openib/dapl_ib_mem.c
>- dapl/openib/dapl_ib_qp.c
>- dapl/openib/dapl_ib_util.c
>- dapl/openib/dapl_ib_util.h
>- dapl/openib/dapl_ib_cm.c
>-
>-A simple dapl test just for openib_scm testing...
>-
>- test/dtest/dtest.c
>- test/dtest/makefile
>-
>- server: dtest -s
>- client: dtest -h hostname
>-
>-known issues:
>-
>- no memory windows support in ibverbs, dat_create_rmr fails.
>-
>-
>-
>diff --git a/dapl/openib_scm/dapl_ib_cm.c
>b/dapl/openib_scm/dapl_ib_cm.c
>index 80a7d5e..9a15e42 100644
>--- a/dapl/openib_scm/dapl_ib_cm.c
>+++ b/dapl/openib_scm/dapl_ib_cm.c
>@@ -52,26 +52,169 @@
> #include "dapl_cr_util.h"
> #include "dapl_name_service.h"
> #include "dapl_ib_util.h"
>-
>-#include <stdio.h>
>-#include <unistd.h>
>-#include <fcntl.h>
>-#include <netinet/tcp.h>
>-#include <byteswap.h>
>-#include <poll.h>
>-
>-#include <sys/socket.h>
>-#include <netinet/in.h>
>-#include <arpa/inet.h>
>-
>-#if __BYTE_ORDER == __LITTLE_ENDIAN
>-static inline uint64_t cpu_to_be64(uint64_t x) {return bswap_64(x);}
>-#elif __BYTE_ORDER == __BIG_ENDIAN
>-static inline uint64_t cpu_to_be64(uint64_t x) {return x;}
>-#endif
>+#include "dapl_osd.h"
>
> extern int g_scm_pipe[2];
>
>+#if defined(_WIN32) || defined(_WIN64)
>+enum DAPL_FD_EVENTS {
>+ DAPL_FD_READ = 0x1,
>+ DAPL_FD_WRITE = 0x2,
>+ DAPL_FD_ERROR = 0x4
>+};
>+
>+static int dapl_config_socket(DAPL_SOCKET s)
>+{
>+ unsigned long nonblocking = 1;
>+ return ioctlsocket(s, FIONBIO, &nonblocking);
>+}
>+
>+static int dapl_connect_socket(DAPL_SOCKET s, struct sockaddr *addr,
>+ int addrlen)
>+{
>+ int err;
>+
>+ connect(s, addr, addrlen);
>+ err = WSAGetLastError();
>+ return (err == WSAEWOULDBLOCK) ? EAGAIN : err;
>+}
>+
>+struct dapl_fd_set {
>+ struct fd_set set[3];
>+};
>+
>+static struct dapl_fd_set *dapl_alloc_fd_set(void)
>+{
>+ return dapl_os_alloc(sizeof(struct dapl_fd_set));
>+}
>+
>+static void dapl_fd_zero(struct dapl_fd_set *set)
>+{
>+ FD_ZERO(&set->set[0]);
>+ FD_ZERO(&set->set[1]);
>+ FD_ZERO(&set->set[2]);
>+}
>+
>+static int dapl_fd_set(DAPL_SOCKET s, struct dapl_fd_set *set,
>+ enum DAPL_FD_EVENTS event)
>+{
>+ FD_SET(s, &set->set[(event == DAPL_FD_READ) ? 0 : 1]);
>+ FD_SET(s, &set->set[2]);
>+ return 0;
>+}
>+
>+static enum DAPL_FD_EVENTS dapl_poll(DAPL_SOCKET s, enum
>DAPL_FD_EVENTS event)
>+{
>+ struct fd_set rw_fds;
>+ struct fd_set err_fds;
>+ struct timeval tv;
>+ int ret;
>+
>+ FD_ZERO(&rw_fds);
>+ FD_ZERO(&err_fds);
>+ FD_SET(s, &rw_fds);
>+ FD_SET(s, &err_fds);
>+
>+ tv.tv_sec = 0;
>+ tv.tv_usec = 0;
>+
>+ if (event == DAPL_FD_READ)
>+ ret = select(1, &rw_fds, NULL, &err_fds, &tv);
>+ else
>+ ret = select(1, NULL, &rw_fds, &err_fds, &tv);
>+
>+ if (ret == 0)
>+ return 0;
>+ else if (FD_ISSET(s, &rw_fds))
>+ return event;
>+ else if (FD_ISSET(s, &err_fds))
>+ return DAPL_FD_ERROR;
>+ else
>+ return WSAGetLastError();
>+}
>+
>+static int dapl_select(struct dapl_fd_set *set)
>+{
>+ return select(0, &set->set[0], &set->set[1],
>&set->set[2], NULL);
>+}
>+#else // _WIN32 || _WIN64
>+enum DAPL_FD_EVENTS {
>+ DAPL_FD_READ = POLLIN,
>+ DAPL_FD_WRITE = POLLOUT,
>+ DAPL_FD_ERROR = POLLERR
>+};
>+
>+static int dapl_config_socket(DAPL_SOCKET s)
>+{
>+ int ret;
>+
>+ ret = fcntl(s, F_GETFL);
>+ if (ret >= 0)
>+ ret = fcntl(s, F_SETFL, ret | O_NONBLOCK);
>+ return ret;
>+}
>+
>+static int dapl_connect_socket(DAPL_SOCKET s, struct sockaddr
>*addr, int addrlen)
>+{
>+ int ret;
>+
>+ ret = connect(s, addr, addrlen);
>+
>+ return (errno == EINPROGRESS) ? EAGAIN : ret;
>+}
>+
>+struct dapl_fd_set {
>+ int index;
>+ struct pollfd set[DAPL_FD_SETSIZE];
>+};
>+
>+static struct dapl_fd_set *dapl_alloc_fd_set(void)
>+{
>+ return dapl_os_alloc(sizeof(struct dapl_fd_set));
>+}
>+
>+static void dapl_fd_zero(struct dapl_fd_set *set)
>+{
>+ set->index = 0;
>+}
>+
>+static int dapl_fd_set(DAPL_SOCKET s, struct dapl_fd_set *set,
>+ enum DAPL_FD_EVENTS event)
>+{
>+ if (set->index == DAPL_FD_SETSIZE - 1) {
>+ dapl_log(DAPL_DBG_TYPE_ERR,
>+ "SCM ERR: cm_thread exceeded FD_SETSIZE %d\n",
>+ set->index + 1);
>+ return -1;
>+ }
>+
>+ set->set[set->index].fd = s;
>+ set->set[set->index].revents = 0;
>+ set->set[set->index++].events = event;
>+ return 0;
>+}
>+
>+static enum DAPL_FD_EVENTS dapl_poll(DAPL_SOCKET s, enum
>DAPL_FD_EVENTS event)
>+{
>+ struct pollfd fds;
>+ int ret;
>+
>+ fds.fd = s;
>+ fds.events = event;
>+ fds.revents = 0;
>+ ret = poll(&fds, 1, 0);
>+ if (ret <= 0)
>+ return ret;
>+
>+ return fds.revents;
>+}
>+
>+static int dapl_select(struct dapl_fd_set *set)
>+{
>+ return poll(set->set, set->index, -1);
>+}
>+#endif
>+
> static struct ib_cm_handle *dapli_cm_create(void)
> {
> struct ib_cm_handle *cm_ptr;
>@@ -85,7 +228,7 @@ static struct ib_cm_handle *dapli_cm_create(void)
>
> (void)dapl_os_memzero(cm_ptr, sizeof(*cm_ptr));
> cm_ptr->dst.ver = htons(DSCM_VER);
>- cm_ptr->socket = -1;
>+ cm_ptr->socket = DAPL_INVALID_SOCKET;
> return cm_ptr;
> bail:
> dapl_os_free(cm_ptr, sizeof(*cm_ptr));
>@@ -100,8 +243,8 @@ static void dapli_cm_destroy(struct
>ib_cm_handle *cm_ptr)
>
> /* cleanup, never made it to work queue */
> if (cm_ptr->state == SCM_INIT) {
>- if (cm_ptr->socket >= 0)
>- close(cm_ptr->socket);
>+ if (cm_ptr->socket != DAPL_INVALID_SOCKET)
>+ closesocket(cm_ptr->socket);
> dapl_os_free(cm_ptr, sizeof(*cm_ptr));
> return;
> }
>@@ -112,9 +255,9 @@ static void dapli_cm_destroy(struct
>ib_cm_handle *cm_ptr)
> cm_ptr->ep->cm_handle = IB_INVALID_HANDLE;
>
> /* close socket if still active */
>- if (cm_ptr->socket >= 0) {
>- close(cm_ptr->socket);
>- cm_ptr->socket = -1;
>+ if (cm_ptr->socket != DAPL_INVALID_SOCKET) {
>+ closesocket(cm_ptr->socket);
>+ cm_ptr->socket = DAPL_INVALID_SOCKET;
> }
> dapl_os_unlock(&cm_ptr->lock);
>
>@@ -172,14 +315,14 @@
>dapli_socket_disconnect(dp_ib_cm_handle_t cm_ptr)
> return DAT_SUCCESS;
> } else {
> /* send disc date, close socket, schedule destroy */
>- if (cm_ptr->socket >= 0) {
>- if (write(cm_ptr->socket,
>- &disc_data, sizeof(disc_data)) == -1)
>+ if (cm_ptr->socket != DAPL_INVALID_SOCKET) {
>+ if (send(cm_ptr->socket, (char *) &disc_data,
>+ sizeof(disc_data), 0) == -1)
> dapl_log(DAPL_DBG_TYPE_WARN,
> " cm_disc: write error
>= %s\n",
> strerror(errno));
>- close(cm_ptr->socket);
>- cm_ptr->socket = -1;
>+ closesocket(cm_ptr->socket);
>+ cm_ptr->socket = DAPL_INVALID_SOCKET;
> }
> cm_ptr->state = SCM_DISCONNECTED;
> }
>@@ -211,7 +354,7 @@ void
> dapli_socket_connected(dp_ib_cm_handle_t cm_ptr, int err)
> {
> int len, opt = 1;
>- struct iovec iovec[2];
>+ struct iovec iov[2];
> struct dapl_ep *ep_ptr = cm_ptr->ep;
>
> if (err) {
>@@ -226,18 +369,21 @@ dapli_socket_connected(dp_ib_cm_handle_t
>cm_ptr, int err)
> " socket connected, write QP and private data\n");
>
> /* no delay for small packets */
>-
>setsockopt(cm_ptr->socket,IPPROTO_TCP,TCP_NODELAY,&opt,sizeof(opt));
>+ setsockopt(cm_ptr->socket, IPPROTO_TCP, TCP_NODELAY,
>+ (char *) &opt, sizeof(opt));
>
> /* send qp info and pdata to remote peer */
>- iovec[0].iov_base = &cm_ptr->dst;
>- iovec[0].iov_len = sizeof(ib_qp_cm_t);
>+ iov[0].iov_base = (void *) &cm_ptr->dst;
>+ iov[0].iov_len = sizeof(ib_qp_cm_t);
> if (cm_ptr->dst.p_size) {
>- iovec[1].iov_base = cm_ptr->p_data;
>- iovec[1].iov_len = ntohl(cm_ptr->dst.p_size);
>+ iov[1].iov_base = cm_ptr->p_data;
>+ iov[1].iov_len = ntohl(cm_ptr->dst.p_size);
>+ len = writev(cm_ptr->socket, iov, 2);
>+ } else {
>+ len = writev(cm_ptr->socket, iov, 1);
> }
>
>- len = writev(cm_ptr->socket, iovec, (cm_ptr->dst.p_size ? 2:1));
>- if (len != (ntohl(cm_ptr->dst.p_size) + sizeof(ib_qp_cm_t))) {
>+ if (len != (ntohl(cm_ptr->dst.p_size) + sizeof(ib_qp_cm_t))) {
> dapl_log(DAPL_DBG_TYPE_ERR,
> " CONN_PENDING write: ERR %s, wcnt=%d -> %s\n",
> strerror(errno), len,
>@@ -253,9 +399,9 @@ dapli_socket_connected(dp_ib_cm_handle_t
>cm_ptr, int err)
> dapl_dbg_log(DAPL_DBG_TYPE_CM,
> " connected: sending SRC GID subnet
>%016llx id %016llx\n",
> (unsigned long long)
>-
>cpu_to_be64(cm_ptr->dst.gid.global.subnet_prefix),
>+ htonll(cm_ptr->dst.gid.global.subnet_prefix),
> (unsigned long long)
>-
>cpu_to_be64(cm_ptr->dst.gid.global.interface_id));
>+ htonll(cm_ptr->dst.gid.global.interface_id));
>
> /* queue up to work thread to avoid blocking consumer */
> cm_ptr->state = SCM_RTU_PENDING;
>@@ -290,25 +436,23 @@ dapli_socket_connect(DAPL_EP *ep_ptr,
> return DAT_INSUFFICIENT_RESOURCES;
>
> /* create, connect, sockopt, and exchange QP information */
>- if ((cm_ptr->socket = socket(AF_INET,SOCK_STREAM,0)) < 0 ) {
>+ if ((cm_ptr->socket = socket(AF_INET,SOCK_STREAM,0)) ==
>DAPL_INVALID_SOCKET) {
> dapl_os_free( cm_ptr, sizeof( *cm_ptr ) );
> return DAT_INSUFFICIENT_RESOURCES;
> }
>
>- /* non-blocking */
>- ret = fcntl(cm_ptr->socket, F_GETFL);
>- if (ret < 0 || fcntl(cm_ptr->socket,
>- F_SETFL, ret | O_NONBLOCK) < 0) {
>- dapl_log(DAPL_DBG_TYPE_ERR,
>- " socket connect: fcntl on socket %d
>ERR %d %s\n",
>- cm_ptr->socket, ret,
>- strerror(errno));
>- goto bail;
>- }
>+ ret = dapl_config_socket(cm_ptr->socket);
>+ if (ret < 0) {
>+ dapl_log(DAPL_DBG_TYPE_ERR,
>+ " socket connect: config socket %d ERR %d %s\n",
>+ cm_ptr->socket, ret, strerror(errno));
>+ goto bail;
>+ }
>
> ((struct sockaddr_in*)r_addr)->sin_port = htons(r_qual);
>- ret = connect(cm_ptr->socket, r_addr, sizeof(*r_addr));
>- if (ret && errno != EINPROGRESS) {
>+ ret = dapl_connect_socket(cm_ptr->socket, (struct
>sockaddr *) r_addr,
>+ sizeof(*r_addr));
>+ if (ret && ret != EAGAIN) {
> dapl_log(DAPL_DBG_TYPE_ERR,
> " socket connect ERROR: %s -> %s r_qual %d\n",
> strerror(errno),
>@@ -391,16 +535,13 @@
>dapli_socket_connect_rtu(dp_ib_cm_handle_t cm_ptr)
> {
> DAPL_EP *ep_ptr = cm_ptr->ep;
> int len;
>- struct iovec iovec[2];
> short rtu_data = htons(0x0E0F);
> ib_cm_events_t event = IB_CME_DESTINATION_REJECT;
>
> /* read DST information into cm_ptr, overwrite SRC info */
> dapl_dbg_log(DAPL_DBG_TYPE_EP," connect_rtu: recv peer
>QP data\n");
>
>- iovec[0].iov_base = &cm_ptr->dst;
>- iovec[0].iov_len = sizeof(ib_qp_cm_t);
>- len = readv(cm_ptr->socket, iovec, 1);
>+ len = recv(cm_ptr->socket, (char *) &cm_ptr->dst,
>sizeof(ib_qp_cm_t), 0);
> if (len != sizeof(ib_qp_cm_t) || ntohs(cm_ptr->dst.ver)
>!= DSCM_VER) {
> dapl_log(DAPL_DBG_TYPE_ERR,
> " CONN_RTU read: ERR %s, rcnt=%d, ver=%d -> %s\n",
>@@ -456,9 +597,7 @@ dapli_socket_connect_rtu(dp_ib_cm_handle_t cm_ptr)
> /* read private data into cm_handle if any present */
> dapl_dbg_log(DAPL_DBG_TYPE_EP," socket connected, read
>private data\n");
> if (cm_ptr->dst.p_size) {
>- iovec[0].iov_base = cm_ptr->p_data;
>- iovec[0].iov_len = cm_ptr->dst.p_size;
>- len = readv(cm_ptr->socket, iovec, 1);
>+ len = recv(cm_ptr->socket, cm_ptr->p_data,
>cm_ptr->dst.p_size, 0);
> if (len != cm_ptr->dst.p_size) {
> dapl_log(DAPL_DBG_TYPE_ERR,
> " CONN_RTU read pdata: ERR %s,
>rcnt=%d -> %s\n",
>@@ -495,7 +634,7 @@ dapli_socket_connect_rtu(dp_ib_cm_handle_t cm_ptr)
> dapl_dbg_log(DAPL_DBG_TYPE_EP," connect_rtu: send RTU\n");
>
> /* complete handshake after final QP state change */
>- if (write(cm_ptr->socket, &rtu_data, sizeof(rtu_data)) == -1) {
>+ if (send(cm_ptr->socket, (char *) &rtu_data,
>sizeof(rtu_data), 0) == -1) {
> dapl_log(DAPL_DBG_TYPE_ERR,
> " CONN_RTU: write error = %s\n",
>strerror(errno));
> goto bail;
>@@ -564,7 +703,7 @@ dapli_socket_listen(DAPL_IA *ia_ptr,
> cm_ptr->hca = ia_ptr->hca_ptr;
>
> /* bind, listen, set sockopt, accept, exchange data */
>- if ((cm_ptr->socket = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
>+ if ((cm_ptr->socket = socket(AF_INET, SOCK_STREAM, 0))
>== DAPL_INVALID_SOCKET) {
> dapl_log(DAPL_DBG_TYPE_ERR,
> " ERR: listen socket create: %s\n",
> strerror(errno));
>@@ -572,7 +711,8 @@ dapli_socket_listen(DAPL_IA *ia_ptr,
> goto bail;
> }
>
>-
>setsockopt(cm_ptr->socket,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt));
>+ setsockopt(cm_ptr->socket, SOL_SOCKET, SO_REUSEADDR,
>+ (char *) &opt, sizeof(opt));
> addr.sin_port = htons(serviceID);
> addr.sin_family = AF_INET;
> addr.sin_addr.s_addr = INADDR_ANY;
>@@ -625,7 +765,7 @@ dapli_socket_accept(ib_cm_srvc_handle_t cm_ptr)
>
> (void) dapl_os_memzero(acm_ptr, sizeof(*acm_ptr));
>
>- acm_ptr->socket = -1;
>+ acm_ptr->socket = DAPL_INVALID_SOCKET;
> acm_ptr->sp = cm_ptr->sp;
> acm_ptr->hca = cm_ptr->hca;
>
>@@ -633,7 +773,7 @@ dapli_socket_accept(ib_cm_srvc_handle_t cm_ptr)
> acm_ptr->socket = accept(cm_ptr->socket,
> (struct
>sockaddr*)&acm_ptr->dst.ia_address,
> (socklen_t*)&len);
>- if (acm_ptr->socket < 0) {
>+ if (acm_ptr->socket == DAPL_INVALID_SOCKET) {
> dapl_log(DAPL_DBG_TYPE_ERR,
> " accept: ERR %s on FD %d l_cr %p\n",
> strerror(errno),cm_ptr->socket,cm_ptr);
>@@ -664,7 +804,7 @@
>dapli_socket_accept_data(ib_cm_srvc_handle_t acm_ptr)
> dapl_dbg_log(DAPL_DBG_TYPE_EP," socket accepted, read
>QP data\n");
>
> /* read in DST QP info, IA address. check for private data */
>- len = read(acm_ptr->socket, &acm_ptr->dst, sizeof(ib_qp_cm_t));
>+ len = recv(acm_ptr->socket, (char *) &acm_ptr->dst,
>sizeof(ib_qp_cm_t), 0);
> if (len != sizeof(ib_qp_cm_t) ||
> ntohs(acm_ptr->dst.ver) != DSCM_VER) {
> dapl_log(DAPL_DBG_TYPE_ERR,
>@@ -700,8 +840,7 @@
>dapli_socket_accept_data(ib_cm_srvc_handle_t acm_ptr)
>
> /* read private data into cm_handle if any present */
> if (acm_ptr->dst.p_size) {
>- len = read( acm_ptr->socket,
>- acm_ptr->p_data, acm_ptr->dst.p_size);
>+ len = recv(acm_ptr->socket, acm_ptr->p_data,
>acm_ptr->dst.p_size, 0);
> if (len != acm_ptr->dst.p_size) {
> dapl_log(DAPL_DBG_TYPE_ERR,
> " accept read pdata: ERR
>%s, rcnt=%d\n",
>@@ -757,14 +896,14 @@ dapli_socket_accept_usr(DAPL_EP *ep_ptr,
> DAPL_IA *ia_ptr = ep_ptr->header.owner_ia;
> dp_ib_cm_handle_t cm_ptr = cr_ptr->ib_cm_handle;
> ib_qp_cm_t local;
>- struct iovec iovec[2];
>+ struct iovec iov[2];
> int len;
>
> if (p_size > IB_MAX_REP_PDATA_SIZE)
> return DAT_LENGTH_ERROR;
>
> /* must have a accepted socket */
>- if (cm_ptr->socket < 0)
>+ if (cm_ptr->socket == DAPL_INVALID_SOCKET)
> return DAT_INTERNAL_ERROR;
>
> dapl_dbg_log(DAPL_DBG_TYPE_EP,
>@@ -844,14 +983,17 @@ dapli_socket_accept_usr(DAPL_EP *ep_ptr,
>
> local.ia_address = ia_ptr->hca_ptr->hca_address;
> local.p_size = htonl(p_size);
>- iovec[0].iov_base = &local;
>- iovec[0].iov_len = sizeof(ib_qp_cm_t);
>+ iov[0].iov_base = (void *) &local;
>+ iov[0].iov_len = sizeof(ib_qp_cm_t);
> if (p_size) {
>- iovec[1].iov_base = p_data;
>- iovec[1].iov_len = p_size;
>+ iov[1].iov_base = p_data;
>+ iov[1].iov_len = p_size;
>+ len = writev(cm_ptr->socket, iov, 2);
>+ } else {
>+ len = writev(cm_ptr->socket, iov, 1);
> }
>- len = writev(cm_ptr->socket, iovec, (p_size ? 2:1));
>- if (len != (p_size + sizeof(ib_qp_cm_t))) {
>+
>+ if (len != (p_size + sizeof(ib_qp_cm_t))) {
> dapl_log(DAPL_DBG_TYPE_ERR,
> " ACCEPT_USR: ERR %s, wcnt=%d -> %s\n",
> strerror(errno), len,
>@@ -859,6 +1001,7 @@ dapli_socket_accept_usr(DAPL_EP *ep_ptr,
> &cm_ptr->dst.ia_address)->sin_addr));
> goto bail;
> }
>+
> dapl_dbg_log(DAPL_DBG_TYPE_CM,
> " ACCEPT_USR: local port=0x%x lid=0x%x"
> " qpn=0x%x psize=%d\n",
>@@ -867,9 +1010,9 @@ dapli_socket_accept_usr(DAPL_EP *ep_ptr,
> dapl_dbg_log(DAPL_DBG_TYPE_CM,
> " ACCEPT_USR SRC GID subnet %016llx id
>%016llx\n",
> (unsigned long long)
>- cpu_to_be64(local.gid.global.subnet_prefix),
>+ htonll(local.gid.global.subnet_prefix),
> (unsigned long long)
>- cpu_to_be64(local.gid.global.interface_id));
>+ htonll(local.gid.global.interface_id));
>
> /* save state and reference to EP, queue for RTU data */
> cm_ptr->ep = ep_ptr;
>@@ -894,7 +1037,7 @@ dapli_socket_accept_rtu(dp_ib_cm_handle_t cm_ptr)
> short rtu_data = 0;
>
> /* complete handshake after final QP state change */
>- len = read(cm_ptr->socket, &rtu_data, sizeof(rtu_data));
>+ len = recv(cm_ptr->socket, (char *) &rtu_data,
>sizeof(rtu_data), 0);
> if (len != sizeof(rtu_data) || ntohs(rtu_data) != 0x0e0f) {
> dapl_log(DAPL_DBG_TYPE_ERR,
> " ACCEPT_RTU: ERR %s, rcnt=%d rdata=%x\n",
>@@ -1108,9 +1251,9 @@ dapls_ib_remove_conn_listener (
>
> /* close accepted socket, free cm_srvc_handle and return */
> if (cm_ptr != NULL) {
>- if (cm_ptr->socket >= 0) {
>- close(cm_ptr->socket );
>- cm_ptr->socket = -1;
>+ if (cm_ptr->socket != DAPL_INVALID_SOCKET) {
>+ closesocket(cm_ptr->socket);
>+ cm_ptr->socket = DAPL_INVALID_SOCKET;
> }
> /* cr_thread will free */
> cm_ptr->state = SCM_DESTROY;
>@@ -1195,27 +1338,29 @@ dapls_ib_reject_connection(
> IN DAT_COUNT psize,
> IN const DAT_PVOID pdata)
> {
>- struct iovec iovec[2];
>+ struct iovec iov[2];
>
> dapl_dbg_log (DAPL_DBG_TYPE_EP,
> " reject(cm %p reason %x, pdata %p, psize %d)\n",
> cm_ptr, reason, pdata, psize);
>
> /* write reject data to indicate reject */
>- if (cm_ptr->socket >= 0) {
>+ if (cm_ptr->socket != DAPL_INVALID_SOCKET) {
> cm_ptr->dst.rej = (uint16_t)reason;
> cm_ptr->dst.rej = htons(cm_ptr->dst.rej);
>- iovec[0].iov_base = &cm_ptr->dst;
>- iovec[0].iov_len = sizeof(ib_qp_cm_t);
>+
>+ iov[0].iov_base = (void *) &cm_ptr->dst;
>+ iov[0].iov_len = sizeof(ib_qp_cm_t);
> if (psize) {
>- iovec[1].iov_base = pdata;
>- iovec[2].iov_len = psize;
>- writev(cm_ptr->socket, &iovec[0], 2);
>- } else
>- writev(cm_ptr->socket, &iovec[0], 1);
>-
>- close(cm_ptr->socket);
>- cm_ptr->socket = -1;
>+ iov[1].iov_base = pdata;
>+ iov[1].iov_len = psize;
>+ writev(cm_ptr->socket, iov, 2);
>+ } else {
>+ writev(cm_ptr->socket, iov, 1);
>+ }
>+
>+ closesocket(cm_ptr->socket);
>+ cm_ptr->socket = DAPL_INVALID_SOCKET;
> }
>
> /* cr_thread will destroy CR */
>@@ -1444,138 +1589,141 @@ dapls_ib_get_cm_event (
> }
>
> /* outbound/inbound CR processing thread to avoid blocking
>applications */
>-#define SCM_MAX_CONN 8192
> void cr_thread(void *arg)
> {
>- struct dapl_hca *hca_ptr = arg;
>- dp_ib_cm_handle_t cr, next_cr;
>- int opt,ret,idx;
>- socklen_t opt_len;
>- char rbuf[2];
>- struct pollfd ufds[SCM_MAX_CONN];
>-
>- dapl_dbg_log(DAPL_DBG_TYPE_UTIL," cr_thread: ENTER hca
>%p\n",hca_ptr);
>-
>- dapl_os_lock( &hca_ptr->ib_trans.lock );
>- hca_ptr->ib_trans.cr_state = IB_THREAD_RUN;
>- while (hca_ptr->ib_trans.cr_state == IB_THREAD_RUN) {
>- idx=0;
>- ufds[idx].fd = g_scm_pipe[0]; /* wakeup and process work */
>- ufds[idx].events = POLLIN;
>- ufds[idx].revents = 0;
>-
>- if (!dapl_llist_is_empty(&hca_ptr->ib_trans.list))
>- next_cr = dapl_llist_peek_head (&hca_ptr->ib_trans.list);
>- else
>- next_cr = NULL;
>-
>- while (next_cr) {
>- cr = next_cr;
>- if ((cr->socket == -1 && cr->state == SCM_DESTROY) ||
>- hca_ptr->ib_trans.cr_state != IB_THREAD_RUN) {
>-
>- dapl_dbg_log(DAPL_DBG_TYPE_CM," cr_thread: Free
>%p\n", cr);
>- next_cr = dapl_llist_next_entry(&hca_ptr->ib_trans.list,
>-
>(DAPL_LLIST_ENTRY*)&cr->entry );
>- dapl_llist_remove_entry(&hca_ptr->ib_trans.list,
>- (DAPL_LLIST_ENTRY*)&cr->entry);
>- dapl_os_free(cr, sizeof(*cr));
>- continue;
>- }
>-
>- if (idx==SCM_MAX_CONN-1) {
>- dapl_dbg_log(DAPL_DBG_TYPE_ERR,
>- "SCM ERR: cm_thread exceeded
>FD_SETSIZE %d\n",idx+1);
>- continue;
>- }
>-
>- /* Add to ufds for poll, check for immediate work */
>- ufds[++idx].fd = cr->socket; /* add listen or cr */
>- ufds[idx].revents = 0;
>- if (cr->state == SCM_CONN_PENDING)
>- ufds[idx].events = POLLOUT;
>- else
>- ufds[idx].events = POLLIN;
>-
>- /* check socket for event, accept in or connect out */
>- dapl_dbg_log(DAPL_DBG_TYPE_CM," poll cr=%p, fd=%d,%d\n",
>- cr, cr->socket, ufds[idx].fd);
>- dapl_os_unlock(&hca_ptr->ib_trans.lock);
>- ret = poll(&ufds[idx],1,0);
>- dapl_dbg_log(DAPL_DBG_TYPE_CM,
>- " poll wakeup ret=%d cr->st=%d"
>- " ev=0x%x fd=%d\n",
>- ret,cr->state,ufds[idx].revents,ufds[idx].fd);
>-
>- /* data on listen, qp exchange, and on disconnect request */
>- if ((ret == 1) && ufds[idx].revents == POLLIN) {
>- if (cr->socket > 0) {
>- if (cr->state == SCM_LISTEN)
>- dapli_socket_accept(cr);
>- else if (cr->state == SCM_ACCEPTING)
>- dapli_socket_accept_data(cr);
>- else if (cr->state == SCM_ACCEPTED)
>- dapli_socket_accept_rtu(cr);
>- else if (cr->state == SCM_RTU_PENDING)
>- dapli_socket_connect_rtu(cr);
>- else if (cr->state == SCM_CONNECTED)
>- dapli_socket_disconnect(cr);
>+ struct dapl_hca *hca_ptr = arg;
>+ dp_ib_cm_handle_t cr, next_cr;
>+ int opt, ret;
>+ socklen_t opt_len;
>+ char rbuf[2];
>+ struct dapl_fd_set *set;
>+ enum DAPL_FD_EVENTS event;
>+
>+ dapl_dbg_log(DAPL_DBG_TYPE_UTIL," cr_thread: ENTER hca
>%p\n", hca_ptr);
>+ set = dapl_alloc_fd_set();
>+ if (!set)
>+ goto out;
>+
>+ dapl_os_lock(&hca_ptr->ib_trans.lock);
>+ hca_ptr->ib_trans.cr_state = IB_THREAD_RUN;
>+
>+ while (hca_ptr->ib_trans.cr_state == IB_THREAD_RUN) {
>+ dapl_fd_zero(set);
>+ dapl_fd_set(g_scm_pipe[0], set, DAPL_FD_READ);
>+
>+ if (!dapl_llist_is_empty(&hca_ptr->ib_trans.list))
>+ next_cr =
>dapl_llist_peek_head(&hca_ptr->ib_trans.list);
>+ else
>+ next_cr = NULL;
>+
>+ while (next_cr) {
>+ cr = next_cr;
>+ if ((cr->socket == DAPL_INVALID_SOCKET
>&& cr->state == SCM_DESTROY) ||
>+ hca_ptr->ib_trans.cr_state !=
>IB_THREAD_RUN) {
>+ next_cr =
>dapl_llist_next_entry(&hca_ptr->ib_trans.list,
>+
>(DAPL_LLIST_ENTRY*)&cr->entry);
>+
>dapl_llist_remove_entry(&hca_ptr->ib_trans.list,
>+
>(DAPL_LLIST_ENTRY*)&cr->entry);
>+ dapl_os_free(cr, sizeof(*cr));
>+ continue;
>+ }
>+
>+ event = (cr->state == SCM_CONN_PENDING) ?
>+ DAPL_FD_WRITE : DAPL_FD_READ;
>+ if (dapl_fd_set(cr->socket, set, event)) {
>+ dapl_log(DAPL_DBG_TYPE_ERR,
>+ " cr_thread: DESTROY
>CR st=%d fd %d"
>+ " -> %s\n", cr->state,
>cr->socket,
>+ inet_ntoa(((struct
>sockaddr_in*)
>+
>&cr->dst.ia_address)->sin_addr));
>+ dapli_cm_destroy(cr);
>+ continue;
>+ }
>+
>+ dapl_dbg_log(DAPL_DBG_TYPE_CM, " poll
>cr=%p, fd=%d\n",
>+ cr, cr->socket);
>+ dapl_os_unlock(&hca_ptr->ib_trans.lock);
>+
>+ ret = dapl_poll(cr->socket, event);
>+
>+ dapl_dbg_log(DAPL_DBG_TYPE_CM,
>+ " poll wakeup ret=%d cr->st=%d fd=%d\n",
>+ ret, cr->state, cr->socket);
>+
>+ /* data on listen, qp exchange, and on
>disconnect request */
>+ if (ret == DAPL_FD_READ) {
>+ if (cr->socket != DAPL_INVALID_SOCKET) {
>+ switch (cr->state) {
>+ case SCM_LISTEN:
>+ dapli_socket_accept(cr);
>+ break;
>+ case SCM_ACCEPTING:
>+
>dapli_socket_accept_data(cr);
>+ break;
>+ case SCM_ACCEPTED:
>+
>dapli_socket_accept_rtu(cr);
>+ break;
>+ case SCM_RTU_PENDING:
>+
>dapli_socket_connect_rtu(cr);
>+ break;
>+ case SCM_CONNECTED:
>+
>dapli_socket_disconnect(cr);
>+ break;
>+ default:
>+ break;
>+ }
>+ }
>+ /* connect socket is writable, check status */
>+ } else if (ret == DAPL_FD_WRITE || ret
>== DAPL_FD_ERROR) {
>+ if (cr->state == SCM_CONN_PENDING) {
>+ opt = 0;
>+ ret =
>getsockopt(cr->socket, SOL_SOCKET,
>+ SO_ERROR, (char
>*) &opt, &opt_len);
>+ if (!ret)
>+
>dapli_socket_connected(cr, opt);
>+ else
>+
>dapli_socket_connected(cr, errno);
>+ } else {
>+ dapl_log(DAPL_DBG_TYPE_CM,
>+ " CM poll ERR,
>wrong state(%d) -> %s SKIP\n", cr->state,
>+
>inet_ntoa(((struct sockaddr_in*)&cr->dst.ia_address)->sin_addr));
>+ }
>+ } else if (ret != 0) {
>+ dapl_log(DAPL_DBG_TYPE_CM,
>+ " CM poll warning %s,
>ret=%d st=%d -> %s\n",
>+ strerror(errno), ret, cr->state,
>+ inet_ntoa(((struct sockaddr_in*)
>+
>&cr->dst.ia_address)->sin_addr));
>+
>+ /* POLLUP, NVAL, or poll error,
>issue event if connected */
>+ if (cr->state == SCM_CONNECTED)
>+ dapli_socket_disconnect(cr);
>+ }
>+
>+ dapl_os_lock(&hca_ptr->ib_trans.lock);
>+ next_cr =
>dapl_llist_next_entry(&hca_ptr->ib_trans.list,
>+ (DAPL_LLIST_ENTRY*)&cr->entry);
> }
>- /* connect socket is writable, check status */
>- } else if ((ret == 1) &&
>- (ufds[idx].revents & POLLOUT ||
>- ufds[idx].revents & POLLERR)) {
>- if (cr->state == SCM_CONN_PENDING) {
>- opt = 0;
>- ret = getsockopt(cr->socket, SOL_SOCKET,
>- SO_ERROR, &opt, &opt_len);
>- if (!ret)
>- dapli_socket_connected(cr,opt);
>- else
>- dapli_socket_connected(cr,errno);
>- } else {
>- dapl_log(DAPL_DBG_TYPE_CM,
>- " CM poll ERR, wrong state(%d)
>-> %s SKIP\n",
>- cr->state,
>- inet_ntoa(((struct sockaddr_in*)
>-
>&cr->dst.ia_address)->sin_addr));
>+
>+ dapl_os_unlock(&hca_ptr->ib_trans.lock);
>+ dapl_dbg_log(DAPL_DBG_TYPE_CM," cr_thread:
>sleep, fds=%d\n",
>+ set->index+1);
>+ dapl_select(set);
>+ dapl_dbg_log(DAPL_DBG_TYPE_CM," cr_thread: wakeup\n");
>+
>+ /* if pipe used to wakeup, consume */
>+ if (dapl_poll(g_scm_pipe[0], DAPL_FD_READ) ==
>DAPL_FD_READ) {
>+ if (read(g_scm_pipe[0], rbuf, 2) == -1)
>+ dapl_log(DAPL_DBG_TYPE_CM,
>+ " cr_thread: read pipe
>error = %s\n",
>+ strerror(errno));
> }
>- } else if (ret != 0) {
>- dapl_log(DAPL_DBG_TYPE_CM,
>- " CM poll warning %s, ret=%d revnt=%x
>st=%d -> %s\n",
>- strerror(errno), ret,
>ufds[idx].revents, cr->state,
>- inet_ntoa(((struct sockaddr_in*)
>- &cr->dst.ia_address)->sin_addr));
>-
>- /* POLLUP, NVAL, or poll error, issue event if
>connected */
>- if (cr->state == SCM_CONNECTED)
>- dapli_socket_disconnect(cr);
>- }
>- dapl_os_lock(&hca_ptr->ib_trans.lock);
>- next_cr = dapl_llist_next_entry(&hca_ptr->ib_trans.list,
>-
>(DAPL_LLIST_ENTRY*)&cr->entry);
>+ dapl_os_lock(&hca_ptr->ib_trans.lock);
> }
>+
> dapl_os_unlock(&hca_ptr->ib_trans.lock);
>- dapl_dbg_log(DAPL_DBG_TYPE_CM," cr_thread: sleep, %d\n", idx+1);
>- poll(ufds,idx+1,-1); /* infinite, all sockets and pipe */
>- /* if pipe used to wakeup, consume */
>- if (ufds[0].revents == POLLIN)
>- if (read(g_scm_pipe[0], rbuf, 2) == -1)
>- dapl_log(DAPL_DBG_TYPE_CM,
>- " cr_thread: read pipe error = %s\n",
>- strerror(errno));
>- dapl_dbg_log(DAPL_DBG_TYPE_CM," cr_thread: wakeup\n");
>- dapl_os_lock(&hca_ptr->ib_trans.lock);
>- }
>- dapl_os_unlock(&hca_ptr->ib_trans.lock);
>- hca_ptr->ib_trans.cr_state = IB_THREAD_EXIT;
>- dapl_dbg_log(DAPL_DBG_TYPE_UTIL," cr_thread(hca %p)
>exit\n",hca_ptr);
>+ free(set);
>+out:
>+ hca_ptr->ib_trans.cr_state = IB_THREAD_EXIT;
>+ dapl_dbg_log(DAPL_DBG_TYPE_UTIL," cr_thread(hca %p)
>exit\n",hca_ptr);
> }
>-
>-/*
>- * Local variables:
>- * c-indent-level: 4
>- * c-basic-offset: 4
>- * tab-width: 8
>- * End:
>- */
>diff --git a/dapl/openib_scm/dapl_ib_cq.c
>b/dapl/openib_scm/dapl_ib_cq.c
>index 7d6bd4f..59fff11 100644
>--- a/dapl/openib_scm/dapl_ib_cq.c
>+++ b/dapl/openib_scm/dapl_ib_cq.c
>@@ -46,97 +46,111 @@
> *
>
>***************************************************************
>***********/
>
>+#include "openib_osd.h"
> #include "dapl.h"
> #include "dapl_adapter_util.h"
> #include "dapl_lmr_util.h"
> #include "dapl_evd_util.h"
> #include "dapl_ring_buffer_util.h"
>-#include <sys/poll.h>
>-#include <signal.h>
>
>-int dapli_cq_thread_init(struct dapl_hca *hca_ptr)
>+#if defined(_WIN64) || defined(_WIN32)
>+void dapli_cq_thread_destroy(struct dapl_hca *hca_ptr)
> {
>- DAT_RETURN dat_status;
>+ dapl_dbg_log(DAPL_DBG_TYPE_UTIL,"
>cq_thread_destroy(%p)\n", hca_ptr);
>
>- dapl_dbg_log(DAPL_DBG_TYPE_UTIL,"
>cq_thread_init(%p)\n", hca_ptr);
>+ if (hca_ptr->ib_trans.cq_state != IB_THREAD_RUN)
>+ return;
>
>- /* create thread to process inbound connect request */
>- hca_ptr->ib_trans.cq_state = IB_THREAD_INIT;
>- dat_status = dapl_os_thread_create(cq_thread,
>(void*)hca_ptr, &hca_ptr->ib_trans.cq_thread);
>- if (dat_status != DAT_SUCCESS)
>- {
>- dapl_dbg_log(DAPL_DBG_TYPE_ERR,
>- " cq_thread_init: failed to
>create thread\n");
>- return 1;
>- }
>+ /* destroy cr_thread and lock */
>+ hca_ptr->ib_trans.cq_state = IB_THREAD_CANCEL;
>+ SetEvent(hca_ptr->ib_trans.ib_cq->event);
>+ dapl_dbg_log(DAPL_DBG_TYPE_CM," cq_thread_destroy(%p)
>cancel\n",hca_ptr);
>+ while (hca_ptr->ib_trans.cq_state != IB_THREAD_EXIT) {
>+ dapl_os_sleep_usec(20000);
>+ }
>+ dapl_dbg_log(DAPL_DBG_TYPE_UTIL," cq_thread_destroy(%d)
>exit\n",dapl_os_getpid());
>+}
>+
>+static void cq_thread(void *arg)
>+{
>+ struct dapl_hca *hca_ptr = arg;
>+ struct dapl_evd *evd_ptr;
>+ struct ibv_cq *ibv_cq = NULL;
>+
>+ hca_ptr->ib_trans.cq_state = IB_THREAD_RUN;
>+
>+ dapl_dbg_log(DAPL_DBG_TYPE_UTIL," cq_thread: ENTER hca
>%p\n",hca_ptr);
>
>- /* wait for thread to start */
>- while (hca_ptr->ib_trans.cq_state != IB_THREAD_RUN) {
>- struct timespec sleep, remain;
>- sleep.tv_sec = 0;
>- sleep.tv_nsec = 20000000; /* 20 ms */
>- dapl_dbg_log(DAPL_DBG_TYPE_UTIL,
>- " cq_thread_init: waiting for
>cq_thread\n");
>- nanosleep (&sleep, &remain);
>- }
>- dapl_dbg_log(DAPL_DBG_TYPE_UTIL," cq_thread_init(%d)
>exit\n",getpid());
>- return 0;
>+ /* wait on DTO event, or signal to abort */
>+ while (hca_ptr->ib_trans.cq_state == IB_THREAD_RUN) {
>+ if (!ibv_get_cq_event(hca_ptr->ib_trans.ib_cq,
>&ibv_cq, (void*)&evd_ptr)) {
>+
>+ if (DAPL_BAD_HANDLE(evd_ptr, DAPL_MAGIC_EVD)) {
>+ ibv_ack_cq_events(ibv_cq, 1);
>+ return;
>+ }
>+
>+ /* process DTO event via callback */
>+
>dapl_evd_dto_callback(hca_ptr->ib_hca_handle, evd_ptr->ib_cq_handle,
>+ (void*)evd_ptr );
>+
>+ ibv_ack_cq_events(ibv_cq, 1);
>+ }
>+ }
>+ hca_ptr->ib_trans.cq_state = IB_THREAD_EXIT;
>+ dapl_dbg_log(DAPL_DBG_TYPE_UTIL," cq_thread: EXIT: hca
>%p \n", hca_ptr);
> }
>
>+#else // _WIN32 || _WIN64
>+
> void dapli_cq_thread_destroy(struct dapl_hca *hca_ptr)
> {
>- dapl_dbg_log(DAPL_DBG_TYPE_UTIL,"
>cq_thread_destroy(%p)\n", hca_ptr);
>+ dapl_dbg_log(DAPL_DBG_TYPE_UTIL,"
>cq_thread_destroy(%p)\n", hca_ptr);
>
> if (hca_ptr->ib_trans.cq_state != IB_THREAD_RUN)
> return;
>
>- /* destroy cr_thread and lock */
>- hca_ptr->ib_trans.cq_state = IB_THREAD_CANCEL;
>- pthread_kill(hca_ptr->ib_trans.cq_thread, SIGUSR1);
>- dapl_dbg_log(DAPL_DBG_TYPE_CM," cq_thread_destroy(%p)
>cancel\n",hca_ptr);
>- while (hca_ptr->ib_trans.cq_state != IB_THREAD_EXIT) {
>- struct timespec sleep, remain;
>- sleep.tv_sec = 0;
>- sleep.tv_nsec = 2000000; /* 2 ms */
>- dapl_dbg_log(DAPL_DBG_TYPE_UTIL,
>- " cq_thread_destroy: waiting for
>cq_thread\n");
>- nanosleep (&sleep, &remain);
>- }
>- dapl_dbg_log(DAPL_DBG_TYPE_UTIL,"
>cq_thread_destroy(%d) exit\n",getpid());
>+ /* destroy cr_thread and lock */
>+ hca_ptr->ib_trans.cq_state = IB_THREAD_CANCEL;
>+ pthread_kill(hca_ptr->ib_trans.cq_thread, SIGUSR1);
>+ dapl_dbg_log(DAPL_DBG_TYPE_CM," cq_thread_destroy(%p)
>cancel\n",hca_ptr);
>+ while (hca_ptr->ib_trans.cq_state != IB_THREAD_EXIT) {
>+ dapl_os_sleep_usec(20000);
>+ }
>+ dapl_dbg_log(DAPL_DBG_TYPE_UTIL," cq_thread_destroy(%d)
>exit\n",dapl_os_getpid());
> }
>
> /* catch the signal */
> static void ib_cq_handler(int signum)
> {
>- return;
>+ return;
> }
>
>-void cq_thread( void *arg )
>+static void cq_thread(void *arg)
> {
>- struct dapl_hca *hca_ptr = arg;
>- struct dapl_evd *evd_ptr;
>- struct ibv_cq *ibv_cq = NULL;
>+ struct dapl_hca *hca_ptr = arg;
>+ struct dapl_evd *evd_ptr;
>+ struct ibv_cq *ibv_cq = NULL;
> sigset_t sigset;
>
> sigemptyset(&sigset);
>- sigaddset(&sigset,SIGUSR1);
>- pthread_sigmask(SIG_UNBLOCK, &sigset, NULL);
>- signal(SIGUSR1, ib_cq_handler);
>+ sigaddset(&sigset,SIGUSR1);
>+ pthread_sigmask(SIG_UNBLOCK, &sigset, NULL);
>+ signal(SIGUSR1, ib_cq_handler);
>
> hca_ptr->ib_trans.cq_state = IB_THREAD_RUN;
>-
>+
> dapl_dbg_log(DAPL_DBG_TYPE_UTIL," cq_thread: ENTER hca
>%p\n",hca_ptr);
>
>- /* wait on DTO event, or signal to abort */
>- while (hca_ptr->ib_trans.cq_state == IB_THREAD_RUN) {
>- struct pollfd cq_fd = {
>- .fd = hca_ptr->ib_trans.ib_cq->fd,
>- .events = POLLIN,
>- .revents = 0
>- };
>+ /* wait on DTO event, or signal to abort */
>+ while (hca_ptr->ib_trans.cq_state == IB_THREAD_RUN) {
>+ struct pollfd cq_fd = {
>+ .fd = hca_ptr->ib_trans.ib_cq->fd,
>+ .events = POLLIN,
>+ .revents = 0
>+ };
> if ((poll(&cq_fd, 1, -1) == 1) &&
>- (!ibv_get_cq_event(hca_ptr->ib_trans.ib_cq,
>- &ibv_cq, (void*)&evd_ptr))) {
>+
>(!ibv_get_cq_event(hca_ptr->ib_trans.ib_cq, &ibv_cq,
>(void*)&evd_ptr))) {
>
> if (DAPL_BAD_HANDLE(evd_ptr, DAPL_MAGIC_EVD)) {
> ibv_ack_cq_events(ibv_cq, 1);
>@@ -144,15 +158,40 @@ void cq_thread( void *arg )
> }
>
> /* process DTO event via callback */
>- dapl_evd_dto_callback ( hca_ptr->ib_hca_handle,
>- evd_ptr->ib_cq_handle,
>- (void*)evd_ptr );
>+ dapl_evd_dto_callback(hca_ptr->ib_hca_handle,
>+ evd_ptr->ib_cq_handle, (void*)evd_ptr );
>
> ibv_ack_cq_events(ibv_cq, 1);
> }
>- }
>- hca_ptr->ib_trans.cq_state = IB_THREAD_EXIT;
>- dapl_dbg_log(DAPL_DBG_TYPE_UTIL," cq_thread: EXIT:
>hca %p \n", hca_ptr);
>+ }
>+ hca_ptr->ib_trans.cq_state = IB_THREAD_EXIT;
>+ dapl_dbg_log(DAPL_DBG_TYPE_UTIL," cq_thread: EXIT: hca
>%p \n", hca_ptr);
>+}
>+
>+#endif // _WIN32 || _WIN64
>+
>+
>+int dapli_cq_thread_init(struct dapl_hca *hca_ptr)
>+{
>+ DAT_RETURN dat_status;
>+
>+ dapl_dbg_log(DAPL_DBG_TYPE_UTIL,"
>cq_thread_init(%p)\n", hca_ptr);
>+
>+ /* create thread to process inbound connect request */
>+ hca_ptr->ib_trans.cq_state = IB_THREAD_INIT;
>+ dat_status = dapl_os_thread_create(cq_thread,
>(void*)hca_ptr, &hca_ptr->ib_trans.cq_thread);
>+ if (dat_status != DAT_SUCCESS) {
>+ dapl_dbg_log(DAPL_DBG_TYPE_ERR,
>+ " cq_thread_init: failed to create thread\n");
>+ return 1;
>+ }
>+
>+ /* wait for thread to start */
>+ while (hca_ptr->ib_trans.cq_state != IB_THREAD_RUN) {
>+ dapl_os_sleep_usec(20000);
>+ }
>+ dapl_dbg_log(DAPL_DBG_TYPE_UTIL," cq_thread_init(%d)
>exit\n",dapl_os_getpid());
>+ return 0;
> }
>
>
>@@ -308,11 +347,11 @@ dapls_ib_cq_alloc (
> IN DAPL_EVD *evd_ptr,
> IN DAT_COUNT *cqlen )
> {
>+ struct ibv_comp_channel *channel =
>ia_ptr->hca_ptr->ib_trans.ib_cq;
>+
> dapl_dbg_log ( DAPL_DBG_TYPE_UTIL,
> "dapls_ib_cq_alloc: evd %p cqlen=%d \n",
>evd_ptr, *cqlen );
>
>- struct ibv_comp_channel *channel =
>ia_ptr->hca_ptr->ib_trans.ib_cq;
>-
> #ifdef CQ_WAIT_OBJECT
> if (evd_ptr->cq_wait_obj_handle)
> channel = evd_ptr->cq_wait_obj_handle;
>diff --git a/dapl/openib_scm/dapl_ib_dto.h
>b/dapl/openib_scm/dapl_ib_dto.h
>index 45000b9..fa19d01 100644
>--- a/dapl/openib_scm/dapl_ib_dto.h
>+++ b/dapl/openib_scm/dapl_ib_dto.h
>@@ -147,12 +147,6 @@ dapls_ib_post_send (
> IN const DAT_RMR_TRIPLET *remote_iov,
> IN DAT_COMPLETION_FLAGS completion_flags)
> {
>- dapl_dbg_log(DAPL_DBG_TYPE_EP,
>- " post_snd: ep %p op %d ck %p sgs",
>- "%d l_iov %p r_iov %p f %d\n",
>- ep_ptr, op_type, cookie, segments, local_iov,
>- remote_iov, completion_flags);
>-
> ib_data_segment_t ds_array[DEFAULT_DS_ENTRIES];
> ib_data_segment_t *ds_array_p, *ds_array_start_p = NULL;
> struct ibv_send_wr wr;
>@@ -163,6 +157,12 @@ dapls_ib_post_send (
> int ret;
>
> dapl_dbg_log(DAPL_DBG_TYPE_EP,
>+ " post_snd: ep %p op %d ck %p sgs",
>+ "%d l_iov %p r_iov %p f %d\n",
>+ ep_ptr, op_type, cookie, segments, local_iov,
>+ remote_iov, completion_flags);
>+
>+ dapl_dbg_log(DAPL_DBG_TYPE_EP,
> " post_snd: ep %p cookie %p segs %d l_iov %p\n",
> ep_ptr, cookie, segments, local_iov);
>
>@@ -317,12 +317,6 @@ dapls_ib_post_ext_send (
> IN DAT_COMPLETION_FLAGS completion_flags,
> IN DAT_IB_ADDR_HANDLE *remote_ah)
> {
>- dapl_dbg_log(DAPL_DBG_TYPE_EP,
>- " post_ext_snd: ep %p op %d ck %p sgs",
>- "%d l_iov %p r_iov %p f %d\n",
>- ep_ptr, op_type, cookie, segments, local_iov,
>- remote_iov, completion_flags, remote_ah);
>-
> ib_data_segment_t ds_array[DEFAULT_DS_ENTRIES];
> ib_data_segment_t *ds_array_p, *ds_array_start_p = NULL;
> struct ibv_send_wr wr;
>@@ -331,6 +325,12 @@ dapls_ib_post_ext_send (
> int ret;
>
> dapl_dbg_log(DAPL_DBG_TYPE_EP,
>+ " post_ext_snd: ep %p op %d ck %p sgs",
>+ "%d l_iov %p r_iov %p f %d\n",
>+ ep_ptr, op_type, cookie, segments, local_iov,
>+ remote_iov, completion_flags, remote_ah);
>+
>+ dapl_dbg_log(DAPL_DBG_TYPE_EP,
> " post_snd: ep %p cookie %p segs %d l_iov %p\n",
> ep_ptr, cookie, segments, local_iov);
>
>diff --git a/dapl/openib_scm/dapl_ib_mem.c
>b/dapl/openib_scm/dapl_ib_mem.c
>index 54340ed..9a97e5e 100644
>--- a/dapl/openib_scm/dapl_ib_mem.c
>+++ b/dapl/openib_scm/dapl_ib_mem.c
>@@ -1,4 +1,4 @@
>-/*
>+ /*
> * Copyright (c) 2005-2007 Intel Corporation. All rights reserved.
> *
> * This Software is licensed under one of the following licenses:
>@@ -35,13 +35,6 @@
> *
>
>**********************************************************************/
>
>-#include <sys/ioctl.h> /* for IOCTL's */
>-#include <sys/types.h> /* for socket(2) and related bits and
>pieces */
>-#include <sys/socket.h> /* for socket(2) */
>-#include <net/if.h> /* for struct ifreq */
>-#include <net/if_arp.h> /* for ARPHRD_ETHER */
>-#include <unistd.h> /* for _SC_CLK_TCK */
>-
> #include "dapl.h"
> #include "dapl_adapter_util.h"
> #include "dapl_lmr_util.h"
>@@ -215,10 +208,9 @@ dapls_ib_mr_register(IN DAPL_IA *ia_ptr,
> lmr->param.registered_address = (DAT_VADDR)(uintptr_t)virt_addr;
>
> dapl_dbg_log(DAPL_DBG_TYPE_UTIL,
>- " mr_register: mr=%p addr=%p h %x pd %p ctx %p "
>+ " mr_register: mr=%p addr=%p pd %p ctx %p "
> "lkey=0x%x rkey=0x%x priv=%x\n",
> lmr->mr_handle, lmr->mr_handle->addr,
>- lmr->mr_handle->handle,
> lmr->mr_handle->pd, lmr->mr_handle->context,
> lmr->mr_handle->lkey, lmr->mr_handle->rkey,
> length, dapls_convert_privileges(privileges));
>diff --git a/dapl/openib_scm/dapl_ib_util.c
>b/dapl/openib_scm/dapl_ib_util.c
>index 92b45d5..d82d3f5 100644
>--- a/dapl/openib_scm/dapl_ib_util.c
>+++ b/dapl/openib_scm/dapl_ib_util.c
>@@ -49,17 +49,13 @@
> static const char rcsid[] = "$Id: $";
> #endif
>
>+#include "openib_osd.h"
> #include "dapl.h"
> #include "dapl_adapter_util.h"
> #include "dapl_ib_util.h"
>+#include "dapl_osd.h"
>
> #include <stdlib.h>
>-#include <netinet/tcp.h>
>-#include <sys/utsname.h>
>-#include <sys/socket.h>
>-#include <arpa/inet.h>
>-#include <unistd.h>
>-#include <fcntl.h>
>
> int g_dapl_loopback_connection = 0;
> int g_scm_pipe[2];
>@@ -88,52 +84,43 @@ char *dapl_ib_mtu_str(enum ibv_mtu mtu)
> }
> }
>
>-/* just get IP address for hostname */
>-DAT_RETURN getipaddr( char *addr, int addr_len)
>+static DAT_RETURN getlocalipaddr(DAT_SOCK_ADDR *addr, int addr_len)
> {
>- struct sockaddr_in *ipv4_addr = (struct sockaddr_in*)addr;
>- struct hostent *h_ptr;
>- struct utsname ourname;
>+ struct sockaddr_in *sin;
>+ struct addrinfo *res, hint, *ai;
>+ int ret;
>+ char hostname[256];
>
>- if (uname(&ourname) < 0) {
>- dapl_log(DAPL_DBG_TYPE_ERR,
>- " open_hca: uname err=%s\n", strerror(errno));
>+ if (addr_len < sizeof(*sin)) {
> return DAT_INTERNAL_ERROR;
> }
>
>- h_ptr = gethostbyname(ourname.nodename);
>- if (h_ptr == NULL) {
>- dapl_log(DAPL_DBG_TYPE_ERR,
>- " open_hca: gethostbyname err=%s\n",
>- strerror(errno));
>- return DAT_INTERNAL_ERROR;
>+ ret = gethostname(hostname,256);
>+ if (ret)
>+ return ret;
>+
>+ memset(&hint, 0, sizeof hint);
>+ hint.ai_flags = AI_PASSIVE;
>+ hint.ai_family = AF_INET;
>+ hint.ai_socktype = SOCK_STREAM;
>+ hint.ai_protocol = IPPROTO_TCP;
>+
>+ ret = getaddrinfo(hostname, NULL, &hint, &res);
>+ if (ret)
>+ return ret;
>+
>+ ret = DAT_INVALID_ADDRESS;
>+ for (ai = res; ai; ai = ai->ai_next) {
>+ sin = (struct sockaddr_in *) ai->ai_addr;
>+ if (*((uint32_t *) &sin->sin_addr) !=
>htonl(0x7f000001)) {
>+ *((struct sockaddr_in *) addr) = *sin;
>+ ret = DAT_SUCCESS;
>+ break;
>+ }
> }
>
>- if (h_ptr->h_addrtype == AF_INET) {
>- int i;
>- struct in_addr **alist =
>- (struct in_addr **)h_ptr->h_addr_list;
>-
>- *(uint32_t*)&ipv4_addr->sin_addr = 0;
>- ipv4_addr->sin_family = AF_INET;
>-
>- /* Walk the list of addresses for host */
>- for (i=0; alist[i] != NULL; i++) {
>- /* first non-loopback address */
>- if (*(uint32_t*)alist[i] != htonl(0x7f000001)) {
>- dapl_os_memcpy(&ipv4_addr->sin_addr,
>- h_ptr->h_addr_list[i],
>- 4);
>- break;
>- }
>- }
>- /* if no acceptable address found */
>- if (*(uint32_t*)&ipv4_addr->sin_addr == 0)
>- return DAT_INVALID_ADDRESS;
>- } else
>- return DAT_INVALID_ADDRESS;
>-
>- return DAT_SUCCESS;
>+ freeaddrinfo(res);
>+ return ret;
> }
>
> /*
>@@ -165,6 +152,28 @@ int32_t dapls_ib_release (void)
> return 0;
> }
>
>+#if defined(_WIN64) || defined(_WIN32)
>+int dapls_config_comp_channel(struct ibv_comp_channel *channel)
>+{
>+ return 0;
>+}
>+#else // _WIN64 || WIN32
>+int dapls_config_comp_channel(struct ibv_comp_channel *channel)
>+{
>+ int opts;
>+
>+ opts = fcntl(channel->fd, F_GETFL); /* uCQ */
>+ if (opts < 0 || fcntl(channel->fd, F_SETFL, opts |
>O_NONBLOCK) < 0) {
>+ dapl_log(DAPL_DBG_TYPE_ERR,
>+ " dapls_create_comp_channel: fcntl on
>ib_cq->fd %d ERR %d %s\n",
>+ channel->fd, opts, strerror(errno));
>+ return errno;
>+ }
>+
>+ return 0;
>+}
>+#endif
>+
> /*
> * dapls_ib_open_hca
> *
>@@ -187,7 +196,6 @@ DAT_RETURN dapls_ib_open_hca (
> IN DAPL_HCA *hca_ptr)
> {
> struct ibv_device **dev_list;
>- int opts;
> int i;
> DAT_RETURN dat_status = DAT_SUCCESS;
>
>@@ -219,7 +227,7 @@ found:
> dapl_dbg_log(DAPL_DBG_TYPE_UTIL," open_hca: Found dev
>%s %016llx\n",
> ibv_get_device_name(hca_ptr->ib_trans.ib_dev),
> (unsigned long long)
>-
>bswap_64(ibv_get_device_guid(hca_ptr->ib_trans.ib_dev)));
>+
>ntohll(ibv_get_device_guid(hca_ptr->ib_trans.ib_dev)));
>
> hca_ptr->ib_hca_handle =
>ibv_open_device(hca_ptr->ib_trans.ib_dev);
> if (!hca_ptr->ib_hca_handle) {
>@@ -268,13 +276,7 @@ found:
> goto bail;
> }
>
>- opts = fcntl(hca_ptr->ib_trans.ib_cq->fd, F_GETFL); /* uCQ */
>- if (opts < 0 || fcntl(hca_ptr->ib_trans.ib_cq->fd,
>- F_SETFL, opts | O_NONBLOCK) < 0) {
>- dapl_log(DAPL_DBG_TYPE_ERR,
>- " open_hca: fcntl on ib_cq->fd %d ERR
>%d %s\n",
>- hca_ptr->ib_trans.ib_cq->fd, opts,
>- strerror(errno));
>+ if (dapls_config_comp_channel(hca_ptr->ib_trans.ib_cq)) {
> goto bail;
> }
>
>@@ -309,16 +311,11 @@ found:
>
> /* wait for thread */
> while (hca_ptr->ib_trans.cr_state != IB_THREAD_RUN) {
>- struct timespec sleep, remain;
>- sleep.tv_sec = 0;
>- sleep.tv_nsec = 2000000; /* 2 ms */
>- dapl_dbg_log(DAPL_DBG_TYPE_UTIL,
>- " open_hca: waiting for cr_thread\n");
>- nanosleep (&sleep, &remain);
>+ dapl_os_sleep_usec(20000);
> }
>
> /* get the IP address of the device */
>- dat_status = getipaddr((char*)&hca_ptr->hca_address,
>+ dat_status = getlocalipaddr((DAT_SOCK_ADDR*)
>&hca_ptr->hca_address,
> sizeof(DAT_SOCK_ADDR6));
>
> dapl_dbg_log(DAPL_DBG_TYPE_UTIL,
>@@ -376,16 +373,13 @@ DAT_RETURN dapls_ib_close_hca ( IN
>DAPL_HCA *hca_ptr )
> " thread_destroy: thread wakeup err = %s\n",
> strerror(errno));
> while (hca_ptr->ib_trans.cr_state != IB_THREAD_EXIT) {
>- struct timespec sleep, remain;
>- sleep.tv_sec = 0;
>- sleep.tv_nsec = 2000000; /* 2 ms */
> dapl_dbg_log(DAPL_DBG_TYPE_UTIL,
> " close_hca: waiting for cr_thread\n");
> if (write(g_scm_pipe[1], "w", sizeof "w") == -1)
> dapl_log(DAPL_DBG_TYPE_UTIL,
> " thread_destroy: thread
>wakeup err = %s\n",
> strerror(errno));
>- nanosleep (&sleep, &remain);
>+ dapl_os_sleep_usec(20000);
> }
> dapl_os_lock_destroy(&hca_ptr->ib_trans.lock);
>
>diff --git a/dapl/openib_scm/dapl_ib_util.h
>b/dapl/openib_scm/dapl_ib_util.h
>index 863da2b..fd1c24e 100644
>--- a/dapl/openib_scm/dapl_ib_util.h
>+++ b/dapl/openib_scm/dapl_ib_util.h
>@@ -49,8 +49,8 @@
> #ifndef _DAPL_IB_UTIL_H_
> #define _DAPL_IB_UTIL_H_
>
>+#include "openib_osd.h"
> #include <infiniband/verbs.h>
>-#include <byteswap.h>
>
> #ifdef DAT_EXTENSIONS
> #include <dat2/dat_ib_extensions.h>
>@@ -73,8 +73,6 @@ typedef struct ibv_wc
>ib_work_completion_t;
> typedef struct ibv_context *ib_hca_handle_t;
> typedef ib_hca_handle_t dapl_ibal_ca_t;
>
>-/* CM mappings, user CM not complete use SOCKETS */
>-
> /* destination info to exchange, define wire protocol version */
> #define DSCM_VER 3
> typedef struct _ib_qp_cm
>@@ -86,7 +84,7 @@ typedef struct _ib_qp_cm
> uint32_t qpn;
> uint32_t p_size;
> DAT_SOCK_ADDR6 ia_address;
>- union ibv_gid gid;
>+ union ibv_gid gid;
> uint16_t qp_type;
> } ib_qp_cm_t;
>
>@@ -110,20 +108,18 @@ struct ib_cm_handle
> struct dapl_llist_entry entry;
> DAPL_OS_LOCK lock;
> SCM_STATE state;
>- int socket;
>+ DAPL_SOCKET socket;
> struct dapl_hca *hca;
> struct dapl_sp *sp;
>- struct dapl_ep *ep;
>+ struct dapl_ep *ep;
> ib_qp_cm_t dst;
>- unsigned char p_data[256];
>+ unsigned char p_data[256]; /* must follow
>ib_qp_cm_t */
> struct ibv_ah *ah;
> };
>
> typedef struct ib_cm_handle *dp_ib_cm_handle_t;
> typedef dp_ib_cm_handle_t ib_cm_srvc_handle_t;
>
>-DAT_RETURN getipaddr(char *addr, int addr_len);
>-
> /* CM events */
> typedef enum
> {
>@@ -141,9 +137,6 @@ typedef enum
>
> } ib_cm_events_t;
>
>-/* prototype for cm thread */
>-void cr_thread (void *arg);
>-
> /* Operation and state mappings */
> typedef enum ibv_send_flags ib_send_op_type_t;
> typedef struct ibv_sge ib_data_segment_t;
>@@ -289,7 +282,7 @@ typedef struct _ib_hca_transport
> DAPL_OS_LOCK cq_lock;
> int max_inline_send;
> ib_thread_state_t cq_state;
>- DAPL_OS_THREAD cq_thread;
>+ DAPL_OS_THREAD cq_thread;
> struct ibv_comp_channel *ib_cq;
> int cr_state;
> DAPL_OS_THREAD thread;
>@@ -317,7 +310,6 @@ typedef uint32_t ib_shm_transport_t;
> /* prototypes */
> int32_t dapls_ib_init (void);
> int32_t dapls_ib_release (void);
>-void cq_thread (void *arg);
> void cr_thread(void *arg);
> int dapli_cq_thread_init(struct dapl_hca *hca_ptr);
> void dapli_cq_thread_destroy(struct dapl_hca *hca_ptr);
>@@ -349,7 +341,7 @@ dapl_convert_errno( IN int err, IN const
>char *str )
> if (!err) return DAT_SUCCESS;
>
> #if DAPL_DBG
>- if ((err != EAGAIN) && (err != ETIME) && (err != ETIMEDOUT))
>+ if ((err != EAGAIN) && (err != ETIMEDOUT))
> dapl_dbg_log (DAPL_DBG_TYPE_ERR," %s %s\n", str, strerror(err));
> #endif
>
>@@ -357,24 +349,15 @@ dapl_convert_errno( IN int err, IN const
>char *str )
> {
> case EOVERFLOW : return DAT_LENGTH_ERROR;
> case EACCES : return DAT_PRIVILEGES_VIOLATION;
>- case ENXIO :
>- case ERANGE :
> case EPERM : return DAT_PROTECTION_VIOLATION;
>
>- case EINVAL :
>- case EBADF :
>- case ENOENT :
>- case ENOTSOCK : return DAT_INVALID_HANDLE;
>+ case EINVAL : return DAT_INVALID_HANDLE;
> case EISCONN : return DAT_INVALID_STATE |
>DAT_INVALID_STATE_EP_CONNECTED;
> case ECONNREFUSED : return DAT_INVALID_STATE |
>DAT_INVALID_STATE_EP_NOTREADY;
>- case ETIME :
> case ETIMEDOUT : return DAT_TIMEOUT_EXPIRED;
> case ENETUNREACH: return DAT_INVALID_ADDRESS |
>DAT_INVALID_ADDRESS_UNREACHABLE;
> case EADDRINUSE : return DAT_CONN_QUAL_IN_USE;
> case EALREADY : return DAT_INVALID_STATE |
>DAT_INVALID_STATE_EP_ACTCONNPENDING;
>- case ENOSPC :
>- case ENOMEM :
>- case E2BIG :
>- case EDQUOT : return DAT_INSUFFICIENT_RESOURCES;
>+ case ENOMEM : return DAT_INSUFFICIENT_RESOURCES;
> case EAGAIN : return DAT_QUEUE_EMPTY;
> case EINTR : return DAT_INTERRUPTED_CALL;
> case EAFNOSUPPORT : return DAT_INVALID_ADDRESS |
>DAT_INVALID_ADDRESS_MALFORMED;
>diff --git a/dapl/openib_scm/linux/openib_osd.h
>b/dapl/openib_scm/linux/openib_osd.h
>new file mode 100644
>index 0000000..235a82e
>--- /dev/null
>+++ b/dapl/openib_scm/linux/openib_osd.h
>@@ -0,0 +1,21 @@
>+#ifndef OPENIB_OSD_H
>+#define OPENIB_OSD_H
>+
>+#include <endian.h>
>+#include <netinet/in.h>
>+
>+#if __BYTE_ORDER == __BIG_ENDIAN
>+#define htonll(x) (x)
>+#define ntohll(x) (x)
>+#elif __BYTE_ORDER == __LITTLE_ENDIAN
>+#define htonll(x) bswap_64(x)
>+#define ntohll(x) bswap_64(x)
>+#endif
>+
>+#define DAPL_SOCKET int
>+#define DAPL_INVALID_SOCKET -1
>+#define DAPL_FD_SETSIZE 8192
>+
>+#define closesocket close
>+
>+#endif // OPENIB_OSD_H
>diff --git a/dapl/openib_scm/windows/openib_osd.h
>b/dapl/openib_scm/windows/openib_osd.h
>new file mode 100644
>index 0000000..67c70ec
>--- /dev/null
>+++ b/dapl/openib_scm/windows/openib_osd.h
>@@ -0,0 +1,39 @@
>+#ifndef OPENIB_OSD_H
>+#define OPENIB_OSD_H
>+
>+#ifndef FD_SETSIZE
>+#define FD_SETSIZE 1024 /* Set before including winsock2 -
>see select help */
>+#define DAPL_FD_SETSIZE FD_SETSIZE
>+#endif
>+
>+#include <winsock2.h>
>+#include <ws2tcpip.h>
>+#include <io.h>
>+#include <fcntl.h>
>+
>+#define ntohll _byteswap_uint64
>+#define htonll _byteswap_uint64
>+
>+#define pipe(x) _pipe(x, 4096, _O_TEXT)
>+#define read _read
>+#define write _write
>+#define DAPL_SOCKET SOCKET
>+#define DAPL_INVALID_SOCKET INVALID_SOCKET
>+
>+/* allow casting to WSABUF */
>+struct iovec
>+{
>+ u_long iov_len;
>+ char FAR* iov_base;
>+};
>+
>+static int writev(DAPL_SOCKET s, struct iovec *vector, int count)
>+{
>+ int len, ret;
>+
>+ ret = WSASend(s, (WSABUF *) vector, count, &len, 0,
>NULL, NULL);
>+ return ret ? ret : len;
>+}
>+
>+#endif // OPENIB_OSD_H
>+
>diff --git a/dapl/udapl/linux/dapl_osd.h b/dapl/udapl/linux/dapl_osd.h
>index 6fef9af..ae02944 100644
>--- a/dapl/udapl/linux/dapl_osd.h
>+++ b/dapl/udapl/linux/dapl_osd.h
>@@ -302,6 +302,15 @@ dapl_os_thread_create (
> IN void *data,
> OUT DAPL_OS_THREAD *thread_id );
>
>+STATIC _INLINE_ void
>+dapl_os_sleep_usec(int usec)
>+{
>+ struct timespec sleep, remain;
>+
>+ sleep.tv_sec = 0;
>+ sleep.tv_nsec = usec * 1000;
>+ nanosleep(&sleep, &remain);
>+}
>
> /*
> * Lock Functions
>
>
>
>_______________________________________________
>general mailing list
>general at lists.openfabrics.org
>http://lists.openfabrics.org/cgi-bin/mailman/listinfo/general
>
>To unsubscribe, please visit
>http://openib.org/mailman/listinfo/openib-general
>
More information about the general
mailing list