On Sun, 24 Oct 2004 13:38:01 -0400
Hal Rosenstock <[EMAIL PROTECTED]> wrote:

> ib_mad: In ib_mad_complete_recv, decrement agent reference count when
> receive is not fully reassembled, and also when solicited and no
> matching request is found. This allows deregistration to complete rather
> than waiting for an event which never occurs.
> ... 
>       /* Fully reassemble receive before processing */
>       recv = reassemble_recv(mad_agent_priv, recv);
> -     if (!recv)
> +     if (!recv) {
> +             atomic_dec(&mad_agent_priv->refcount);
>               return;
> +     }

I'm not sure about this.  If we just start assembling a MAD, we're probably going to 
want to maintain a reference on the MAD agent while the reassembly is occurring, in 
order to handle timeouts.  We'll have a better idea of what the RMPP code will do once 
it's actually written however, so that reference could be a different one.  If we do 
keep this code, it should probably be an atomic_dec_and_test, followed by a wake_up.

>       /* Complete corresponding request */
>       if (solicited) {
> @@ -884,6 +886,7 @@
>               if (!mad_send_wr) {
>                       spin_unlock_irqrestore(&mad_agent_priv->lock, flags);
>                       ib_free_recv_mad(&recv->header.recv_wc);
> +                     atomic_dec(&mad_agent_priv->refcount);
>                       return;

I think that we want this to be atomic_dec_and_test().  (Similar to the call near the 
end of this function.)  If a match is found, we can get away with a simple atomic_dec, 
since the send will still hold a reference on the mad agent.  But if no match is 
found, then I think this may be the last reference being held.
_______________________________________________
openib-general mailing list
[EMAIL PROTECTED]
http://openib.org/mailman/listinfo/openib-general

To unsubscribe, please visit http://openib.org/mailman/listinfo/openib-general

Reply via email to