From mboxrd@z Thu Jan 1 00:00:00 1970 From: Izik Eidus Subject: Re: [PATCH] unalias rework Date: Thu, 02 Oct 2008 17:21:54 +0300 Message-ID: <48E4D902.7010203@qumranet.com> References: <48BFED00.80006@qumranet.com> <20080926001543.GA29572@dmt.cnet> Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Cc: kvm@vger.kernel.org To: unlisted-recipients:; (no To-header on input) Return-path: Received: from il.qumranet.com ([212.179.150.194]:59079 "EHLO il.qumranet.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752541AbYJBOV4 (ORCPT ); Thu, 2 Oct 2008 10:21:56 -0400 Received: from [172.16.15.9] (izike-desktop.qumranet.com [172.16.15.9]) by il.qumranet.com (Postfix) with ESMTP id A502B250310 for ; Thu, 2 Oct 2008 17:21:54 +0300 (IDT) In-Reply-To: <20080926001543.GA29572@dmt.cnet> Sender: kvm-owner@vger.kernel.org List-ID: 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...