[openib-general] [PATCH] Missing check for atomic_dec in ib_post_send_mad

Krishna Kumar krkumar at us.ibm.com
Mon Nov 1 16:12:18 PST 2004


I believe the recent changes to catch all atomic_dec races with unregister
failed to catch one spot in ib_post_send_mad. This routine increments
mad_agent_priv->refcnt, and while unregister can run, if the ib_send_mad()
fails, we drop the refcnt without checking if the refcnt has dropped to
zero. The unregister would block indefinitely waiting to be woken up. I
think the rest of the atomic_dec's looks good though.

Patch included as attachment as well as inline ...

Thanks,

- KK

diff -ruNp 1/mad.c 2/mad.c
--- 1/mad.c	2004-11-01 16:01:05.000000000 -0800
+++ 2/mad.c	2004-11-01 16:01:09.000000000 -0800
@@ -432,7 +432,8 @@ int ib_post_send_mad(struct ib_mad_agent
 			spin_unlock_irqrestore(&mad_agent_priv->lock, flags);

 			*bad_send_wr = cur_send_wr;
-			atomic_dec(&mad_agent_priv->refcount);
+			if (atomic_dec_and_test(&mad_agent_priv->refcount))
+				wake_up(&mad_agent_priv->wait);
 			return ret;
 		}
 		cur_send_wr= next_send_wr;
-------------- next part --------------
diff -ruNp 1/mad.c 2/mad.c
--- 1/mad.c	2004-11-01 16:01:05.000000000 -0800
+++ 2/mad.c	2004-11-01 16:01:09.000000000 -0800
@@ -432,7 +432,8 @@ int ib_post_send_mad(struct ib_mad_agent
 			spin_unlock_irqrestore(&mad_agent_priv->lock, flags);
 
 			*bad_send_wr = cur_send_wr;
-			atomic_dec(&mad_agent_priv->refcount);
+			if (atomic_dec_and_test(&mad_agent_priv->refcount))
+				wake_up(&mad_agent_priv->wait);
 			return ret;		
 		}
 		cur_send_wr= next_send_wr;


More information about the general mailing list