From: Uri Lublin <[EMAIL PROTECTED]> In order to be able to turn dirty page logging on/off.
Signed-off-by: Uri Lublin <[EMAIL PROTECTED]> Signed-off-by: Avi Kivity <[EMAIL PROTECTED]> diff --git a/libkvm/kvm-common.h b/libkvm/kvm-common.h index 65d137e..4ea902b 100644 --- a/libkvm/kvm-common.h +++ b/libkvm/kvm-common.h @@ -54,7 +54,8 @@ struct kvm_context { void init_slots(void); int get_free_slot(kvm_context_t kvm); void register_slot(int slot, unsigned long phys_addr, unsigned long len, - int user_alloc, unsigned long userspace_addr); + int user_alloc, unsigned long userspace_addr, unsigned flags); + void free_slot(int slot); int get_slot(unsigned long phys_addr); diff --git a/libkvm/libkvm-x86.c b/libkvm/libkvm-x86.c index 1ca6c76..ca56adb 100644 --- a/libkvm/libkvm-x86.c +++ b/libkvm/libkvm-x86.c @@ -51,7 +51,7 @@ int kvm_alloc_kernel_memory(kvm_context_t kvm, unsigned long memory, return -1; } register_slot(low_memory.slot, low_memory.guest_phys_addr, - low_memory.memory_size, 0, 0); + low_memory.memory_size, 0, 0, 0); if (extended_memory.memory_size) { @@ -66,7 +66,7 @@ int kvm_alloc_kernel_memory(kvm_context_t kvm, unsigned long memory, } register_slot(extended_memory.slot, extended_memory.guest_phys_addr, - extended_memory.memory_size, 0, 0); + extended_memory.memory_size, 0, 0, 0); } if (above_4g_memory.memory_size) { @@ -78,7 +78,7 @@ int kvm_alloc_kernel_memory(kvm_context_t kvm, unsigned long memory, } register_slot(above_4g_memory.slot, above_4g_memory.guest_phys_addr, - above_4g_memory.memory_size, 0, 0); + above_4g_memory.memory_size, 0, 0, 0); } *vm_mem = mmap(NULL, memory, PROT_READ|PROT_WRITE, MAP_SHARED, kvm->vm_fd, 0); @@ -193,7 +193,7 @@ void *kvm_create_kernel_phys_mem(kvm_context_t kvm, unsigned long phys_start, return 0; } register_slot(memory.slot, memory.guest_phys_addr, memory.memory_size, - 0, 0); + 0, 0, memory.flags); if (writable) prot |= PROT_WRITE; diff --git a/libkvm/libkvm.c b/libkvm/libkvm.c index 573a9ab..8844074 100644 --- a/libkvm/libkvm.c +++ b/libkvm/libkvm.c @@ -52,6 +52,7 @@ struct slot_info { unsigned long len; int user_alloc; unsigned long userspace_addr; + unsigned flags; }; struct slot_info slots[KVM_MAX_NUM_MEM_REGIONS]; @@ -92,12 +93,13 @@ int get_free_slot(kvm_context_t kvm) } void register_slot(int slot, unsigned long phys_addr, unsigned long len, - int user_alloc, unsigned long userspace_addr) + int user_alloc, unsigned long userspace_addr, unsigned flags) { slots[slot].phys_addr = phys_addr; slots[slot].len = len; slots[slot].user_alloc = user_alloc; slots[slot].userspace_addr = userspace_addr; + slots[slot].flags = flags; } void free_slot(int slot) @@ -142,6 +144,7 @@ static int kvm_dirty_pages_log_change(kvm_context_t kvm, unsigned long phys_addr fprintf(stderr, "BUG: %s: invalid parameters\n", __FUNCTION__); return 1; } + flag |= slots[slot].flags; #ifdef KVM_CAP_USER_MEMORY if (slots[slot].user_alloc) { struct kvm_userspace_memory_region mem = { @@ -418,7 +421,7 @@ void *kvm_create_userspace_phys_mem(kvm_context_t kvm, unsigned long phys_start, return 0; } register_slot(memory.slot, memory.guest_phys_addr, memory.memory_size, - 1, memory.userspace_addr); + 1, memory.userspace_addr, memory.flags); return ptr; } @@ -487,6 +490,7 @@ int kvm_create_mem_hole(kvm_context_t kvm, unsigned long phys_start, newslot1.memory_size = phys_start - slots[slot].phys_addr; newslot1.slot = slot; newslot1.userspace_addr = slots[slot].userspace_addr; + newslot1.flags = slots[slot].flags; newslot2.guest_phys_addr = newslot1.guest_phys_addr + newslot1.memory_size + len; @@ -495,6 +499,7 @@ int kvm_create_mem_hole(kvm_context_t kvm, unsigned long phys_start, newslot2.userspace_addr = newslot1.userspace_addr + newslot1.memory_size; newslot2.slot = get_free_slot(kvm); + newslot2.flags = newslot1.flags; r = ioctl(kvm->vm_fd, KVM_SET_USER_MEMORY_REGION, &rmslot); if (r == -1) { @@ -509,7 +514,8 @@ int kvm_create_mem_hole(kvm_context_t kvm, unsigned long phys_start, return -1; } register_slot(newslot1.slot, newslot1.guest_phys_addr, - newslot1.memory_size, 1, newslot1.userspace_addr); + newslot1.memory_size, 1, newslot1.userspace_addr, + newslot1.flags); r = ioctl(kvm->vm_fd, KVM_SET_USER_MEMORY_REGION, &newslot2); if (r == -1) { @@ -517,7 +523,8 @@ int kvm_create_mem_hole(kvm_context_t kvm, unsigned long phys_start, return -1; } register_slot(newslot2.slot, newslot2.guest_phys_addr, - newslot2.memory_size, 1, newslot2.userspace_addr); + newslot2.memory_size, 1, newslot2.userspace_addr, + newslot2.flags); #endif return 0; } @@ -526,6 +533,7 @@ int kvm_register_userspace_phys_mem(kvm_context_t kvm, unsigned long phys_start, void *userspace_addr, unsigned long len, int log) { + #ifdef KVM_CAP_USER_MEMORY struct kvm_userspace_memory_region memory = { .memory_size = len, @@ -545,7 +553,7 @@ int kvm_register_userspace_phys_mem(kvm_context_t kvm, return -1; } register_slot(memory.slot, memory.guest_phys_addr, memory.memory_size, - 1, memory.userspace_addr); + 1, memory.userspace_addr, memory.flags); return 0; #else return -ENOSYS; ------------------------------------------------------------------------- SF.Net email is sponsored by: Check out the new SourceForge.net Marketplace. It's the best place to buy or sell services for just about anything Open Source. http://sourceforge.net/services/buy/index.php _______________________________________________ kvm-commits mailing list kvm-commits@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/kvm-commits