| From a86cb413f4bf273a9d341a3ab2c2ca44e12eb317 Mon Sep 17 00:00:00 2001 |
| From: Thomas Huth <thuth@redhat.com> |
| Date: Thu, 23 May 2019 18:43:08 +0200 |
| Subject: KVM: s390: Do not report unusabled IDs via KVM_CAP_MAX_VCPU_ID |
| |
| From: Thomas Huth <thuth@redhat.com> |
| |
| commit a86cb413f4bf273a9d341a3ab2c2ca44e12eb317 upstream. |
| |
| KVM_CAP_MAX_VCPU_ID is currently always reporting KVM_MAX_VCPU_ID on all |
| architectures. However, on s390x, the amount of usable CPUs is determined |
| during runtime - it is depending on the features of the machine the code |
| is running on. Since we are using the vcpu_id as an index into the SCA |
| structures that are defined by the hardware (see e.g. the sca_add_vcpu() |
| function), it is not only the amount of CPUs that is limited by the hard- |
| ware, but also the range of IDs that we can use. |
| Thus KVM_CAP_MAX_VCPU_ID must be determined during runtime on s390x, too. |
| So the handling of KVM_CAP_MAX_VCPU_ID has to be moved from the common |
| code into the architecture specific code, and on s390x we have to return |
| the same value here as for KVM_CAP_MAX_VCPUS. |
| This problem has been discovered with the kvm_create_max_vcpus selftest. |
| With this change applied, the selftest now passes on s390x, too. |
| |
| Reviewed-by: Andrew Jones <drjones@redhat.com> |
| Reviewed-by: Cornelia Huck <cohuck@redhat.com> |
| Reviewed-by: David Hildenbrand <david@redhat.com> |
| Signed-off-by: Thomas Huth <thuth@redhat.com> |
| Message-Id: <20190523164309.13345-9-thuth@redhat.com> |
| Cc: stable@vger.kernel.org |
| Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| |
| --- |
| arch/mips/kvm/mips.c | 3 +++ |
| arch/powerpc/kvm/powerpc.c | 3 +++ |
| arch/s390/kvm/kvm-s390.c | 1 + |
| arch/x86/kvm/x86.c | 3 +++ |
| virt/kvm/arm/arm.c | 3 +++ |
| virt/kvm/kvm_main.c | 2 -- |
| 6 files changed, 13 insertions(+), 2 deletions(-) |
| |
| --- a/arch/mips/kvm/mips.c |
| +++ b/arch/mips/kvm/mips.c |
| @@ -1099,6 +1099,9 @@ int kvm_vm_ioctl_check_extension(struct |
| case KVM_CAP_MAX_VCPUS: |
| r = KVM_MAX_VCPUS; |
| break; |
| + case KVM_CAP_MAX_VCPU_ID: |
| + r = KVM_MAX_VCPU_ID; |
| + break; |
| case KVM_CAP_MIPS_FPU: |
| /* We don't handle systems with inconsistent cpu_has_fpu */ |
| r = !!raw_cpu_has_fpu; |
| --- a/arch/powerpc/kvm/powerpc.c |
| +++ b/arch/powerpc/kvm/powerpc.c |
| @@ -632,6 +632,9 @@ int kvm_vm_ioctl_check_extension(struct |
| case KVM_CAP_MAX_VCPUS: |
| r = KVM_MAX_VCPUS; |
| break; |
| + case KVM_CAP_MAX_VCPU_ID: |
| + r = KVM_MAX_VCPU_ID; |
| + break; |
| #ifdef CONFIG_PPC_BOOK3S_64 |
| case KVM_CAP_PPC_GET_SMMU_INFO: |
| r = 1; |
| --- a/arch/s390/kvm/kvm-s390.c |
| +++ b/arch/s390/kvm/kvm-s390.c |
| @@ -489,6 +489,7 @@ int kvm_vm_ioctl_check_extension(struct |
| break; |
| case KVM_CAP_NR_VCPUS: |
| case KVM_CAP_MAX_VCPUS: |
| + case KVM_CAP_MAX_VCPU_ID: |
| r = KVM_S390_BSCA_CPU_SLOTS; |
| if (!kvm_s390_use_sca_entries()) |
| r = KVM_MAX_VCPUS; |
| --- a/arch/x86/kvm/x86.c |
| +++ b/arch/x86/kvm/x86.c |
| @@ -2987,6 +2987,9 @@ int kvm_vm_ioctl_check_extension(struct |
| case KVM_CAP_MAX_VCPUS: |
| r = KVM_MAX_VCPUS; |
| break; |
| + case KVM_CAP_MAX_VCPU_ID: |
| + r = KVM_MAX_VCPU_ID; |
| + break; |
| case KVM_CAP_NR_MEMSLOTS: |
| r = KVM_USER_MEM_SLOTS; |
| break; |
| --- a/virt/kvm/arm/arm.c |
| +++ b/virt/kvm/arm/arm.c |
| @@ -223,6 +223,9 @@ int kvm_vm_ioctl_check_extension(struct |
| case KVM_CAP_MAX_VCPUS: |
| r = KVM_MAX_VCPUS; |
| break; |
| + case KVM_CAP_MAX_VCPU_ID: |
| + r = KVM_MAX_VCPU_ID; |
| + break; |
| case KVM_CAP_NR_MEMSLOTS: |
| r = KVM_USER_MEM_SLOTS; |
| break; |
| --- a/virt/kvm/kvm_main.c |
| +++ b/virt/kvm/kvm_main.c |
| @@ -2965,8 +2965,6 @@ static long kvm_vm_ioctl_check_extension |
| case KVM_CAP_MULTI_ADDRESS_SPACE: |
| return KVM_ADDRESS_SPACE_NUM; |
| #endif |
| - case KVM_CAP_MAX_VCPU_ID: |
| - return KVM_MAX_VCPU_ID; |
| default: |
| break; |
| } |