Originally, when log_clear gets called, log_clear calls hvf_set_dirty_tracking to write-protect memory slots whose dirty-bits are cleared.
Calling hvf_set_dirty_tracking means that memory slots will be look up and the lock for memory slots will be held during the call. We can use the parameter `section` passed by the caller to determine the pages that need to be write-protected. Compared to the original method, this saves time. Moreover, this makes only pages whose dirty-bits are cleared write-protected instead of making the whole memory slot write-protected. Signed-off-by: Yan-Jie Wang <ubz...@gmail.com> --- accel/hvf/hvf-mem.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/accel/hvf/hvf-mem.c b/accel/hvf/hvf-mem.c index b215386bc8..7a588b70e1 100644 --- a/accel/hvf/hvf-mem.c +++ b/accel/hvf/hvf-mem.c @@ -84,7 +84,10 @@ static hwaddr hvf_align_section(MemoryRegionSection *section, size = (size - _delta) & qemu_real_host_page_mask; *start = _start; - *delta = _delta; + + if (delta) { + *delta = _delta; + } return size; } @@ -229,11 +232,21 @@ static void hvf_log_stop(MemoryListener *listener, static void hvf_log_clear(MemoryListener *listener, MemoryRegionSection *section) { + hwaddr start, size; + + if (!memory_region_is_ram(section->mr) || memory_region_is_rom(section)) { + /* do not consider memory regions which are not directly writeable */ + return; + } + /* * The dirty bits are being cleared. * Make the section write-protected again. */ - hvf_set_dirty_tracking(section, 1); + size = hvf_align_section(section, &start, NULL); + if (size) { + hv_vm_protect(start, size, HV_MEMORY_READ | HV_MEMORY_EXEC); + } } static void hvf_region_add(MemoryListener *listener, -- 2.32.0 (Apple Git-132)