From mboxrd@z Thu Jan 1 00:00:00 1970 From: Izik Eidus Subject: Re: [PATCH] unalias rework Date: Thu, 02 Oct 2008 18:31:58 +0300 Message-ID: <48E4E96E.6070908@redhat.com> Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit To: kvm@vger.kernel.org Return-path: Received: from mx2.redhat.com ([66.187.237.31]:44147 "EHLO mx2.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753890AbYJBPcB (ORCPT ); Thu, 2 Oct 2008 11:32:01 -0400 Received: from int-mx2.corp.redhat.com (int-mx2.corp.redhat.com [172.16.27.26]) by mx2.redhat.com (8.13.8/8.13.8) with ESMTP id m92FW10X023789 for ; Thu, 2 Oct 2008 11:32:01 -0400 Received: from ns3.rdu.redhat.com (ns3.rdu.redhat.com [10.11.255.199]) by int-mx2.corp.redhat.com (8.13.1/8.13.1) with ESMTP id m92FW0NL021441 for ; Thu, 2 Oct 2008 11:32:00 -0400 Received: from [10.32.4.163] (vpn-4-163.str.redhat.com [10.32.4.163]) by ns3.rdu.redhat.com (8.13.8/8.13.8) with ESMTP id m92FVwKP009085 for ; Thu, 2 Oct 2008 11:31:59 -0400 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...