Re: [PATCH 06/14] arm/arm64: KVM: make the maximum number of vCPUs a per-VM value

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



>  #define KVM_NR_MEM_OBJS     40
> diff --git a/arch/arm/kvm/arm.c b/arch/arm/kvm/arm.c
> index fa37fa1..a291e63 100644
> --- a/arch/arm/kvm/arm.c
> +++ b/arch/arm/kvm/arm.c
> @@ -142,6 +142,7 @@ int kvm_arch_init_vm(struct kvm *kvm, unsigned long type)
>  
>  	/* Mark the initial VMID generation invalid */
>  	kvm->arch.vmid_gen = 0;
> +	kvm->arch.max_vcpus = CONFIG_KVM_ARM_MAX_VCPUS;
>  


Maybe here should be modified:
kvm->arch.max_vcpus = KVM_MAX_VCPUS;

Too many defined about max_vcpus..

>  	return ret;
>  out_free_stage2_pgd:
> @@ -260,6 +261,11 @@ struct kvm_vcpu *kvm_arch_vcpu_create(struct kvm *kvm, unsigned int id)
>  	int err;
>  	struct kvm_vcpu *vcpu;
>  
> +	if (id >= kvm->arch.max_vcpus) {
> +		err = -EINVAL;
> +		goto out;
> +	}



Maybe this judgement is excrescent...

In vm init, there is :kvm->arch.max_vcpus = CONFIG_KVM_ARM_MAX_VCPUS;

Before kvm_arch_vcpu_create, in  kvm_vm_ioctl_create_vcpu, It checked the id already.
static int kvm_vm_ioctl_create_vcpu(struct kvm *kvm, u32 id)
{
	if (id >= KVM_MAX_VCPUS)
		return -EINVAL;

	vcpu = kvm_arch_vcpu_create(kvm, id);
}


> +
>  	vcpu = kmem_cache_zalloc(kvm_vcpu_cache, GFP_KERNEL);
>  	if (!vcpu) {
>  		err = -ENOMEM;
> diff --git a/arch/arm64/include/asm/kvm_host.h b/arch/arm64/include/asm/kvm_host.h
> index 4c84250..eef63b1 100644
> --- a/arch/arm64/include/asm/kvm_host.h
> +++ b/arch/arm64/include/asm/kvm_host.h
> @@ -58,6 +58,9 @@ struct kvm_arch {
>  	/* VTTBR value associated with above pgd and vmid */
>  	u64    vttbr;
>  
> +	/* The maximum number of vCPUs depends on the used GIC model */
> +	int max_vcpus;
> +
>  	/* Interrupt controller */
>  	struct vgic_dist	vgic;
>  
> diff --git a/virt/kvm/arm/vgic-v2.c b/virt/kvm/arm/vgic-v2.c
> index f2c214a..4091078 100644
> --- a/virt/kvm/arm/vgic-v2.c
> +++ b/virt/kvm/arm/vgic-v2.c
> @@ -164,11 +164,16 @@ static struct vgic_params vgic_v2_params;
>  static bool vgic_v2_init_emul(struct kvm *kvm, int type)
>  {
>  	struct vgic_vm_ops *vm_ops = &kvm->arch.vgic.vm_ops;
> +	int nr_vcpus;
>  
>  	switch (type) {
>  	case KVM_DEV_TYPE_ARM_VGIC_V2:
> +		nr_vcpus = atomic_read(&kvm->online_vcpus);
> +		if (nr_vcpus > 8)
> +			return false;
>  		vm_ops->get_lr = vgic_v2_get_lr;
>  		vm_ops->set_lr = vgic_v2_set_lr;
> +		kvm->arch.max_vcpus = 8;



There is a suggestion:
	case KVM_DEV_TYPE_ARM_VGIC_V2:
		kvm->arch.max_vcpus = 8;
		nr_vcpus = atomic_read(&kvm->online_vcpus);
		if (nr_vcpus > kvm->arch.max_vcpus) {
			kvm->arch.max_vcpus = 0;
			kvm_err("vgic can not support overlap 8 vcpus\n");
			return false;
		}  		
		vm_ops->get_lr = vgic_v2_get_lr;
		vm_ops->set_lr = vgic_v2_set_lr;


>  		return true;
>  	}
>  
> diff --git a/virt/kvm/arm/vgic-v3.c b/virt/kvm/arm/vgic-v3.c
> index f42961c..40d6817 100644
> --- a/virt/kvm/arm/vgic-v3.c
> +++ b/virt/kvm/arm/vgic-v3.c
> @@ -171,11 +171,17 @@ static const struct vgic_ops vgic_v3_ops = {
>  static bool vgic_v3_init_emul_compat(struct kvm *kvm, int type)
>  {
>  	struct vgic_vm_ops *vm_ops = &kvm->arch.vgic.vm_ops;
> +	int nr_vcpus;
>  
>  	switch (type) {
>  	case KVM_DEV_TYPE_ARM_VGIC_V2:
> +		nr_vcpus = atomic_read(&kvm->online_vcpus);
> +		if (nr_vcpus > 8)
> +			return false;
> +
>  		vm_ops->get_lr = vgic_v3_get_lr;
>  		vm_ops->set_lr = vgic_v3_set_lr;
> +		kvm->arch.max_vcpus = 8;


As same suggestion as above!

And I have a doubt, Is there significative about the max_vcpus in struct kvm_arch ?
In my opinion,  In the vcpu create process, the number of vcpus is checked by CONFIG_KVM_ARM_MAX_VCPUS.

And, in the vgic create process, I think just judge the vcpu number whether overlap the vcpus number limit of the version of gic or not will be OK.
After, this max_vcpus will not be used, for ever ..

>  		return true;
>  	}
>  	return false;



_______________________________________________
kvmarm mailing list
kvmarm@xxxxxxxxxxxxxxxxxxxxx
https://lists.cs.columbia.edu/mailman/listinfo/kvmarm




[Index of Archives]     [Linux KVM]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux