Marcelo Tosatti wrote:
Hi Izik,

On Thu, Sep 04, 2008 at 05:13:20PM +0300, izik eidus wrote:
+        struct kvm_memory_slot *alias_slot = &kvm->memslots[i];
+
+        if (alias_slot->base_gfn == slot->base_gfn)
+            return 1;
+    }
+    return 0;
+}
+
+static void update_alias_slots(struct kvm *kvm, struct kvm_memory_slot *free)
+{
+    int i;
+
+    if (is_aliased_slot(kvm, free))
+        return;
+
+    for (i = KVM_MEMORY_SLOTS; i < KVM_MEMORY_SLOTS + KVM_ALIAS_SLOTS;
+         ++i) {
+        struct kvm_memory_slot *alias_memslot = &kvm->memslots[i];
+        unsigned long size = free->npages << PAGE_SHIFT;
+
+        if (alias_memslot->userspace_addr >= free->userspace_addr &&
+            alias_memslot->userspace_addr < free->userspace_addr +
+            size) {
+            alias_memslot->flags = free->flags;
+            if (free->dirty_bitmap) {
+                unsigned long offset =
+                        alias_memslot->userspace_addr -
+                        free->userspace_addr;
+                unsigned dirty_offset;
+                unsigned long bitmap_addr;
+
+                offset = offset >> PAGE_SHIFT;
+                dirty_offset = ALIGN(offset, BITS_PER_LONG) / 8;
+                bitmap_addr = (unsigned long) free->dirty_bitmap;
+                bitmap_addr += dirty_offset;
+ alias_memslot->dirty_bitmap = (unsigned long *) bitmap_addr;
+            } else
+                alias_memslot->dirty_bitmap = NULL;
+        }
+    }
+}
+
 /*
  * Free any memory in @free but not in @dont.
  */
-static void kvm_free_physmem_slot(struct kvm_memory_slot *free,
+static void kvm_free_physmem_slot(struct kvm *kvm,
+                  struct kvm_memory_slot *free,
                   struct kvm_memory_slot *dont)
 {
     if (!dont || free->rmap != dont->rmap)
@@ -385,10 +433,16 @@ static void kvm_free_physmem_slot(struct kvm_memory_slot *free,
     if (!dont || free->lpage_info != dont->lpage_info)
         vfree(free->lpage_info);
- free->npages = 0;
     free->dirty_bitmap = NULL;
     free->rmap = NULL;
     free->lpage_info = NULL;
+
+#ifdef CONFIG_X86
+    update_alias_slots(kvm, free);
+    if (dont)
+        update_alias_slots(kvm, dont);
+#endif
+    free->npages = 0;

Why is this needed? I don't understand when would you free a memslot
without freeing any aliases that map it first?

(sent it already, but for some reason it didnt reach to the mailing list)
beacuse in case of dont != NULL, we actually dont free the memslot...


--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to