qemu with hax to log dma reads & writes jcs.org/2018/11/12/vfio

colo: fix return without releasing RCU

Use WITH_RCU_READ_LOCK_GUARD to avoid exiting colo_init_ram_cache
without releasing RCU.

Cc: Dr. David Alan Gilbert <dgilbert@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>

+17 -16
+17 -16
migration/ram.c
··· 3890 3890 { 3891 3891 RAMBlock *block; 3892 3892 3893 - rcu_read_lock(); 3894 - RAMBLOCK_FOREACH_NOT_IGNORED(block) { 3895 - block->colo_cache = qemu_anon_ram_alloc(block->used_length, 3896 - NULL, 3897 - false); 3898 - if (!block->colo_cache) { 3899 - error_report("%s: Can't alloc memory for COLO cache of block %s," 3900 - "size 0x" RAM_ADDR_FMT, __func__, block->idstr, 3901 - block->used_length); 3902 - RAMBLOCK_FOREACH_NOT_IGNORED(block) { 3903 - if (block->colo_cache) { 3904 - qemu_anon_ram_free(block->colo_cache, block->used_length); 3905 - block->colo_cache = NULL; 3893 + WITH_RCU_READ_LOCK_GUARD() { 3894 + RAMBLOCK_FOREACH_NOT_IGNORED(block) { 3895 + block->colo_cache = qemu_anon_ram_alloc(block->used_length, 3896 + NULL, 3897 + false); 3898 + if (!block->colo_cache) { 3899 + error_report("%s: Can't alloc memory for COLO cache of block %s," 3900 + "size 0x" RAM_ADDR_FMT, __func__, block->idstr, 3901 + block->used_length); 3902 + RAMBLOCK_FOREACH_NOT_IGNORED(block) { 3903 + if (block->colo_cache) { 3904 + qemu_anon_ram_free(block->colo_cache, block->used_length); 3905 + block->colo_cache = NULL; 3906 + } 3906 3907 } 3908 + return -errno; 3907 3909 } 3908 - return -errno; 3910 + memcpy(block->colo_cache, block->host, block->used_length); 3909 3911 } 3910 - memcpy(block->colo_cache, block->host, block->used_length); 3911 3912 } 3912 - rcu_read_unlock(); 3913 + 3913 3914 /* 3914 3915 * Record the dirty pages that sent by PVM, we use this dirty bitmap together 3915 3916 * with to decide which page in cache should be flushed into SVM's RAM. Here