Hello,
"Jean-Yves Migeon" <[email protected]> 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