[openib-general] Re: ibv_get_async_event
Caitlin Bestler
caitlinb at broadcom.com
Tue Sep 6 14:29:47 PDT 2005
I'm not sure I follow the rationale as to why acking is needed.
You're requiring a solution to a problem that most apps and
most devices do not have.
But anyway, if you *do* have an acked cq reap, you should
take advantage of it by having the cq_poll return a *pointer*
to the work completion rather than copying it to a supplied
buffer. This avoids an unecessary copy whenever the work
completion will be processed immediately or transformed
into another format (which, between them, I believe account
for most applications).
The only problem with a cq_poll routine that returns a pointer
is that it *requires* an ack call -- but if you're going to
do it anyway you might as well get the benefit of a two stage
call.
> -----Original Message-----
> From: openib-general-bounces at openib.org
> [mailto:openib-general-bounces at openib.org] On Behalf Of Roland Dreier
> Sent: Tuesday, September 06, 2005 2:23 PM
> To: Sean Hefty
> Cc: openib
> Subject: [openib-general] Re: ibv_get_async_event
>
> I thought about this some more and I came to the conclusion
> that Sean is right. We should come up with something
> race-free, even if an app is perverse enough to use multiple
> threads to read CQ events.
>
> I think the only way to do that is for the app to acknowledge
> completion events, since a completion event could be read by
> a thread that loses the CPU before returning to the app and
> then delayed for arbitrarily long before the app sees the
> event. However, it is possible to amortize the locking cost
> of acknowledging events by allowing the app to acknowledge
> multiple events in a single call.
>
> The API I came up with is the following:
>
> /**
> * ibv_ack_cq_events - Free an async event
> * @cq: CQ to acknowledge events for
> * @nevents: Number of events to acknowledge.
> *
> * All completion events which are returned by
> ibv_get_cq_event() must
> * be acknowledged. ibv_destroy_cq() will wait for all
> completion
> * events to be acknowledged, so there should be a one-to-one
> * correspondence between acks and successful gets. An
> application
> * may accumulate multiple completion events and
> acknowledge them in a
> * single call by passing the number of events to ack
> in @nevents.
> */
> extern void ibv_ack_cq_events(struct ibv_cq *cq,
> unsigned int nevents);
>
> (I also renamed ibv_put_async_event() to ibv_ack_async_event() for
> symmetry)
>
> I coded this up and did some unscientific measurements using
> ibv_rc_pingpong (using CQ events with --size=1). Even with a call to
> ibv_async_event() every time a CQ event is read, the cost is
> too small to measure. In other words, the variability from
> run to run of my test drowns out the cost of the call to
> ibv_ack_cq_events().
>
> Patches to follow...
>
> - R.
> _______________________________________________
> openib-general mailing list
> openib-general at openib.org
> http://openib.org/mailman/listinfo/openib-general
>
> To unsubscribe, please visit
> http://openib.org/mailman/listinfo/openib-general
>
>
More information about the general
mailing list