[openib-general] [PATCH fixed] was Re: [PATCH] ipoib_multicast/ipoib_mcast_send race

Krishna Kumar2 krkumar2 at in.ibm.com
Mon Dec 12 02:52:13 PST 2005


Hi Michael,

I see what you are doing with that lock :-) But isn't the lock a hack ? 
Eg, I could instead
do this (If I can make sure the redundant lock/unlock is not optimized 
out) and it would
still work :

stop_thread()
{
        clear_bit();
        lock(); /* empty lock/unlock to synchronize with the mcast_send() 
*/
        unlock(); /* make the other routine FINISH before we start other 
activity */
        ...
        ...
}
mcast_send()
{
        lock();
        if (test_bit)
        ...
        ...
        unlock();
}

So basically, the lock is not required for clearing (and absolutely not 
required for
setting) the bit, but a lock is required before we start waiting, to 
enable us to
synchronize with any sends. The lock is being used as a signalling 
mechanism
between two processes (in this case, lock/unlock is a mechanism for the 
mcast_send()
to finish if running).

Thanks,

- KK
 
"Michael S. Tsirkin" <mst at mellanox.co.il> wrote on 12/12/2005 12:26:23 PM:

> Quoting r. Krishna Kumar2 <krkumar2 at in.ibm.com>:
> > Isn't all that managed by clearing/testing the bit ? Because holding 
the
> > lock doesn't solve 
> > it.
> > To give an example : 
> > 
> > stop_thread() 
> > { 
> >         lock(); 
> >         clear(); 
> >         unlock(); 
> >         ... 
> >         wait_for_completion(mcast); 
> > } 
> > 
> > mcast_send() 
> > { 
> >         lock(); 
> >         test(); 
> >         results_in_creation_of_entries_done_etc();; 
> >         unlock(); 
> > } 
> > 
> > In this case, if mcast_send() gets the lock first and proceeds while 
the
> > stop_thread is spinning 
> > on the lock, the entries are created and then the stop_thread() clears
> > the bit and at this point 
> > in time, no more entries can be ever created. Now if the lock were
> > removed, the behavior 
> > is identical - the mcast_send() would test the bit, and get the lock()
> > while the stop_thread() 
> > clears the bit (without a lock) and waits for completion, while *no
> > more* mcast_sends() would 
> > ever continue beyond this time. 
> 
> Now mcast_send can call init_completion *after* stop_thread does wait 
for
> completion.
> It could also call list_add while mcast_stop_thread walks the list.
> 
> Thats what I am trying to prevent.
> 
> 
> -- 
> MST
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.openfabrics.org/pipermail/general/attachments/20051212/5fc33f8f/attachment.html>


More information about the general mailing list