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?

--
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