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