Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

KVM: PPC: Don't always report hash MMU capability for P9 < DD2.2

These machines don't support running both MMU types at the same time,
so remove the KVM_CAP_PPC_MMU_HASH_V3 capability when the host is
using Radix MMU.

[paulus@ozlabs.org - added defensive check on
kvmppc_hv_ops->hash_v3_possible]

Signed-off-by: Fabiano Rosas <farosas@linux.ibm.com>
Signed-off-by: Paul Mackerras <paulus@ozlabs.org>

authored by

Fabiano Rosas and committed by
Paul Mackerras
a722076e 25edcc50

+13 -2
+1
arch/powerpc/include/asm/kvm_ppc.h
··· 315 315 int (*enable_svm)(struct kvm *kvm); 316 316 int (*svm_off)(struct kvm *kvm); 317 317 int (*enable_dawr1)(struct kvm *kvm); 318 + bool (*hash_v3_possible)(void); 318 319 }; 319 320 320 321 extern struct kvmppc_ops *kvmppc_hv_ops;
+10
arch/powerpc/kvm/book3s_hv.c
··· 5625 5625 return 0; 5626 5626 } 5627 5627 5628 + static bool kvmppc_hash_v3_possible(void) 5629 + { 5630 + if (radix_enabled() && no_mixing_hpt_and_radix) 5631 + return false; 5632 + 5633 + return cpu_has_feature(CPU_FTR_ARCH_300) && 5634 + cpu_has_feature(CPU_FTR_HVMODE); 5635 + } 5636 + 5628 5637 static struct kvmppc_ops kvm_ops_hv = { 5629 5638 .get_sregs = kvm_arch_vcpu_ioctl_get_sregs_hv, 5630 5639 .set_sregs = kvm_arch_vcpu_ioctl_set_sregs_hv, ··· 5678 5669 .enable_svm = kvmhv_enable_svm, 5679 5670 .svm_off = kvmhv_svm_off, 5680 5671 .enable_dawr1 = kvmhv_enable_dawr1, 5672 + .hash_v3_possible = kvmppc_hash_v3_possible, 5681 5673 }; 5682 5674 5683 5675 static int kvm_init_subcore_bitmap(void)
+2 -2
arch/powerpc/kvm/powerpc.c
··· 611 611 r = !!(hv_enabled && radix_enabled()); 612 612 break; 613 613 case KVM_CAP_PPC_MMU_HASH_V3: 614 - r = !!(hv_enabled && cpu_has_feature(CPU_FTR_ARCH_300) && 615 - cpu_has_feature(CPU_FTR_HVMODE)); 614 + r = !!(hv_enabled && kvmppc_hv_ops->hash_v3_possible && 615 + kvmppc_hv_ops->hash_v3_possible()); 616 616 break; 617 617 case KVM_CAP_PPC_NESTED_HV: 618 618 r = !!(hv_enabled && kvmppc_hv_ops->enable_nested &&