accel/kvm/kvm-all: Fix wrong return code handling in dirty log code
The kvm_vm_ioctl() wrapper already returns -errno if the ioctl itself returned -1, so the callers of kvm_vm_ioctl() should not check for -1 but for a value < 0 instead. This problem has been fixed once already in commitb533f658a9
but that commit missed that the ENOENT error code is not fatal for this ioctl, so the commit has been reverted in commit50212d6346
since the problem occurred close to a pending release at that point in time. The plan was to fix it properly after the release, but it seems like this has been forgotten. So let's do it now finally instead. Resolves: https://bugs.launchpad.net/qemu/+bug/1294227 Signed-off-by: Thomas Huth <thuth@redhat.com> Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com> Message-Id: <20210129084354.42928-1-thuth@redhat.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
c2651c0eaa
commit
38e0b7904e
@ -644,16 +644,19 @@ static int kvm_physical_sync_dirty_bitmap(KVMMemoryListener *kml,
|
|||||||
|
|
||||||
d.dirty_bitmap = mem->dirty_bmap;
|
d.dirty_bitmap = mem->dirty_bmap;
|
||||||
d.slot = mem->slot | (kml->as_id << 16);
|
d.slot = mem->slot | (kml->as_id << 16);
|
||||||
if (kvm_vm_ioctl(s, KVM_GET_DIRTY_LOG, &d) == -1) {
|
ret = kvm_vm_ioctl(s, KVM_GET_DIRTY_LOG, &d);
|
||||||
DPRINTF("ioctl failed %d\n", errno);
|
if (ret == -ENOENT) {
|
||||||
ret = -1;
|
/* kernel does not have dirty bitmap in this slot */
|
||||||
|
ret = 0;
|
||||||
|
} else if (ret < 0) {
|
||||||
|
error_report("ioctl KVM_GET_DIRTY_LOG failed: %d", errno);
|
||||||
goto out;
|
goto out;
|
||||||
|
} else {
|
||||||
|
subsection.offset_within_region += slot_offset;
|
||||||
|
subsection.size = int128_make64(slot_size);
|
||||||
|
kvm_get_dirty_pages_log_range(&subsection, d.dirty_bitmap);
|
||||||
}
|
}
|
||||||
|
|
||||||
subsection.offset_within_region += slot_offset;
|
|
||||||
subsection.size = int128_make64(slot_size);
|
|
||||||
kvm_get_dirty_pages_log_range(&subsection, d.dirty_bitmap);
|
|
||||||
|
|
||||||
slot_offset += slot_size;
|
slot_offset += slot_size;
|
||||||
start_addr += slot_size;
|
start_addr += slot_size;
|
||||||
size -= slot_size;
|
size -= slot_size;
|
||||||
@ -750,8 +753,8 @@ static int kvm_log_clear_one_slot(KVMSlot *mem, int as_id, uint64_t start,
|
|||||||
d.num_pages = bmap_npages;
|
d.num_pages = bmap_npages;
|
||||||
d.slot = mem->slot | (as_id << 16);
|
d.slot = mem->slot | (as_id << 16);
|
||||||
|
|
||||||
if (kvm_vm_ioctl(s, KVM_CLEAR_DIRTY_LOG, &d) == -1) {
|
ret = kvm_vm_ioctl(s, KVM_CLEAR_DIRTY_LOG, &d);
|
||||||
ret = -errno;
|
if (ret < 0 && ret != -ENOENT) {
|
||||||
error_report("%s: KVM_CLEAR_DIRTY_LOG failed, slot=%d, "
|
error_report("%s: KVM_CLEAR_DIRTY_LOG failed, slot=%d, "
|
||||||
"start=0x%"PRIx64", size=0x%"PRIx32", errno=%d",
|
"start=0x%"PRIx64", size=0x%"PRIx32", errno=%d",
|
||||||
__func__, d.slot, (uint64_t)d.first_page,
|
__func__, d.slot, (uint64_t)d.first_page,
|
||||||
|
Loading…
Reference in New Issue
Block a user