DAT_EVENT_NUMBER async_event;
DAT_RETURN dat_status;
- dapl_log(DAPL_DBG_TYPE_WARN, " -- %s (%p, %p, %p)\n",
- __FUNCTION__, ib_hca_handle, cause_ptr, context);
-
if (NULL == context) {
dapl_os_panic("NULL == context\n");
return;
async_event,
async_evd->header.owner_ia);
}
- dapl_dbg_log(DAPL_DBG_TYPE_CALLBACK | DAPL_DBG_TYPE_EXCEPTION,
- "dapl_evd_un_async_error_callback () returns\n");
}
DAT_RETURN dat_status = DAT_SUCCESS;
int err_code = err_record->event_type;
- switch (err_code) {
+ dapl_log(DAPL_DBG_TYPE_WARN, " WARNING: %s\n", dapl_ib_async_str(err_code));
+
+ switch (err_code)
+ {
/* OVERFLOW error */
- case IBV_EVENT_CQ_ERR:
- *async_event = DAT_ASYNC_ERROR_EVD_OVERFLOW;
- break;
+ case IBV_EVENT_CQ_ERR:
+ *async_event = DAT_ASYNC_ERROR_EVD_OVERFLOW;
+ break;
+
/* INTERNAL errors */
- case IBV_EVENT_DEVICE_FATAL:
- *async_event = DAT_ASYNC_ERROR_PROVIDER_INTERNAL_ERROR;
- break;
+ case IBV_EVENT_DEVICE_FATAL:
+ case IBV_EVENT_PORT_ERR:
+ case IBV_EVENT_LID_CHANGE:
+ case IBV_EVENT_PKEY_CHANGE:
+ case IBV_EVENT_SM_CHANGE:
/* CATASTROPHIC errors */
- case IBV_EVENT_PORT_ERR:
- *async_event = DAT_ASYNC_ERROR_IA_CATASTROPHIC;
- break;
+ *async_event = DAT_ASYNC_ERROR_IA_CATASTROPHIC;
+ break;
+
/* BROKEN QP error */
- case IBV_EVENT_SQ_DRAINED:
- case IBV_EVENT_QP_FATAL:
- case IBV_EVENT_QP_REQ_ERR:
- case IBV_EVENT_QP_ACCESS_ERR:
- *async_event = DAT_ASYNC_ERROR_EP_BROKEN;
- break;
+ case IBV_EVENT_SQ_DRAINED:
+ case IBV_EVENT_QP_FATAL:
+ case IBV_EVENT_QP_REQ_ERR:
+ case IBV_EVENT_QP_ACCESS_ERR:
+ case IBV_EVENT_SRQ_ERR:
+ case IBV_EVENT_SRQ_LIMIT_REACHED:
+ case IBV_EVENT_QP_LAST_WQE_REACHED:
+ *async_event = DAT_ASYNC_ERROR_EP_BROKEN;
+ break;
/* connection completion */
- case IBV_EVENT_COMM_EST:
- *async_event = DAT_CONNECTION_EVENT_ESTABLISHED;
- break;
-
- /* TODO: process HW state changes */
- case IBV_EVENT_PATH_MIG:
- case IBV_EVENT_PATH_MIG_ERR:
- case IBV_EVENT_PORT_ACTIVE:
- case IBV_EVENT_LID_CHANGE:
- case IBV_EVENT_PKEY_CHANGE:
- case IBV_EVENT_SM_CHANGE:
- default:
- dat_status = DAT_ERROR(DAT_NOT_IMPLEMENTED, 0);
+ case IBV_EVENT_COMM_EST:
+ *async_event = DAT_CONNECTION_EVENT_ESTABLISHED;
+ break;
+
+ /* non-catastrophic events */
+ case IBV_EVENT_PATH_MIG:
+ case IBV_EVENT_PATH_MIG_ERR:
+ case IBV_EVENT_PORT_ACTIVE:
+ case IBV_EVENT_CLIENT_REREGISTER:
+ break;
+
+ default:
+ dat_status = DAT_ERROR(DAT_NOT_IMPLEMENTED, 0);
}
return dat_status;
}
char *dapl_ib_mtu_str(enum ibv_mtu mtu);
int getipaddr_netdev(char *name, char *addr, int addr_len);
DAT_RETURN getlocalipaddr(char *addr, int addr_len);
+void dapli_async_event_cb(struct _ib_hca_transport *hca);
/* qp.c */
DAT_RETURN dapls_modify_qp_ud(IN DAPL_HCA *hca, IN struct ibv_qp *qp);
return ((op < 1 || op > 7) ? "Invalid OP?" : ops[op]);
}
+static inline char * dapl_ib_async_str(IN int st)
+{
+ static char *state[] = {
+ "IBV_EVENT_CQ_ERR",
+ "IBV_EVENT_QP_FATAL",
+ "IBV_EVENT_QP_REQ_ERR",
+ "IBV_EVENT_QP_ACCESS_ERR",
+ "IBV_EVENT_COMM_EST",
+ "IBV_EVENT_SQ_DRAINED",
+ "IBV_EVENT_PATH_MIG",
+ "IBV_EVENT_PATH_MIG_ERR",
+ "IBV_EVENT_DEVICE_FATAL",
+ "IBV_EVENT_PORT_ACTIVE",
+ "IBV_EVENT_PORT_ERR",
+ "IBV_EVENT_LID_CHANGE",
+ "IBV_EVENT_PKEY_CHANGE",
+ "IBV_EVENT_SM_CHANGE",
+ "IBV_EVENT_SRQ_ERR",
+ "IBV_EVENT_SRQ_LIMIT_REACHED",
+ "IBV_EVENT_QP_LAST_WQE_REACHED",
+ "IBV_EVENT_CLIENT_REREGISTER",
+ };
+ return ((st < 0 || st > 17) ? "Invalid IB async event?" : state[st]);
+}
+
#endif /* _DAPL_IB_COMMON_H_ */
}
case IBV_EVENT_CLIENT_REREGISTER:
/* no need to report this event this time */
- dapl_log(DAPL_DBG_TYPE_UTIL,
- " async_event: IBV_CLIENT_REREGISTER\n");
+ dapl_log(DAPL_DBG_TYPE_WARN,
+ " WARNING: IBV_CLIENT_REREGISTER\n");
break;
default:
#include "dapl_ep_util.h"
#include "dapl_osd.h"
+#ifdef DAPL_DBG
static char gid_str[INET6_ADDRSTRLEN];
+#endif
enum DAPL_FD_EVENTS {
DAPL_FD_READ = POLLIN,
}
if (dapl_poll(hca->ib_hca_handle->async_fd,
DAPL_FD_READ) == DAPL_FD_READ) {
- mcm_async_event(hca);
+ dapli_async_event_cb(&hca->ib_trans);
}
if (dapl_poll(hca->ib_trans.ib_cq->fd,
DAPL_FD_READ) == DAPL_FD_READ) {
void cm_thread(void *arg);
void dapli_queue_conn(dp_ib_cm_handle_t cm);
void dapli_dequeue_conn(dp_ib_cm_handle_t cm);
-void mcm_async_event(struct dapl_hca *hca);
void mcm_connect_rtu(dp_ib_cm_handle_t cm, dat_mcm_msg_t *msg);
void mcm_disconnect_final(dp_ib_cm_handle_t cm);
void dapli_cq_event_cb(struct _ib_hca_transport *tp);
return -1;
}
-void mcm_async_event(struct dapl_hca *hca)
-{
- struct ibv_async_event event;
- struct _ib_hca_transport *tp = &hca->ib_trans;
-
- if (!ibv_get_async_event(hca->ib_hca_handle, &event)) {
-
- switch (event.event_type) {
- case IBV_EVENT_CQ_ERR:
- {
- struct dapl_evd *evd_ptr =
- event.element.cq->cq_context;
-
- dapl_log(DAPL_DBG_TYPE_ERR,
- "dapl async_event CQ (%p) ERR %d\n",
- evd_ptr, event.event_type);
-
- /* report up if async callback still setup */
- if (tp->async_cq_error)
- tp->async_cq_error(hca->ib_hca_handle,
- evd_ptr->ib_cq_handle,
- &event, (void *)evd_ptr);
- break;
- }
- case IBV_EVENT_COMM_EST:
- {
- /* Received msgs on connected QP before RTU */
- dapl_log(DAPL_DBG_TYPE_UTIL,
- " async_event COMM_EST(%p) rdata beat RTU\n",
- event.element.qp);
-
- break;
- }
- case IBV_EVENT_QP_FATAL:
- case IBV_EVENT_QP_REQ_ERR:
- case IBV_EVENT_QP_ACCESS_ERR:
- case IBV_EVENT_QP_LAST_WQE_REACHED:
- case IBV_EVENT_SRQ_ERR:
- case IBV_EVENT_SRQ_LIMIT_REACHED:
- case IBV_EVENT_SQ_DRAINED:
- {
- struct dapl_ep *ep_ptr =
- event.element.qp->qp_context;
-
- dapl_log(DAPL_DBG_TYPE_ERR,
- "dapl async_event QP (%p) ERR %d\n",
- ep_ptr, event.event_type);
-
- /* report up if async callback still setup */
- if (tp->async_qp_error)
- tp->async_qp_error(hca->ib_hca_handle,
- ep_ptr->qp_handle,
- &event, (void *)ep_ptr);
- break;
- }
- case IBV_EVENT_PATH_MIG:
- case IBV_EVENT_PATH_MIG_ERR:
- case IBV_EVENT_DEVICE_FATAL:
- case IBV_EVENT_PORT_ACTIVE:
- case IBV_EVENT_PORT_ERR:
- case IBV_EVENT_LID_CHANGE:
- case IBV_EVENT_PKEY_CHANGE:
- case IBV_EVENT_SM_CHANGE:
- {
- dapl_log(DAPL_DBG_TYPE_WARN,
- "dapl async_event: DEV ERR %d\n",
- event.event_type);
-
- /* report up if async callback still setup */
- if (tp->async_unafiliated)
- tp->async_unafiliated(hca->ib_hca_handle,
- &event,
- tp->async_un_ctx);
- break;
- }
- case IBV_EVENT_CLIENT_REREGISTER:
- /* no need to report this event this time */
- dapl_log(DAPL_DBG_TYPE_UTIL,
- " async_event: IBV_CLIENT_REREGISTER\n");
- break;
-
- default:
- dapl_log(DAPL_DBG_TYPE_WARN,
- "dapl async_event: %d UNKNOWN\n",
- event.event_type);
- break;
-
- }
- ibv_ack_async_event(&event);
- }
-}
-
(DAT_PVOID *)cm->msg.p_data,
(DAT_PVOID *)&xevent);
- if (event != DAT_IB_UD_CONNECTION_EVENT_ESTABLISHED)
+ if (event != (ib_cm_events_t)DAT_IB_UD_CONNECTION_EVENT_ESTABLISHED)
dapli_cm_free(cm);
DAPL_CNTR(((DAPL_IA *)dapl_llist_peek_head(&cm->hca->ia_list_head)), DCNT_IA_CM_AH_RESOLVED);
}
if (dapl_poll(hca->ib_hca_handle->async_fd,
DAPL_FD_READ) == DAPL_FD_READ) {
- ucm_async_event(hca);
+ dapli_async_event_cb(&hca->ib_trans);
}
if (dapl_poll(hca->ib_trans.ib_cq->fd,
DAPL_FD_READ) == DAPL_FD_READ) {
/* prototypes */
void cm_thread(void *arg);
-void ucm_async_event(struct dapl_hca *hca);
void dapli_cq_event_cb(struct _ib_hca_transport *tp);
void dapls_cm_acquire(dp_ib_cm_handle_t cm_ptr);
void dapls_cm_release(dp_ib_cm_handle_t cm_ptr);
ucm_service_destroy(hca);
return -1;
}
-
-void ucm_async_event(struct dapl_hca *hca)
-{
- struct ibv_async_event event;
- struct _ib_hca_transport *tp = &hca->ib_trans;
-
- if (!ibv_get_async_event(hca->ib_hca_handle, &event)) {
-
- switch (event.event_type) {
- case IBV_EVENT_CQ_ERR:
- {
- struct dapl_evd *evd_ptr =
- event.element.cq->cq_context;
-
- dapl_log(DAPL_DBG_TYPE_ERR,
- "dapl async_event CQ (%p) ERR %d\n",
- evd_ptr, event.event_type);
-
- /* report up if async callback still setup */
- if (tp->async_cq_error)
- tp->async_cq_error(hca->ib_hca_handle,
- evd_ptr->ib_cq_handle,
- &event, (void *)evd_ptr);
- break;
- }
- case IBV_EVENT_COMM_EST:
- {
- /* Received msgs on connected QP before RTU */
- dapl_log(DAPL_DBG_TYPE_UTIL,
- " async_event COMM_EST(%p) rdata beat RTU\n",
- event.element.qp);
-
- break;
- }
- case IBV_EVENT_QP_FATAL:
- case IBV_EVENT_QP_REQ_ERR:
- case IBV_EVENT_QP_ACCESS_ERR:
- case IBV_EVENT_QP_LAST_WQE_REACHED:
- case IBV_EVENT_SRQ_ERR:
- case IBV_EVENT_SRQ_LIMIT_REACHED:
- case IBV_EVENT_SQ_DRAINED:
- {
- struct dapl_ep *ep_ptr =
- event.element.qp->qp_context;
-
- dapl_log(DAPL_DBG_TYPE_ERR,
- "dapl async_event QP (%p) ERR %d\n",
- ep_ptr, event.event_type);
-
- /* report up if async callback still setup */
- if (tp->async_qp_error)
- tp->async_qp_error(hca->ib_hca_handle,
- ep_ptr->qp_handle,
- &event, (void *)ep_ptr);
- break;
- }
- case IBV_EVENT_PATH_MIG:
- case IBV_EVENT_PATH_MIG_ERR:
- case IBV_EVENT_DEVICE_FATAL:
- case IBV_EVENT_PORT_ACTIVE:
- case IBV_EVENT_PORT_ERR:
- case IBV_EVENT_LID_CHANGE:
- case IBV_EVENT_PKEY_CHANGE:
- case IBV_EVENT_SM_CHANGE:
- {
- dapl_log(DAPL_DBG_TYPE_WARN,
- "dapl async_event: DEV ERR %d\n",
- event.event_type);
-
- /* report up if async callback still setup */
- if (tp->async_unafiliated)
- tp->async_unafiliated(hca->ib_hca_handle,
- &event,
- tp->async_un_ctx);
- break;
- }
- case IBV_EVENT_CLIENT_REREGISTER:
- /* no need to report this event this time */
- dapl_log(DAPL_DBG_TYPE_UTIL,
- " async_event: IBV_CLIENT_REREGISTER\n");
- break;
-
- default:
- dapl_log(DAPL_DBG_TYPE_WARN,
- "dapl async_event: %d UNKNOWN\n",
- event.event_type);
- break;
-
- }
- ibv_ack_async_event(&event);
- }
-}
-