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);