Gets or acknowledges asynchronous events.
#include <rdma/verbs.h> int ibv_get_async_event(struct ibv_context *context, struct ibv_async_event *event); void ibv_ack_async_event(struct ibv_async_event *event);
ibv_get_async_event() waits for the next async event of the RDMA device context, context and returns it through the pointer, event, which is an ibv_async_event struct, as defined in <rdma/verbs.h>.
struct ibv_async_event { union { struct ibv_cq *cq; /* CQ that got the event */ struct ibv_qp *qp; /* QP that got the event */ struct ibv_srq *srq; /* SRQ that got the event (Not Supported)*/ int port_num; /* port number that got the event */ } element; enum ibv_event_type event_type; /* type of the event */ };
The function ibv_create_qp() updates the qp_init_attr->cap struct with the actual QP values of the QP that was created; the values will be greater than or equal to the values requested. ibv_destroy_qp() destroys the QP qp.
QP events | |
IBV_EVENT_QP_FATAL | Error occurred on a QP and it transitions to error state. |
IBV_EVENT_QP_REQ_ERR | Invalid request local work queue error. |
IBV_EVENT_QP_ACCESS_ERR | Local access violation error. |
IBV_EVENT_COMM_EST | Communication is established on a QP. |
IBV_EVENT_SQ_DRAINED | Send Queue is drained of outstanding messages in progress. |
IBV_EVENT_PATH_MIG | A connection is migrated to an alternate path. |
IBV_EVENT_PATH_MIG_ERR | A connection failed to migrate to the alternate path. |
CQ events | |
IBV_EVENT_CQ_ERR | CQ is in error (CQ overrun). |
Port events | |
IBV_EVENT_PORT_ACTIVE | Link became active on a port. |
IBV_EVENT_PORT_ERR | Link became unavailable on a port. |
IBV_EVENT_LID_CHANGE | LID is changed on a port. |
IBV_EVENT_PKEY_CHANGE | The P_Key table is changed on a port. |
CA events | |
IBV_EVENT_DEVICE_FATAL | CA is in FATAL state. |
ibv_ack_async_event() acknowledges the async event, event.
struct ibv_context *context | struct ibv_context from ibv_open_device. |
struct ibv_async_event *event | event pointer. |
ibv_get_async_event() returns 0 on success, and -1 if the request fails.
ibv_ack_async_event() returns no value.
/* change the blocking mode of the async event queue */ flags = fcntl(ctx->async_fd, F_GETFL); rc = fcntl(ctx->async_fd, F_SETFL, flags | O_NONBLOCK); if (rc < 0) { fprintf(stderr, "Failed to change file descriptor of async event queue\n"); return 1; } /* * poll the queue until it has an event and sleep ms_timeout * milliseconds between any iteration */ my_pollfd.fd = ctx->async_fd; my_pollfd.events = POLLIN; my_pollfd.revents = 0; do { rc = poll(&my_pollfd;,1, ms_timeout); } while (rc == 0); if (rc < 0) { fprintf(stderr, "poll failed\n"); return 1; } /* Get the async event */ if (ibv_get_async_event(ctx, &async_event)) { fprintf(stderr, "Failed to get async_event\n"); return 1; } /* Ack the event */ ibv_ack_async_event(&async_event);