On Tue, Mar 10, 2020 at 09:18:47AM +0100, Andrew Jones wrote: > 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? It'll be used (verified) later. :) Though never harm to add one! Thanks, > > > + > > + vcpu->dirty_gfns = addr; > > + vcpu->dirty_gfns_count = size / sizeof(struct kvm_dirty_gfn); > > + } > > + > > + return vcpu->dirty_gfns; > > +} > -- Peter Xu