Hi there,

I am reading the snapshot source code of qemu-kvm-0.12.3, and am
puzzled by the thread synchronization issue in qcow2.c and
qcow2-cluster.c. Could someone please enlighten me? Thanks!

Specifically, I found that BDRVQcowState.cluster_allocs, which is a
QLIST_HEAD, may be accessed concurrently by two threads, but I did not
see how the two thread properly synchronize with each other to avoid
race conditions. I profiled all executions of
qemu_mutex_lock_iothread(), and found that
it only protects the vl.c:main_loop_wai() thread but does NOT protect
the qemu-kvm.c:kvm_cpu_exec() thread. Did I miss something or is this
a defect?  Note that qemu-kvm.c:kvm_cpu_exec() is
executed, instead of kvm-all.c:kvm_cpu_exec(). Please
see below for more details.

Here is an example of how two threads may reach qcow2.

Stack trace of thread 1:
main -> main_loop -> kvm_main_loop -> main_loop_wait -> posix_aio_read
-> posix_aio_process_queue -> qcow_aio_write_cb ->
qcow2_alloc_cluster_offset (which may modify
BDRVQcowState.cluster_allocs)

Stack trace of thread 2:
ap_main_loop -> ... -> kvm_handle_io -> ... -> qcow_aio_writev ->
qcow_aio_write_cb -> qcow2_alloc_cluster_offset (which may modify
BDRVQcowState.cluster_allocs)

Here is the trace showing that
qemu_mutex_lock_iothread() does not protect the thread
that executes. kvm_cpu_exec()->...->qcow_aio_write_cb().

home/ctang/kvm/qemu-kvm-0.12.3/qemu-kvm.c : 2530    thread: b7e056d0
       /home/ctang/kvm/bin/qemu-system-x86_64(qemu_mutex_unlock_iothread+0x1a)
[0x8092242]
       /home/ctang/kvm/bin/qemu-system-x86_64(main_loop_wait+0x221) [0x806edef]
       /home/ctang/kvm/bin/qemu-system-x86_64(kvm_main_loop+0x1ff) [0x80916a1]
       /home/ctang/kvm/bin/qemu-system-x86_64 [0x806f5c2]
       /home/ctang/kvm/bin/qemu-system-x86_64(main+0x2e2c) [0x80736d1]
       /lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xe5) [0xb7e33775]
       /home/ctang/kvm/bin/qemu-system-x86_64 [0x8068bb1]

block/qcow2-cluster.c : 721    thread: b7dc2b90
       /home/ctang/kvm/bin/qemu-system-x86_64(qcow2_alloc_cluster_offset+0x3c)
[0x81175fa]
       /home/ctang/kvm/bin/qemu-system-x86_64(qcow_aio_write_cb+0x158)
[0x8111d73]
       /home/ctang/kvm/bin/qemu-system-x86_64(qcow_aio_writev+0x94) [0x8112054]
       /home/ctang/kvm/bin/qemu-system-x86_64(bdrv_aio_writev+0xe1) [0x80fa8e9]
       /home/ctang/kvm/bin/qemu-system-x86_64 [0x81f4a96]
       /home/ctang/kvm/bin/qemu-system-x86_64 [0x81f4c04]
       /home/ctang/kvm/bin/qemu-system-x86_64(dma_bdrv_write+0x48) [0x81f4cbf]
       /home/ctang/kvm/bin/qemu-system-x86_64 [0x80a437c]
       /home/ctang/kvm/bin/qemu-system-x86_64(bmdma_cmd_writeb+0x73)
[0x80a9503]
       /home/ctang/kvm/bin/qemu-system-x86_64 [0x812b1eb]
       /home/ctang/kvm/bin/qemu-system-x86_64(cpu_outb+0x27) [0x812b4e6]
       /home/ctang/kvm/bin/qemu-system-x86_64 [0x808d267]
       /home/ctang/kvm/bin/qemu-system-x86_64(kvm_run+0x2f4) [0x808f4b8]
       /home/ctang/kvm/bin/qemu-system-x86_64(kvm_cpu_exec+0x56) [0x80907b2]
       /home/ctang/kvm/bin/qemu-system-x86_64 [0x8090f4d]
       /home/ctang/kvm/bin/qemu-system-x86_64 [0x8091098]
       /lib/tls/i686/cmov/libpthread.so.0 [0xb7fd24ff]
       /lib/tls/i686/cmov/libc.so.6(clone+0x5e) [0xb7f0149e]

/home/ctang/kvm/qemu-kvm-0.12.3/qemu-kvm.c : 2537    thread: b7e056d0
       /home/ctang/kvm/bin/qemu-system-x86_64(qemu_mutex_lock_iothread+0x1a)
[0x809229d]
       /home/ctang/kvm/bin/qemu-system-x86_64(main_loop_wait+0x25c) [0x806ee2a]
       /home/ctang/kvm/bin/qemu-system-x86_64(kvm_main_loop+0x1ff) [0x80916a1]
       /home/ctang/kvm/bin/qemu-system-x86_64 [0x806f5c2]
       /home/ctang/kvm/bin/qemu-system-x86_64(main+0x2e2c) [0x80736d1]
       /lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xe5) [0xb7e33775]
       /home/ctang/kvm/bin/qemu-system-x86_64 [0x8068bb1]

-- 
Regards,
Chunqiang Tang
--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to