[ofa-general] Re: Is ibv_get_async_event() a blocking call ?
Steve Wise
swise at opengridcomputing.com
Fri Mar 2 09:22:34 PST 2007
On Fri, 2007-03-02 at 17:07 +0000, Tang, Changqing wrote:
> Thank you very much.
>
> I wonder if libibverbs can do this way for application and make
> ibv_get_async_event() non-blocking. But I will try this way now.
>
I wonder what happens if you set the async file descriptor to
non-blocking?
Roland? Would that return EWOULDBLOCK if there are no events?
> --CQ
>
>
>
> > -----Original Message-----
> > From: Steve Wise [mailto:swise at opengridcomputing.com]
> > Sent: Friday, March 02, 2007 11:01 AM
> > To: Tang, Changqing
> > Cc: General at lists.openfabrics.org
> > Subject: Re: [ofa-general] Re: Is ibv_get_async_event() a
> > blocking call ?
> >
> > On Fri, 2007-03-02 at 10:56 -0600, Steve Wise wrote:
> > > On Fri, 2007-03-02 at 16:32 +0000, Tang, Changqing wrote:
> > > >
> > > > HI,
> > > > I did not realize that ibv_get_async_event() is a
> > blocking call, it
> > > > forces me to call it in another thread. But if I don't
> > want to use
> > > > thread in my application, how do I use this function ?
> > > >
> > > > Thanks.
> > > >
> > > > --CQ
> > >
> > > You can select() or poll() on the async file descriptor for the QP.
> > >
> > > Then you only call ibv_get_async_event() when poll/select indicates
> > > there is something to read.
> >
> > Something like this:
> >
> >
> > struct my_cxt {
> > ...
> > struct ibv_context *context;
> > struct rdma_event_channel *rch;
> > ...
> > };
> >
> > <snip>
> >
> > fds[0].fd = ctx->rch->fd;
> > fds[0].events = POLLIN|POLLERR;
> > fds[1].fd = ctx->context->async_fd;
> > fds[1].events =
> > POLLHUP|POLLNVAL|POLLPRI|POLLOUT|POLLIN|POLLERR;
> > if (poll(fds, 2, -1) == -1) {
> > perror("poll");
> > exit(1);
> > }
> > if (fds[0].revents) {
> > struct rdma_cm_event *event;
> >
> > rdma_get_cm_event(ctx->rch, &event);
> > printf("RDMA CM EVENT %d - %s!\n",
> > event->event, rdma_str_event(event));
> > rdma_ack_cm_event(event);
> > ...
> > }
> > if (fds[1].revents) {
> > struct ibv_async_event event;
> >
> > ibv_get_async_event(ctx->context, &event);
> > printf("ASYNC EVENT %d - %s!\n",
> > event.event_type, ibv_str_async_event(&event));
> > ibv_ack_async_event(&event);
> > ...
> > }
> >
> >
> >
More information about the general
mailing list