Currently memory attribute conversions are followed up by other bookkeeping tasks like discarding unused memory or issuing iommufd notifications. Move these tasks to a separate post-conversions helper to better compartmentalize and track these tasks, and in doing so lay the groundwork for a pre-conversion helper which will be needed in the future.
Signed-off-by: Michael Roth <[email protected]> --- accel/kvm/kvm-all.c | 30 +++++++++++++++++++++--------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/accel/kvm/kvm-all.c b/accel/kvm/kvm-all.c index a1832712a4..0e6ff2de4b 100644 --- a/accel/kvm/kvm-all.c +++ b/accel/kvm/kvm-all.c @@ -3445,20 +3445,26 @@ static int kvm_convert_section(MemoryRegionSection *section, bool to_private) { hwaddr start = section->offset_within_address_space; hwaddr size = int128_get64(section->size); - MemoryRegion *mr = section->mr; - ram_addr_t offset; - RAMBlock *rb; - void *addr; - int ret = -EINVAL; + int ret; if (to_private) { ret = kvm_set_memory_attributes_private(start, size); } else { ret = kvm_set_memory_attributes_shared(start, size); } - if (ret) { - return ret; - } + + return ret; +} + +static int kvm_post_convert_section(MemoryRegionSection *section, bool to_private) +{ + hwaddr start = section->offset_within_address_space; + hwaddr size = int128_get64(section->size); + MemoryRegion *mr = section->mr; + ram_addr_t offset; + RAMBlock *rb; + void *addr; + int ret; addr = memory_region_get_ram_ptr(mr) + section->offset_within_region; rb = qemu_ram_block_from_host(addr, false, &offset); @@ -3485,7 +3491,7 @@ static int kvm_convert_section(MemoryRegionSection *section, bool to_private) ret = ram_block_discard_guest_memfd_range(rb, offset, size); } - return ret; + return 0; } int kvm_convert_memory(hwaddr start, hwaddr size, bool to_private) @@ -3533,6 +3539,12 @@ int kvm_convert_memory(hwaddr start, hwaddr size, bool to_private) } ret = kvm_convert_section(§ion, to_private); + if (ret) { + memory_region_unref(section.mr); + break; + } + + ret = kvm_post_convert_section(§ion, to_private); memory_region_unref(section.mr); if (ret) { -- 2.43.0
