KVM: PPC: Book3S HV: Add NO_HASH flag to GET_SMMU_INFO ioctl result
authorPaul Mackerras <paulus@ozlabs.org>
Mon, 8 Oct 2018 03:24:30 +0000 (14:24 +1100)
committerPaul Mackerras <paulus@ozlabs.org>
Tue, 9 Oct 2018 05:14:54 +0000 (16:14 +1100)
This adds a KVM_PPC_NO_HASH flag to the flags field of the
kvm_ppc_smmu_info struct, and arranges for it to be set when
running as a nested hypervisor, as an unambiguous indication
to userspace that HPT guests are not supported.  Reporting the
KVM_CAP_PPC_MMU_HASH_V3 capability as false could be taken as
indicating only that the new HPT features in ISA V3.0 are not
supported, leaving it ambiguous whether pre-V3.0 HPT features
are supported.

Reviewed-by: David Gibson <david@gibson.dropbear.id.au>
Signed-off-by: Paul Mackerras <paulus@ozlabs.org>
Documentation/virtual/kvm/api.txt
arch/powerpc/kvm/book3s_hv.c
include/uapi/linux/kvm.h

index fde48b6708f187f4d39cedc030054a9f80b5a19a..df98b630476935c9e234976d8f953ff6c1ca865e 100644 (file)
@@ -2270,6 +2270,10 @@ The supported flags are:
         The emulated MMU supports 1T segments in addition to the
         standard 256M ones.
 
+    - KVM_PPC_NO_HASH
+       This flag indicates that HPT guests are not supported by KVM,
+       thus all guests must use radix MMU mode.
+
 The "slb_size" field indicates how many SLB entries are supported
 
 The "sps" array contains 8 entries indicating the supported base
index 89bcf923d5420e130d326b89d9e4aacfe7dcc68d..788bc61bd08c377231efbbe39112e6ea4683731a 100644 (file)
@@ -4257,6 +4257,10 @@ static int kvm_vm_ioctl_get_smmu_info_hv(struct kvm *kvm,
        kvmppc_add_seg_page_size(&sps, 16, SLB_VSID_L | SLB_VSID_LP_01);
        kvmppc_add_seg_page_size(&sps, 24, SLB_VSID_L);
 
+       /* If running as a nested hypervisor, we don't support HPT guests */
+       if (kvmhv_on_pseries())
+               info->flags |= KVM_PPC_NO_HASH;
+
        return 0;
 }
 
index d9cec6b5cb3740dbc27d5d6fefffe160f60f5695..7f2ff3a7699573c600eb745715656501b2a08fe4 100644 (file)
@@ -719,6 +719,7 @@ struct kvm_ppc_one_seg_page_size {
 
 #define KVM_PPC_PAGE_SIZES_REAL                0x00000001
 #define KVM_PPC_1T_SEGMENTS            0x00000002
+#define KVM_PPC_NO_HASH                        0x00000004
 
 struct kvm_ppc_smmu_info {
        __u64 flags;