Message ID | 20191024142658.22306-2-kwolf@redhat.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | qcow2: Fix image corruption bug in 4.1 | expand |
24.10.2019 17:26, Kevin Wolf wrote: > Some functions require that the caller holds a certain CoMutex for them > to operate correctly. Add a function so that they can assert the lock is > really held. > > Cc: qemu-stable@nongnu.org > Signed-off-by: Kevin Wolf <kwolf@redhat.com> Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com> > --- > include/qemu/coroutine.h | 15 +++++++++++++++ > 1 file changed, 15 insertions(+) > > diff --git a/include/qemu/coroutine.h b/include/qemu/coroutine.h > index 9801e7f5a4..f4843b5f59 100644 > --- a/include/qemu/coroutine.h > +++ b/include/qemu/coroutine.h > @@ -167,6 +167,21 @@ void coroutine_fn qemu_co_mutex_lock(CoMutex *mutex); > */ > void coroutine_fn qemu_co_mutex_unlock(CoMutex *mutex); > > +/** > + * Assert that the current coroutine holds @mutex. > + */ > +static inline coroutine_fn void qemu_co_mutex_assert_locked(CoMutex *mutex) > +{ > + /* > + * mutex->holder doesn't need any synchronisation if the assertion holds > + * true because the mutex protects it. If it doesn't hold true, we still > + * don't mind if another thread takes or releases mutex behind our back, > + * because the condition will be false no matter whether we read NULL or > + * the pointer for any other coroutine. > + */ > + assert(atomic_read(&mutex->locked) && > + mutex->holder == qemu_coroutine_self()); > +} > > /** > * CoQueues are a mechanism to queue coroutines in order to continue executing >
On 10/24/19 6:35 PM, Vladimir Sementsov-Ogievskiy wrote: > 24.10.2019 17:26, Kevin Wolf wrote: >> Some functions require that the caller holds a certain CoMutex for them >> to operate correctly. Add a function so that they can assert the lock is >> really held. >> >> Cc: qemu-stable@nongnu.org >> Signed-off-by: Kevin Wolf <kwolf@redhat.com> > Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com> Reviewed-by: Denis V. Lunev <den@openvz.org>
diff --git a/include/qemu/coroutine.h b/include/qemu/coroutine.h index 9801e7f5a4..f4843b5f59 100644 --- a/include/qemu/coroutine.h +++ b/include/qemu/coroutine.h @@ -167,6 +167,21 @@ void coroutine_fn qemu_co_mutex_lock(CoMutex *mutex); */ void coroutine_fn qemu_co_mutex_unlock(CoMutex *mutex); +/** + * Assert that the current coroutine holds @mutex. + */ +static inline coroutine_fn void qemu_co_mutex_assert_locked(CoMutex *mutex) +{ + /* + * mutex->holder doesn't need any synchronisation if the assertion holds + * true because the mutex protects it. If it doesn't hold true, we still + * don't mind if another thread takes or releases mutex behind our back, + * because the condition will be false no matter whether we read NULL or + * the pointer for any other coroutine. + */ + assert(atomic_read(&mutex->locked) && + mutex->holder == qemu_coroutine_self()); +} /** * CoQueues are a mechanism to queue coroutines in order to continue executing
Some functions require that the caller holds a certain CoMutex for them to operate correctly. Add a function so that they can assert the lock is really held. Cc: qemu-stable@nongnu.org Signed-off-by: Kevin Wolf <kwolf@redhat.com> --- include/qemu/coroutine.h | 15 +++++++++++++++ 1 file changed, 15 insertions(+)