On 27/06/2017 16:43, Vladimir Sementsov-Ogievskiy wrote: >> The write side is invoked under the 'big QEMU lock' so there cannot be >> two concurrent writes. >> >> A bitmap can be written to after bdrv_find_dirty_bitmap returns, but >> only if _you_ tell another thread about the bitmap you've just created. > > no, I'm not about touching just created bitmap. I'm about creating > bitmap with the same name by other thread (unlikely case, but possible).
You can't unless you drop the BQL. >> If that doesn't happen, the bitmap cannot change. And it can also >> disappear because _your_ thread is the one with the big QEMU lock. > > So, if I under BQL, I don't need dirty_bitmap_lock? Writing to the list requires _both_ BQL and dirty_bitmap_lock. Write functions actually have "called with BQL taken" in dirty-bitmap.c, because dirty-bitmap.c will call dirty_bitmap_lock/unlock itself. Reading from the list requires one of the two locks. Such functions have "called with BQL or dirty_bitmap lock taken". For reading/writing to the bitmap itself, you need dirty_bitmap_lock. dirty-bitmap.c can take the lock itself but, there are also functions named *_locked where the caller takes the lock. Paolo