On 15.05.2011 21:11, Mindaugas Rasiukevicius wrote: > This is not correct. Atomic op might decrease the reference count to > 1 while other thread executes xbdi_put() before xbdi_refcnt is fetched, > thus decreasing it to 0. In such case, both threads would fetch 0. > > The following is a correct way: > > if (atomic_dec_uint_nv(&xbdip->xbdi_refcnt) == 0) > xbdback_finish_disconnect(xbdip); > > Also, it seems there is no need for xbdi_refcnt to be volatile.
Good point; I was pondering about the _nv() version when I made the change, but forgot about the possible concurrency regarding refcnt fetch (not actually possible as port-xen is not MP, but will become soonish) I'll remove the volatile declaration too, only xbdi_put/_get use the refcnt for G/C anyway. Thanks for pointing that out! -- Jean-Yves Migeon jeanyves.mig...@free.fr