From: Glauber Costa <[EMAIL PROTECTED]>

memory holes are totally evil. Right now they work for some basic tests,
but had never been stressed enough. Using memory holes leaves open questions 
like:

* what happens if a area being registered span two slots?
* what happens if there is already data in the slots?

also, the code behaves badly if the piece to be removed lies in the boundaries 
of the
current slot. Luckily, we don't really need it. Remove it, and make sure we 
never hit it.

Signed-off-by: Glauber Costa <[EMAIL PROTECTED]>
Signed-off-by: Avi Kivity <[EMAIL PROTECTED]>

diff --git a/libkvm/libkvm.c b/libkvm/libkvm.c
index a850caa..c261053 100644
--- a/libkvm/libkvm.c
+++ b/libkvm/libkvm.c
@@ -439,74 +439,9 @@ int kvm_is_allocated_mem(kvm_context_t kvm, unsigned long 
phys_start,
        return 0;
 }
 
-int kvm_create_mem_hole(kvm_context_t kvm, unsigned long phys_start,
-                       unsigned long len)
-{
-       int slot;
-       int r;
-       struct kvm_userspace_memory_region rmslot;
-       struct kvm_userspace_memory_region newslot1;
-       struct kvm_userspace_memory_region newslot2;
-
-       len = (len + PAGE_SIZE - 1) & PAGE_MASK;
-
-       slot = get_intersecting_slot(phys_start);
-       /* no need to create hole, as there is already hole */
-       if (slot == -1)
-               return 0;
-
-       memset(&rmslot, 0, sizeof(struct kvm_userspace_memory_region));
-       memset(&newslot1, 0, sizeof(struct kvm_userspace_memory_region));
-       memset(&newslot2, 0, sizeof(struct kvm_userspace_memory_region));
-
-       rmslot.guest_phys_addr = slots[slot].phys_addr;
-       rmslot.slot = slot;
-
-       newslot1.guest_phys_addr = slots[slot].phys_addr;
-       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;
-       newslot2.memory_size = slots[slot].phys_addr +
-                              slots[slot].len - newslot2.guest_phys_addr;
-       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) {
-               fprintf(stderr, "kvm_create_mem_hole: %s\n", strerror(errno));
-               return -1;
-       }
-       free_slot(slot);
-
-       r = ioctl(kvm->vm_fd, KVM_SET_USER_MEMORY_REGION, &newslot1);
-       if (r == -1) {
-               fprintf(stderr, "kvm_create_mem_hole: %s\n", strerror(errno));
-               return -1;
-       }
-       register_slot(newslot1.slot, newslot1.guest_phys_addr,
-                     newslot1.memory_size, newslot1.userspace_addr,
-                     newslot1.flags);
-
-       r = ioctl(kvm->vm_fd, KVM_SET_USER_MEMORY_REGION, &newslot2);
-       if (r == -1) {
-               fprintf(stderr, "kvm_create_mem_hole: %s\n", strerror(errno));
-               return -1;
-       }
-       register_slot(newslot2.slot, newslot2.guest_phys_addr,
-                     newslot2.memory_size, newslot2.userspace_addr,
-                     newslot2.flags);
-       return 0;
-}
-
 int kvm_register_phys_mem(kvm_context_t kvm,
-                       unsigned long phys_start, void *userspace_addr,
-                       unsigned long len, int log)
+                         unsigned long phys_start, void *userspace_addr,
+                         unsigned long len, int log)
 {
 
        struct kvm_userspace_memory_region memory = {
diff --git a/libkvm/libkvm.h b/libkvm/libkvm.h
index 79dd769..77fd903 100644
--- a/libkvm/libkvm.h
+++ b/libkvm/libkvm.h
@@ -457,8 +457,6 @@ void kvm_destroy_phys_mem(kvm_context_t, unsigned long 
phys_start,
 int kvm_is_intersecting_mem(kvm_context_t kvm, unsigned long phys_start);
 int kvm_is_allocated_mem(kvm_context_t kvm, unsigned long phys_start,
                         unsigned long len);
-int kvm_create_mem_hole(kvm_context_t kvm, unsigned long phys_start,
-                       unsigned long len);
 int kvm_register_phys_mem(kvm_context_t kvm,
                        unsigned long phys_start, void *userspace_addr,
                        unsigned long len, int log);
diff --git a/qemu/qemu-kvm.c b/qemu/qemu-kvm.c
index 00840df..3663d38 100644
--- a/qemu/qemu-kvm.c
+++ b/qemu/qemu-kvm.c
@@ -773,12 +773,13 @@ void kvm_cpu_register_physical_memory(target_phys_addr_t 
start_addr,
     r = kvm_is_allocated_mem(kvm_context, start_addr, size);
     if (r)
         return;
-    r = kvm_is_intersecting_mem(kvm_context, start_addr);
-    if (r)
-        kvm_create_mem_hole(kvm_context, start_addr, size);
-    r = kvm_register_phys_mem(kvm_context, start_addr,
-                              phys_ram_base + phys_offset,
-                              size, 0);
+        r = kvm_is_intersecting_mem(kvm_context, start_addr);
+    if (r) {
+        printf("Ignoring intersecting memory %llx (%lx)\n", start_addr, size);
+    } else
+        r = kvm_register_phys_mem(kvm_context, start_addr,
+                                  phys_ram_base + phys_offset,
+                                  size, 0);
     if (r < 0) {
         printf("kvm_cpu_register_physical_memory: failed\n");
         exit(1);
--
To unsubscribe from this list: send the line "unsubscribe kvm-commits" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to