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
> [email protected]
> 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 [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html