repository: /home/avi/kvm branch: (no branch) commit 8fb5a89225b719f27db0cd782e0880ab70732f16 Author: Izik Eidus <[EMAIL PROTECTED]> Date: Wed Nov 7 19:00:40 2007 +0200
kvm: libkvm: merge the old save params functions with memslot tracking it is important for userspace memory allocation migration as well as other stuff. Signed-off-by: Izik Eidus <[EMAIL PROTECTED]> diff --git a/libkvm/kvm-common.h b/libkvm/kvm-common.h index 625860e..bb54e44 100644 --- a/libkvm/kvm-common.h +++ b/libkvm/kvm-common.h @@ -57,12 +57,6 @@ void register_slot(int slot, unsigned long phys_addr, unsigned long len, int user_alloc, unsigned long userspace_addr); void free_slot(int slot); int get_slot(unsigned long phys_addr); -void kvm_memory_region_save_params(kvm_context_t kvm, - struct kvm_memory_region *mem); -void kvm_userspace_memory_region_save_params(kvm_context_t kvm, - struct kvm_userspace_memory_region *mem); -void kvm_memory_region_clear_params(kvm_context_t kvm, int regnum); - int kvm_arch_create(kvm_context_t kvm, unsigned long phys_mem_bytes, void **vm_mem); int kvm_arch_create_default_phys_mem(kvm_context_t kvm, diff --git a/libkvm/libkvm-x86.c b/libkvm/libkvm-x86.c index 5593e97..00b2cb2 100644 --- a/libkvm/libkvm-x86.c +++ b/libkvm/libkvm-x86.c @@ -82,12 +82,6 @@ int kvm_alloc_kernel_memory(kvm_context_t kvm, unsigned long memory, above_4g_memory.memory_size, 0, 0); } - kvm_memory_region_save_params(kvm, &low_memory); - kvm_memory_region_save_params(kvm, &extended_memory); - kvm_memory_region_save_params(kvm, &above_4g_memory); - if (above_4g_memory.memory_size) - kvm_memory_region_save_params(kvm, &above_4g_memory); - *vm_mem = mmap(NULL, memory, PROT_READ|PROT_WRITE, MAP_SHARED, kvm->vm_fd, 0); return 0; @@ -191,11 +185,6 @@ int kvm_alloc_userspace_memory(kvm_context_t kvm, unsigned long memory, above_4g_memory.userspace_addr); } - kvm_userspace_memory_region_save_params(kvm, &low_memory); - kvm_userspace_memory_region_save_params(kvm, &extended_memory); - if (above_4g_memory.memory_size) - kvm_userspace_memory_region_save_params(kvm, &above_4g_memory); - return 0; } @@ -292,7 +281,6 @@ void *kvm_create_kernel_phys_mem(kvm_context_t kvm, unsigned long phys_start, } register_slot(memory.slot, memory.guest_phys_addr, memory.memory_size, 0, 0); - kvm_memory_region_save_params(kvm, &memory); if (writable) prot |= PROT_WRITE; diff --git a/libkvm/libkvm.c b/libkvm/libkvm.c index 564d17f..a365aeb 100644 --- a/libkvm/libkvm.c +++ b/libkvm/libkvm.c @@ -113,67 +113,43 @@ int get_slot(unsigned long phys_addr) return -1; } -/* - * memory regions parameters - */ -void kvm_memory_region_save_params(kvm_context_t kvm, - struct kvm_memory_region *mem) -{ - if (!mem || (mem->slot >= KVM_MAX_NUM_MEM_REGIONS)) { - fprintf(stderr, "BUG: %s: invalid parameters\n", __FUNCTION__); - return; - } - kvm->mem_regions[mem->slot] = *mem; -} - -#ifdef KVM_CAP_USER_MEMORY - -void kvm_userspace_memory_region_save_params(kvm_context_t kvm, - struct kvm_userspace_memory_region *mem) -{ - struct kvm_memory_region kvm_mem; - - kvm_mem.slot = mem->slot; - kvm_mem.memory_size = mem->memory_size; - kvm_mem.guest_phys_addr = mem->guest_phys_addr; - - kvm_memory_region_save_params(kvm, &kvm_mem); -} - -#endif - -void kvm_memory_region_clear_params(kvm_context_t kvm, int regnum) -{ - if (regnum >= KVM_MAX_NUM_MEM_REGIONS) { - fprintf(stderr, "BUG: %s: invalid parameters\n", __FUNCTION__); - return; - } - kvm->mem_regions[regnum].memory_size = 0; -} - /* * dirty pages logging control */ -static int kvm_dirty_pages_log_change(kvm_context_t kvm, int regnum, __u32 flag) +static int kvm_dirty_pages_log_change(kvm_context_t kvm, unsigned long phys_addr + , __u32 flag) { int r; - struct kvm_memory_region *mem; + int slot; - if (regnum >= KVM_MAX_NUM_MEM_REGIONS) { + slot = get_slot(phys_addr); + if (slot == -1) { fprintf(stderr, "BUG: %s: invalid parameters\n", __FUNCTION__); return 1; } - mem = &kvm->mem_regions[regnum]; - if (mem->memory_size == 0) /* not used */ - return 0; - if (mem->flags & KVM_MEM_LOG_DIRTY_PAGES) /* log already enabled */ - return 0; - mem->flags |= flag; /* temporary turn on flag */ - r = ioctl(kvm->vm_fd, KVM_SET_MEMORY_REGION, mem); - mem->flags &= ~flag; /* back to previous value */ - if (r == -1) { - fprintf(stderr, "%s: %m\n", __FUNCTION__); +#ifdef KVM_CAP_USER_MEMORY + if (slots[slot].user_alloc) { + struct kvm_userspace_memory_region mem = { + .slot = slot, + .memory_size = slots[slot].len, + .guest_phys_addr = slots[slot].phys_addr, + .userspace_addr = slots[slot].userspace_addr, + .flags = flag, + }; + r = ioctl(kvm->vm_fd, KVM_SET_USER_MEMORY_REGION, &mem); + } +#endif + if (!slots[slot].user_alloc) { + struct kvm_memory_region mem = { + .slot = slot, + .memory_size = slots[slot].len, + .guest_phys_addr = slots[slot].phys_addr, + .flags = flag, + }; + r = ioctl(kvm->vm_fd, KVM_SET_MEMORY_REGION, &mem); } + if (r == -1) + fprintf(stderr, "%s: %m\n", __FUNCTION__); return r; } @@ -182,7 +158,9 @@ static int kvm_dirty_pages_log_change_all(kvm_context_t kvm, __u32 flag) int i, r; for (i=r=0; i<KVM_MAX_NUM_MEM_REGIONS && r==0; i++) { - r = kvm_dirty_pages_log_change(kvm, i, flag); + if (slots[i].len) + r = kvm_dirty_pages_log_change(kvm, slots[i].phys_addr, + flag); } return r; } @@ -451,8 +429,6 @@ void *kvm_create_userspace_phys_mem(kvm_context_t kvm, unsigned long phys_start, register_slot(memory.slot, memory.guest_phys_addr, memory.memory_size, 1, memory.userspace_addr); - kvm_userspace_memory_region_save_params(kvm, &memory); - return ptr; } @@ -498,8 +474,6 @@ int kvm_register_userspace_phys_mem(kvm_context_t kvm, } register_slot(memory.slot, memory.guest_phys_addr, memory.memory_size, 1, memory.userspace_addr); - - kvm_userspace_memory_region_save_params(kvm, &memory); return 0; #else return -ENOSYS; ------------------------------------------------------------------------- This SF.net email is sponsored by: Splunk Inc. Still grepping through log files to find problems? Stop. Now Search log events and configuration files using AJAX and a browser. Download your FREE copy of Splunk now >> http://get.splunk.com/ _______________________________________________ kvm-commits mailing list kvm-commits@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/kvm-commits