> #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