On Aug 9, 2011, at 11:57 AM, Avi Kivity wrote: > On 08/06/2011 01:39 PM, Christoffer Dall wrote: >> This commit introduces the framework for guest memory management >> through the use of 2nd stage translation. Each VM has a pointer >> to a level-1 tabled (the pgd field in struct kvm_arch) which is >> used for the 2nd stage translations. Entries are added when handling >> guest faults (later patch) and the table itself can be allocated and >> freed through the following functions implemented in >> arch/arm/kvm/arm_mmu.c: >> - kvm_alloc_stage2_pgd(struct kvm *kvm); >> - kvm_free_stage2_pgd(struct kvm *kvm); >> >> Further, each entry in TLBs and caches are tagged with a VMID >> identifier in addition to ASIDs. The VMIDs are managed using >> a bitmap and assigned when creating the VM in kvm_arch_init_vm() >> where the 2nd stage pgd is also allocated. The table is freed in >> kvm_arch_destroy_vm(). Both functions are called from the main >> KVM code. >> >> >> +/** >> + * kvm_arch_init_vm - initializes a VM data structure >> + * @kvm: pointer to the KVM struct >> + */ >> int kvm_arch_init_vm(struct kvm *kvm) >> { >> - return 0; >> + int ret = 0; >> + phys_addr_t pgd_phys; >> + unsigned long vmid; >> + unsigned long start, end; >> + >> + >> + mutex_lock(&kvm_vmids_mutex); >> + vmid = find_first_zero_bit(kvm_vmids, VMID_SIZE); >> + if (vmid>= VMID_SIZE) { >> + mutex_unlock(&kvm_vmids_mutex); >> + return -EBUSY; >> + } >> + __set_bit(vmid, kvm_vmids); > > VMID_SIZE seems to be a bit low for comfort. I guess it's fine for a > start, but later on we'll have to recycle VMIDs, like we do for SVM ASIDs. > > Is there not a risk of a user starting 255 tiny guests and denying other > users the ability to use kvm? yes there absolutely is, if that's a valid use case. I wanted something simple for now, but completely agree that with ARM machines with TBs of memory, we need some more VMIDs. I will incorporate it into the next patch series. > >> + kvm->arch.vmid = vmid; >> + mutex_unlock(&kvm_vmids_mutex); >> + >> + ret = kvm_alloc_stage2_pgd(kvm); >> + if (ret) >> + goto out_fail_alloc; >> + >> + pgd_phys = virt_to_phys(kvm->arch.pgd); >> + kvm->arch.vttbr = pgd_phys& ((1LLU<< 40) - 1)& ~((2<< VTTBR_X) - 1); >> + kvm->arch.vttbr |= ((u64)vmid<< 48); >> + >> + start = (unsigned long)kvm, >> + end = start + sizeof(struct kvm); >> + ret = create_hyp_mappings(kvm_hyp_pgd, start, end); >> + if (ret) >> + goto out_fail_hyp_mappings; >> + >> + return ret; >> +out_fail_hyp_mappings: >> + remove_hyp_mappings(kvm_hyp_pgd, start, end); >> +out_fail_alloc: >> + clear_bit(vmid, kvm_vmids); >> + return ret; >> } >> > > -- > error compiling committee.c: too many arguments to function > > _______________________________________________ > Android-virt mailing list > Android-virt@xxxxxxxxxxxxxxxxxxxxx > https://lists.cs.columbia.edu/cucslists/listinfo/android-virt -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html