#ifndef _VERBS_UTILS_H
#define _VERBS_UTILS_H
#include <alloca.h>
#include <malloc.h>
#include <stddef.h>
#include <inttypes.h>
#include <string.h>
#include <sys/types.h>
#include <infiniband/verbs.h>
#include "../fi_verbs.h"
#if (defined(__ICC) || defined(__INTEL_COMPILER) || \
defined(__GNUC__) || defined(__GNUG__)) && \
defined(__x86_64__)
#include "xmmintrin.h"
#define FI_IBV_PREFETCH_ADDR(_addr) { \
_mm_prefetch((const char *)(_addr), _MM_HINT_T0);\
}
#else
#define FI_IBV_PREFETCH_ADDR(_addr)
#endif
struct fi_ibv_msg_ep;
#define FI_IBV_RDM_DFLT_ADDRLEN (sizeof (struct sockaddr_in))
#define FI_IBV_RDM_CM_THREAD_TIMEOUT (100)
#define FI_IBV_RDM_MEM_ALIGNMENT (64)
#define FI_IBV_RDM_BUF_ALIGNMENT (4096)
#define FI_IBV_RDM_TAGGED_DFLT_BUFFER_NUM (8)
#define FI_IBV_RDM_DFLT_CQREAD_BUNCH_SIZE (FI_IBV_RDM_TAGGED_DFLT_BUFFER_NUM)
#define FI_IBV_RDM_DFLT_BUFFER_SIZE \
(3 * FI_IBV_RDM_BUF_ALIGNMENT)
#define FI_IBV_RDM_DFLT_BUFFERED_SSIZE \
(FI_IBV_RDM_DFLT_BUFFER_SIZE - \
FI_IBV_RDM_BUFF_SERVICE_DATA_SIZE - \
sizeof(struct fi_ibv_rdm_header))
size_t rdm_buffer_size(size_t buf_send_size);
#ifdef HAVE_VERBS_EXP_H
#define FI_IBV_RDM_SEG_MAXSIZE (128*1024*1024)
#else
#define FI_IBV_RDM_SEG_MAXSIZE (1024*1024*1024)
#endif
#define FI_IBV_RDM_TAGGED_DFLT_SCQ_SIZE (1000)
#define FI_IBV_RDM_TAGGED_DFLT_RCQ_SIZE (1000)
#define FI_IBV_RDM_CM_RESOLVEADDR_TIMEOUT (30000)
#if ENABLE_DEBUG
#define FI_IBV_RDM_CHECK_RECV_WC(wc) \
((wc->status == IBV_WC_SUCCESS) && \
(wc->opcode == IBV_WC_RECV_RDMA_WITH_IMM || wc->opcode == IBV_WC_RECV))
#else
#define FI_IBV_RDM_CHECK_RECV_WC(wc) (wc->status == IBV_WC_SUCCESS)
#endif
#define FI_IBV_DBG_OPCODE(wc_opcode, str) \
VERBS_DBG(FI_LOG_CQ, "CQ COMPL: "str" -> %s\n", \
wc_opcode == IBV_WC_SEND ? "IBV_WC_SEND" : \
wc_opcode == IBV_WC_RDMA_WRITE ? "IBV_WC_RDMA_WRITE" : \
wc_opcode == IBV_WC_RDMA_READ ? "IBV_WC_RDMA_READ" : \
wc_opcode == IBV_WC_COMP_SWAP ? "IBV_WC_COMP_SWAP" : \
wc_opcode == IBV_WC_FETCH_ADD ? "IBV_WC_FETCH_ADD" : \
wc_opcode == IBV_WC_BIND_MW ? "IBV_WC_BIND_MW" : \
wc_opcode == IBV_WC_RECV ? "IBV_WC_RECV" : \
wc_opcode == IBV_WC_RECV_RDMA_WITH_IMM ? "IBV_WC_RECV_RDMA_WITH_IMM" : \
"IBV_WC_UNKNOWN!!!");
#if ENABLE_DEBUG
#define FI_IBV_RDM_DBG_REQUEST(prefix, request, level) \
do { \
const size_t max_str_len = 1024; \
char str[max_str_len]; \
snprintf(str, max_str_len, \
"%s request: %p, eager_state: %s, rndv_state: %s," \
" err_state: %ld, tag: 0x%lx, len: %lu, rest: %lu," \
"context: %p, connection: %p\n", \
prefix, \
request, \
fi_ibv_rdm_req_eager_state_to_str(request->state.eager), \
fi_ibv_rdm_req_rndv_state_to_str(request->state.rndv), \
request->state.err, \
request->minfo.tag, \
request->len, \
request->rest_len, \
request->context, \
request->minfo.conn); \
\
switch (level) \
{ \
case FI_LOG_WARN: \
case FI_LOG_TRACE: \
case FI_LOG_INFO: \
VERBS_INFO(FI_LOG_EP_DATA, "%s", str); \
break; \
case FI_LOG_DEBUG: \
default: \
VERBS_DBG(FI_LOG_EP_DATA, "%s", str); \
break; \
} \
} while (0);
#else
#define FI_IBV_RDM_DBG_REQUEST(prefix, request, level)
#endif
struct fi_ibv_rdm_minfo {
struct fi_ibv_rdm_conn *conn;
uint64_t is_tagged;
uint64_t tag;
uint64_t tagmask;
};
struct fi_ibv_rdm_tagged_peek_data {
struct fi_ibv_rdm_minfo minfo;
void *context;
uint64_t flags;
};
struct fi_ibv_rdm_cm;
struct fi_ibv_rdm_request;
struct fi_ibv_rdm_send_start_data;
int fi_ibv_rdm_req_match(struct dlist_entry *item, const void *other);
int fi_ibv_rdm_req_match_by_info(struct dlist_entry *item, const void *info);
int fi_ibv_rdm_req_match_by_info2(struct dlist_entry *item, const void *info);
int fi_ibv_rdm_req_match_by_info3(struct dlist_entry *item, const void *info);
int fi_ibv_rdm_postponed_process(struct dlist_entry *item, const void *arg);
void fi_ibv_rdm_conn_init_cm_role(struct fi_ibv_rdm_conn *conn,
struct fi_ibv_rdm_ep *ep);
ssize_t fi_ibv_rdm_send_common(struct fi_ibv_rdm_send_start_data* sdata);
ssize_t rdm_trecv_second_event(struct fi_ibv_rdm_request *request,
struct fi_ibv_rdm_ep *ep);
#endif