From c8588126da994e53c3311493cbb3b7075f2c8f77 Mon Sep 17 00:00:00 2001 From: Andrew Lukoshko Date: Wed, 29 Mar 2023 18:33:33 +0200 Subject: [PATCH] Enable KVM on ppc64le --- ...ed137eccb9e8f3a88f6297e214f53885196f.patch | 190 ++++++++++++++++++ SOURCES/kernel-ppc64le-debug-rhel.config | 7 +- SOURCES/kernel-ppc64le-rhel.config | 7 +- SPECS/kernel.spec | 5 +- 4 files changed, 206 insertions(+), 3 deletions(-) create mode 100644 SOURCES/eaaaed137eccb9e8f3a88f6297e214f53885196f.patch diff --git a/SOURCES/eaaaed137eccb9e8f3a88f6297e214f53885196f.patch b/SOURCES/eaaaed137eccb9e8f3a88f6297e214f53885196f.patch new file mode 100644 index 0000000..02a6ac4 --- /dev/null +++ b/SOURCES/eaaaed137eccb9e8f3a88f6297e214f53885196f.patch @@ -0,0 +1,190 @@ +From eaaaed137eccb9e8f3a88f6297e214f53885196f Mon Sep 17 00:00:00 2001 +From: Sean Christopherson +Date: Mon, 6 Dec 2021 20:54:14 +0100 +Subject: [PATCH] KVM: PPC: Avoid referencing userspace memory region in + memslot updates + +For PPC HV, get the number of pages directly from the new memslot instead +of computing the same from the userspace memory region, and explicitly +check for !DELETE instead of inferring the same when toggling mmio_update. +The motivation for these changes is to avoid referencing the @mem param +so that it can be dropped in a future commit. + +No functional change intended. + +Signed-off-by: Sean Christopherson +Signed-off-by: Maciej S. Szmigiero +Message-Id: <1e97fb5198be25f98ef82e63a8d770c682264cc9.1638817639.git.maciej.szmigiero@oracle.com> +--- + arch/powerpc/include/asm/kvm_ppc.h | 4 ---- + arch/powerpc/kvm/book3s.c | 6 ++---- + arch/powerpc/kvm/book3s_hv.c | 12 +++--------- + arch/powerpc/kvm/book3s_pr.c | 2 -- + arch/powerpc/kvm/booke.c | 2 -- + arch/powerpc/kvm/powerpc.c | 4 ++-- + 6 files changed, 7 insertions(+), 23 deletions(-) + +diff --git a/arch/powerpc/include/asm/kvm_ppc.h b/arch/powerpc/include/asm/kvm_ppc.h +index b01760dd1374df..935c58dc38c493 100644 +--- a/arch/powerpc/include/asm/kvm_ppc.h ++++ b/arch/powerpc/include/asm/kvm_ppc.h +@@ -200,12 +200,10 @@ extern void kvmppc_core_destroy_vm(struct kvm *kvm); + extern void kvmppc_core_free_memslot(struct kvm *kvm, + struct kvm_memory_slot *slot); + extern int kvmppc_core_prepare_memory_region(struct kvm *kvm, +- const struct kvm_userspace_memory_region *mem, + const struct kvm_memory_slot *old, + struct kvm_memory_slot *new, + enum kvm_mr_change change); + extern void kvmppc_core_commit_memory_region(struct kvm *kvm, +- const struct kvm_userspace_memory_region *mem, + struct kvm_memory_slot *old, + const struct kvm_memory_slot *new, + enum kvm_mr_change change); +@@ -275,12 +273,10 @@ struct kvmppc_ops { + int (*get_dirty_log)(struct kvm *kvm, struct kvm_dirty_log *log); + void (*flush_memslot)(struct kvm *kvm, struct kvm_memory_slot *memslot); + int (*prepare_memory_region)(struct kvm *kvm, +- const struct kvm_userspace_memory_region *mem, + const struct kvm_memory_slot *old, + struct kvm_memory_slot *new, + enum kvm_mr_change change); + void (*commit_memory_region)(struct kvm *kvm, +- const struct kvm_userspace_memory_region *mem, + struct kvm_memory_slot *old, + const struct kvm_memory_slot *new, + enum kvm_mr_change change); +diff --git a/arch/powerpc/kvm/book3s.c b/arch/powerpc/kvm/book3s.c +index 8250e8308674c7..6d525285dbe8f2 100644 +--- a/arch/powerpc/kvm/book3s.c ++++ b/arch/powerpc/kvm/book3s.c +@@ -847,21 +847,19 @@ void kvmppc_core_flush_memslot(struct kvm *kvm, struct kvm_memory_slot *memslot) + } + + int kvmppc_core_prepare_memory_region(struct kvm *kvm, +- const struct kvm_userspace_memory_region *mem, + const struct kvm_memory_slot *old, + struct kvm_memory_slot *new, + enum kvm_mr_change change) + { +- return kvm->arch.kvm_ops->prepare_memory_region(kvm, mem, old, new, change); ++ return kvm->arch.kvm_ops->prepare_memory_region(kvm, old, new, change); + } + + void kvmppc_core_commit_memory_region(struct kvm *kvm, +- const struct kvm_userspace_memory_region *mem, + struct kvm_memory_slot *old, + const struct kvm_memory_slot *new, + enum kvm_mr_change change) + { +- kvm->arch.kvm_ops->commit_memory_region(kvm, mem, old, new, change); ++ kvm->arch.kvm_ops->commit_memory_region(kvm, old, new, change); + } + + bool kvm_unmap_gfn_range(struct kvm *kvm, struct kvm_gfn_range *range) +diff --git a/arch/powerpc/kvm/book3s_hv.c b/arch/powerpc/kvm/book3s_hv.c +index d7594d49d288a3..2b59ecc5f8c698 100644 +--- a/arch/powerpc/kvm/book3s_hv.c ++++ b/arch/powerpc/kvm/book3s_hv.c +@@ -4854,15 +4854,12 @@ static void kvmppc_core_free_memslot_hv(struct kvm_memory_slot *slot) + } + + static int kvmppc_core_prepare_memory_region_hv(struct kvm *kvm, +- const struct kvm_userspace_memory_region *mem, + const struct kvm_memory_slot *old, + struct kvm_memory_slot *new, + enum kvm_mr_change change) + { +- unsigned long npages = mem->memory_size >> PAGE_SHIFT; +- + if (change == KVM_MR_CREATE) { +- new->arch.rmap = vzalloc(array_size(npages, ++ new->arch.rmap = vzalloc(array_size(new->npages, + sizeof(*new->arch.rmap))); + if (!new->arch.rmap) + return -ENOMEM; +@@ -4874,20 +4871,17 @@ static int kvmppc_core_prepare_memory_region_hv(struct kvm *kvm, + } + + static void kvmppc_core_commit_memory_region_hv(struct kvm *kvm, +- const struct kvm_userspace_memory_region *mem, + struct kvm_memory_slot *old, + const struct kvm_memory_slot *new, + enum kvm_mr_change change) + { +- unsigned long npages = mem->memory_size >> PAGE_SHIFT; +- + /* +- * If we are making a new memslot, it might make ++ * If we are creating or modifying a memslot, it might make + * some address that was previously cached as emulated + * MMIO be no longer emulated MMIO, so invalidate + * all the caches of emulated MMIO translations. + */ +- if (npages) ++ if (change != KVM_MR_DELETE) + atomic64_inc(&kvm->arch.mmio_update); + + /* +diff --git a/arch/powerpc/kvm/book3s_pr.c b/arch/powerpc/kvm/book3s_pr.c +index ffb559cf25f435..30426e8c8cf66b 100644 +--- a/arch/powerpc/kvm/book3s_pr.c ++++ b/arch/powerpc/kvm/book3s_pr.c +@@ -1899,7 +1899,6 @@ static void kvmppc_core_flush_memslot_pr(struct kvm *kvm, + } + + static int kvmppc_core_prepare_memory_region_pr(struct kvm *kvm, +- const struct kvm_userspace_memory_region *mem, + const struct kvm_memory_slot *old, + struct kvm_memory_slot *new, + enum kvm_mr_change change) +@@ -1908,7 +1907,6 @@ static int kvmppc_core_prepare_memory_region_pr(struct kvm *kvm, + } + + static void kvmppc_core_commit_memory_region_pr(struct kvm *kvm, +- const struct kvm_userspace_memory_region *mem, + struct kvm_memory_slot *old, + const struct kvm_memory_slot *new, + enum kvm_mr_change change) +diff --git a/arch/powerpc/kvm/booke.c b/arch/powerpc/kvm/booke.c +index 93c2ac2bee0913..53b4c9597c303e 100644 +--- a/arch/powerpc/kvm/booke.c ++++ b/arch/powerpc/kvm/booke.c +@@ -1821,7 +1821,6 @@ void kvmppc_core_free_memslot(struct kvm *kvm, struct kvm_memory_slot *slot) + } + + int kvmppc_core_prepare_memory_region(struct kvm *kvm, +- const struct kvm_userspace_memory_region *mem, + const struct kvm_memory_slot *old, + struct kvm_memory_slot *new, + enum kvm_mr_change change) +@@ -1830,7 +1829,6 @@ int kvmppc_core_prepare_memory_region(struct kvm *kvm, + } + + void kvmppc_core_commit_memory_region(struct kvm *kvm, +- const struct kvm_userspace_memory_region *mem, + struct kvm_memory_slot *old, + const struct kvm_memory_slot *new, + enum kvm_mr_change change) +diff --git a/arch/powerpc/kvm/powerpc.c b/arch/powerpc/kvm/powerpc.c +index e875874cf8367d..575140ecb23c82 100644 +--- a/arch/powerpc/kvm/powerpc.c ++++ b/arch/powerpc/kvm/powerpc.c +@@ -703,7 +703,7 @@ int kvm_arch_prepare_memory_region(struct kvm *kvm, + struct kvm_memory_slot *new, + enum kvm_mr_change change) + { +- return kvmppc_core_prepare_memory_region(kvm, mem, old, new, change); ++ return kvmppc_core_prepare_memory_region(kvm, old, new, change); + } + + void kvm_arch_commit_memory_region(struct kvm *kvm, +@@ -712,7 +712,7 @@ void kvm_arch_commit_memory_region(struct kvm *kvm, + const struct kvm_memory_slot *new, + enum kvm_mr_change change) + { +- kvmppc_core_commit_memory_region(kvm, mem, old, new, change); ++ kvmppc_core_commit_memory_region(kvm, old, new, change); + } + + void kvm_arch_flush_shadow_memslot(struct kvm *kvm, diff --git a/SOURCES/kernel-ppc64le-debug-rhel.config b/SOURCES/kernel-ppc64le-debug-rhel.config index 4f23474..7623a62 100644 --- a/SOURCES/kernel-ppc64le-debug-rhel.config +++ b/SOURCES/kernel-ppc64le-debug-rhel.config @@ -2417,7 +2417,12 @@ CONFIG_KUNIT_EXAMPLE_TEST=m CONFIG_KUNIT=m CONFIG_KUNIT_TEST=m CONFIG_KVM_AMD_SEV=y -# CONFIG_KVM_BOOK3S_64 is not set +CONFIG_KVM_BOOK3S_64=m +CONFIG_KVM_BOOK3S_64_HV=m +# CONFIG_KVM_BOOK3S_64_PR is not set +# CONFIG_KVM_BOOK3S_HV_EXIT_TIMING is not set +CONFIG_KVM_BOOK3S_HV_POSSIBLE=y +CONFIG_KVM_XICS=y CONFIG_KVM_GUEST=y # CONFIG_KVM_XEN is not set # CONFIG_KXCJK1013 is not set diff --git a/SOURCES/kernel-ppc64le-rhel.config b/SOURCES/kernel-ppc64le-rhel.config index b815278..0dac866 100644 --- a/SOURCES/kernel-ppc64le-rhel.config +++ b/SOURCES/kernel-ppc64le-rhel.config @@ -2397,7 +2397,12 @@ CONFIG_KUNIT_EXAMPLE_TEST=m CONFIG_KUNIT=m CONFIG_KUNIT_TEST=m CONFIG_KVM_AMD_SEV=y -# CONFIG_KVM_BOOK3S_64 is not set +CONFIG_KVM_BOOK3S_64=m +CONFIG_KVM_BOOK3S_64_HV=m +# CONFIG_KVM_BOOK3S_64_PR is not set +# CONFIG_KVM_BOOK3S_HV_EXIT_TIMING is not set +CONFIG_KVM_BOOK3S_HV_POSSIBLE=y +CONFIG_KVM_XICS=y CONFIG_KVM_GUEST=y # CONFIG_KVM_XEN is not set # CONFIG_KXCJK1013 is not set diff --git a/SPECS/kernel.spec b/SPECS/kernel.spec index 2988a7e..13c63ca 100755 --- a/SPECS/kernel.spec +++ b/SPECS/kernel.spec @@ -538,7 +538,7 @@ Name: kernel License: GPLv2 and Redistributable, no modification permitted URL: https://www.kernel.org/ Version: %{rpmversion} -Release: %{pkg_release} +Release: %{pkg_release}.kvm # DO NOT CHANGE THE 'ExclusiveArch' LINE TO TEMPORARILY EXCLUDE AN ARCHITECTURE BUILD. # SET %%nobuildarches (ABOVE) INSTEAD %if 0%{?fedora} @@ -808,6 +808,8 @@ Source4002: gating.yaml Patch1: patch-%{rpmversion}-redhat.patch %endif +Patch100: eaaaed137eccb9e8f3a88f6297e214f53885196f.patch + # empty final patch to facilitate testing of kernel patches Patch999999: linux-kernel-test.patch @@ -1349,6 +1351,7 @@ cp -a %{SOURCE1} . ApplyOptionalPatch patch-%{rpmversion}-redhat.patch %endif +ApplyOptionalPatch eaaaed137eccb9e8f3a88f6297e214f53885196f.patch ApplyOptionalPatch linux-kernel-test.patch # END OF PATCH APPLICATIONS