.\" -*- nroff -*-
.\"
.TH IBV_GET_ASYNC_EVENT 3 2006-10-31 libibverbs "Libibverbs Programmer's Manual"
.SH "NAME"
ibv_get_async_event, ibv_ack_async_event \- get or acknowledge asynchronous events
.SH "SYNOPSIS"
.nf
.B #include <infiniband/verbs.h>
.sp
.BI "int ibv_get_async_event(struct ibv_context " "*context" ,
.BI "                        struct ibv_async_event " "*event" );
.sp
.BI "void ibv_ack_async_event(struct ibv_async_event " "*event" );
.fi
.SH "DESCRIPTION"
.B ibv_get_async_event()
waits for the next async event of the RDMA device context
.I context
and returns it through the pointer
.I event\fR,
which is an ibv_async_event struct, as defined in <infiniband/verbs.h>.
.PP
.nf
struct ibv_async_event {
.in +8
union {
.in +8
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 */
int             port_num;       /* port number that got the event */
.in -8
} element;
enum ibv_event_type     event_type;     /* type of the event */
.in -8
};
.fi
.PP
One member of the element union will be valid, depending on the
event_type member of the structure.  event_type will be one of the
following events:
.PP
.I QP events:
.TP
.B IBV_EVENT_QP_FATAL \fR Error occurred on a QP and it transitioned to error state
.TP
.B IBV_EVENT_QP_REQ_ERR \fR Invalid Request Local Work Queue Error
.TP
.B IBV_EVENT_QP_ACCESS_ERR \fR Local access violation error
.TP
.B IBV_EVENT_COMM_EST \fR Communication was established on a QP
.TP
.B IBV_EVENT_SQ_DRAINED \fR Send Queue was drained of outstanding messages in progress 
.TP
.B IBV_EVENT_PATH_MIG \fR A connection has migrated to the alternate path
.TP
.B IBV_EVENT_PATH_MIG_ERR \fR A connection failed to migrate to the alternate path
.TP
.B IBV_EVENT_QP_LAST_WQE_REACHED \fR Last WQE Reached on a QP associated with an SRQ
.PP
.I CQ events:
.TP
.B IBV_EVENT_CQ_ERR \fR CQ is in error (CQ overrun)
.PP
.I SRQ events:
.TP
.B IBV_EVENT_SRQ_ERR \fR Error occurred on an SRQ
.TP
.B IBV_EVENT_SRQ_LIMIT_REACHED \fR SRQ limit was reached
.PP
.I Port events:
.TP
.B IBV_EVENT_PORT_ACTIVE \fR Link became active on a port
.TP
.B IBV_EVENT_PORT_ERR \fR Link became unavailable on a port
.TP
.B IBV_EVENT_LID_CHANGE \fR LID was changed on a port
.TP
.B IBV_EVENT_PKEY_CHANGE \fR P_Key table was changed on a port
.TP
.B IBV_EVENT_SM_CHANGE \fR SM was changed on a port
.TP
.B IBV_EVENT_CLIENT_REREGISTER \fR SM sent a CLIENT_REREGISTER request to a port
.TP
.B IBV_EVENT_GID_CHANGE \fR GID table was changed on a port
.PP
.I CA events:
.TP
.B IBV_EVENT_DEVICE_FATAL \fR CA is in FATAL state
.PP
.B ibv_ack_async_event()
acknowledge the async event
.I event\fR.
.SH "RETURN VALUE"
.B ibv_get_async_event()
returns 0 on success, and \-1 on error.
.PP
.B ibv_ack_async_event()
returns no value.
.SH "NOTES"
All async events that
.B ibv_get_async_event()
returns must be acknowledged using
.B ibv_ack_async_event()\fR.
To avoid races, destroying an object (CQ, SRQ or QP) will wait for all
affiliated events for the object to be acknowledged; this avoids an
application retrieving an affiliated event after the corresponding
object has already been destroyed.
.PP
.B ibv_get_async_event()
is a blocking function.  If multiple threads call this function
simultaneously, then when an async event occurs, only one thread will
receive it, and it is not possible to predict which thread will
receive it.
.SH "EXAMPLES"
The following code example demonstrates one possible way to work with async events in non-blocking mode.
It performs the following steps:
.PP
1. Set the async events queue work mode to be non-blocked
.br
2. Poll the queue until it has an async event
.br
3. Get the async event and ack it
.PP
.nf
/* 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\en");
        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\en");
        return 1;
}

/* Get the async event */
if (ibv_get_async_event(ctx, &async_event)) {
        fprintf(stderr, "Failed to get async_event\en");
        return 1;
}

/* Ack the event */
ibv_ack_async_event(&async_event);

.fi
.SH "SEE ALSO"
.BR ibv_open_device (3)
.SH "AUTHORS"
.TP
Dotan Barak <dotanba@gmail.com>
