Hi, On 4/27/20 3:44 PM, Alexandru Elisei wrote: > Hi, > > On 4/27/20 3:17 PM, Marc Zyngier wrote: >> On arm64, the maximum number of vcpus is constrained by the type >> of interrupt controller that has been selected (GICv2 imposes a >> limit of 8 vcpus, while GICv3 currently has a limit of 512). >> >> It is thus important to request this limit on the VM file descriptor >> rather than on the one that corresponds to /dev/kvm, as the latter >> is likely to return something that doesn't take the constraints into >> account. >> >> Reported-by: Ard Biesheuvel <ardb@xxxxxxxxxx> >> Signed-off-by: Marc Zyngier <maz@xxxxxxxxxx> >> --- >> kvm.c | 4 ++-- >> 1 file changed, 2 insertions(+), 2 deletions(-) >> >> diff --git a/kvm.c b/kvm.c >> index e327541..3d5173d 100644 >> --- a/kvm.c >> +++ b/kvm.c >> @@ -406,7 +406,7 @@ int kvm__recommended_cpus(struct kvm *kvm) >> { >> int ret; >> >> - ret = ioctl(kvm->sys_fd, KVM_CHECK_EXTENSION, KVM_CAP_NR_VCPUS); >> + ret = ioctl(kvm->vm_fd, KVM_CHECK_EXTENSION, KVM_CAP_NR_VCPUS); >> if (ret <= 0) >> /* >> * api.txt states that if KVM_CAP_NR_VCPUS does not exist, >> @@ -421,7 +421,7 @@ int kvm__max_cpus(struct kvm *kvm) >> { >> int ret; >> >> - ret = ioctl(kvm->sys_fd, KVM_CHECK_EXTENSION, KVM_CAP_MAX_VCPUS); >> + ret = ioctl(kvm->vm_fd, KVM_CHECK_EXTENSION, KVM_CAP_MAX_VCPUS); >> if (ret <= 0) >> ret = kvm__recommended_cpus(kvm); >> > I've checked that gic__create comes before the call kvm__recommended_capus: > gic__create is in core_init (called via kvm__init->kvm_arch_init), and > kvm__recommended_cpus is in base_init (called via kvm__cpu_init -> > kvm__{recommended,max}_cpus). > > The KVM api documentation states that KVM_CHECK_EXTENSION is available for the vm > fd only if the system capability KVM_CAP_CHECK_EXTENSION_VM is present. kvmtool > already has a function for checking extensions on the vm fd, it's called > kvm__supports_vm_extension. Can we use that instead of doing the ioctl directly on > the vm fd? Scratch that, kvm__supports_vm_extension returns a bool, not an int. How about we write kvm__check_vm_extension that returns an int, and kvm__supports_vm_extension calls it? > > Thanks, > Alex