repository: /home/avi/kvm
branch: (no branch)
commit e3a7b2bdd824a38ceb4d1853b871628283593fdb
Author: Izik Eidus <[EMAIL PROTECTED]>
Date:   Wed Nov 7 19:00:40 2007 +0200

    this merge the old save params functions with the new tracking
    mechanisem,
    
    (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

Reply via email to