Hello, "Jean-Yves Migeon" <j...@netbsd.org> wrote: > Module Name: src > Committed By: jym > Date: Sun May 15 07:24:15 UTC 2011 > > Modified Files: > src/sys/arch/xen/xen: xbdback_xenbus.c > > Log Message: > Use atomic_ops(3) for ref counting. >
> + atomic_dec_uint(&(xbdip)->xbdi_refcnt); \ > + if (0 == (xbdip)->xbdi_refcnt) \ > xbdback_finish_disconnect(xbdip); \ 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. -- Mindaugas