On Mon, Mar 09, 2020 at 06:25:29PM -0400, Peter Xu wrote: > +void *vcpu_map_dirty_ring(struct kvm_vm *vm, uint32_t vcpuid) > +{ > + struct vcpu *vcpu; > + uint32_t size = vm->dirty_ring_size; > + > + TEST_ASSERT(size > 0, "Should enable dirty ring first"); > + > + vcpu = vcpu_find(vm, vcpuid); > + > + TEST_ASSERT(vcpu, "Cannot find vcpu %u", vcpuid); > + > + if (!vcpu->dirty_gfns) { > + void *addr; > + > + addr = mmap(NULL, size, PROT_READ, > + MAP_PRIVATE, vcpu->fd, > + vm->page_size * KVM_DIRTY_LOG_PAGE_OFFSET); > + TEST_ASSERT(addr == MAP_FAILED, "Dirty ring mapped private"); > + > + addr = mmap(NULL, size, PROT_READ | PROT_EXEC, > + MAP_PRIVATE, vcpu->fd, > + vm->page_size * KVM_DIRTY_LOG_PAGE_OFFSET); > + TEST_ASSERT(addr == MAP_FAILED, "Dirty ring mapped exec"); > + > + addr = mmap(NULL, size, PROT_READ | PROT_WRITE, > + MAP_SHARED, vcpu->fd, > + vm->page_size * KVM_DIRTY_LOG_PAGE_OFFSET); No TEST_ASSERT for this mmap? > + > + vcpu->dirty_gfns = addr; > + vcpu->dirty_gfns_count = size / sizeof(struct kvm_dirty_gfn); > + } > + > + return vcpu->dirty_gfns; > +}