291 lines
11 KiB
Diff
291 lines
11 KiB
Diff
From 524ab50336b1190547ceb8074260a1fbebfee0be Mon Sep 17 00:00:00 2001
|
|
From: Sean Christopherson <seanjc@google.com>
|
|
Date: Mon, 6 Dec 2021 20:54:14 +0100
|
|
Subject: [PATCH 1/3] 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 <seanjc@google.com>
|
|
Signed-off-by: Maciej S. Szmigiero <maciej.szmigiero@oracle.com>
|
|
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 5c80c4955..6874cd89d 100644
|
|
--- a/arch/powerpc/include/asm/kvm_ppc.h
|
|
+++ b/arch/powerpc/include/asm/kvm_ppc.h
|
|
@@ -199,12 +199,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);
|
|
@@ -274,12 +272,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 64fd4b3ea..cb7b5f365 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 9c3c9fd5e..7f4c188f3 100644
|
|
--- a/arch/powerpc/kvm/book3s_hv.c
|
|
+++ b/arch/powerpc/kvm/book3s_hv.c
|
|
@@ -4777,15 +4777,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;
|
|
@@ -4797,20 +4794,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 7891b9d0c..c0ae926af 100644
|
|
--- a/arch/powerpc/kvm/book3s_pr.c
|
|
+++ b/arch/powerpc/kvm/book3s_pr.c
|
|
@@ -1892,7 +1892,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)
|
|
@@ -1901,7 +1900,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 b06ca6646..6cf2db284 100644
|
|
--- a/arch/powerpc/kvm/booke.c
|
|
+++ b/arch/powerpc/kvm/booke.c
|
|
@@ -1806,7 +1806,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)
|
|
@@ -1815,7 +1814,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 818815e15..f8f39a858 100644
|
|
--- a/arch/powerpc/kvm/powerpc.c
|
|
+++ b/arch/powerpc/kvm/powerpc.c
|
|
@@ -686,7 +686,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,
|
|
@@ -694,7 +694,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,
|
|
--
|
|
2.39.5 (Apple Git-154)
|
|
|
|
|
|
From a8d04f4f09f371e3b4fca9a40e9d3b5a1e0016d3 Mon Sep 17 00:00:00 2001
|
|
From: Hugh Dickins <hughd@google.com>
|
|
Date: Thu, 8 Jun 2023 12:22:39 -0700
|
|
Subject: [PATCH 2/3] powerpc: kvmppc_unmap_free_pmd() pte_offset_kernel()
|
|
|
|
kvmppc_unmap_free_pmd() use pte_offset_kernel(), like everywhere else
|
|
in book3s_64_mmu_radix.c: instead of pte_offset_map(), which will come
|
|
to need a pte_unmap() to balance it.
|
|
|
|
But note that this is a more complex case than most: see those -EAGAINs
|
|
in kvmppc_create_pte(), which is coping with kvmppc races beween page
|
|
table and huge entry, of the kind which we are expecting to address
|
|
in pte_offset_map() - this might want to be revisited in future.
|
|
|
|
Link: https://lkml.kernel.org/r/c76aa421-aec3-4cc8-cc61-4130f2e27e1@google.com
|
|
Signed-off-by: Hugh Dickins <hughd@google.com>
|
|
Cc: Alexander Gordeev <agordeev@linux.ibm.com>
|
|
Cc: Alexandre Ghiti <alexghiti@rivosinc.com>
|
|
Cc: Aneesh Kumar K.V <aneesh.kumar@linux.ibm.com>
|
|
Cc: Catalin Marinas <catalin.marinas@arm.com>
|
|
Cc: Christian Borntraeger <borntraeger@linux.ibm.com>
|
|
Cc: Chris Zankel <chris@zankel.net>
|
|
Cc: Claudio Imbrenda <imbrenda@linux.ibm.com>
|
|
Cc: David Hildenbrand <david@redhat.com>
|
|
Cc: "David S. Miller" <davem@davemloft.net>
|
|
Cc: Geert Uytterhoeven <geert@linux-m68k.org>
|
|
Cc: Greg Ungerer <gerg@linux-m68k.org>
|
|
Cc: Heiko Carstens <hca@linux.ibm.com>
|
|
Cc: Helge Deller <deller@gmx.de>
|
|
Cc: "H. Peter Anvin" <hpa@zytor.com>
|
|
Cc: Ingo Molnar <mingo@kernel.org>
|
|
Cc: John David Anglin <dave.anglin@bell.net>
|
|
Cc: John Paul Adrian Glaubitz <glaubitz@physik.fu-berlin.de>
|
|
Cc: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
|
|
Cc: Matthew Wilcox (Oracle) <willy@infradead.org>
|
|
Cc: Max Filippov <jcmvbkbc@gmail.com>
|
|
Cc: Michael Ellerman <mpe@ellerman.id.au>
|
|
Cc: Michal Simek <monstr@monstr.eu>
|
|
Cc: Mike Kravetz <mike.kravetz@oracle.com>
|
|
Cc: Mike Rapoport (IBM) <rppt@kernel.org>
|
|
Cc: Palmer Dabbelt <palmer@dabbelt.com>
|
|
Cc: Peter Zijlstra <peterz@infradead.org>
|
|
Cc: Qi Zheng <zhengqi.arch@bytedance.com>
|
|
Cc: Russell King <linux@armlinux.org.uk>
|
|
Cc: Suren Baghdasaryan <surenb@google.com>
|
|
Cc: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
|
|
Cc: Thomas Gleixner <tglx@linutronix.de>
|
|
Cc: Will Deacon <will@kernel.org>
|
|
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
|
|
---
|
|
arch/powerpc/kvm/book3s_64_mmu_radix.c | 2 +-
|
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
|
|
|
diff --git a/arch/powerpc/kvm/book3s_64_mmu_radix.c b/arch/powerpc/kvm/book3s_64_mmu_radix.c
|
|
index e565a84cf..57fe60b51 100644
|
|
--- a/arch/powerpc/kvm/book3s_64_mmu_radix.c
|
|
+++ b/arch/powerpc/kvm/book3s_64_mmu_radix.c
|
|
@@ -502,7 +502,7 @@ static void kvmppc_unmap_free_pmd(struct kvm *kvm, pmd_t *pmd, bool full,
|
|
} else {
|
|
pte_t *pte;
|
|
|
|
- pte = pte_offset_map(p, 0);
|
|
+ pte = pte_offset_kernel(p, 0);
|
|
kvmppc_unmap_free_pte(kvm, pte, full, lpid);
|
|
pmd_clear(p);
|
|
}
|
|
--
|
|
2.39.5 (Apple Git-154)
|
|
|
|
|
|
From 8c62d250a23bbbb1ecd84d4d475e7623810275aa Mon Sep 17 00:00:00 2001
|
|
From: eabdullin <eabdullin@almalinux.org>
|
|
Date: Tue, 8 Apr 2025 10:13:43 +0300
|
|
Subject: [PATCH 3/3] powerpc/kvm: use mmu_invalidate_seq instead of
|
|
mmu_notifier_seq
|
|
|
|
---
|
|
arch/powerpc/kvm/book3s_64_vio_hv.c | 2 +-
|
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
|
|
|
diff --git a/arch/powerpc/kvm/book3s_64_vio_hv.c b/arch/powerpc/kvm/book3s_64_vio_hv.c
|
|
index f38dfe195..16e5872a1 100644
|
|
--- a/arch/powerpc/kvm/book3s_64_vio_hv.c
|
|
+++ b/arch/powerpc/kvm/book3s_64_vio_hv.c
|
|
@@ -488,7 +488,7 @@ long kvmppc_rm_h_put_tce_indirect(struct kvm_vcpu *vcpu,
|
|
/*
|
|
* used to check for invalidations in progress
|
|
*/
|
|
- mmu_seq = kvm->mmu_notifier_seq;
|
|
+ mmu_seq = kvm->mmu_invalidate_seq;
|
|
smp_rmb();
|
|
|
|
stt = kvmppc_find_table(vcpu->kvm, liobn);
|
|
--
|
|
2.39.5 (Apple Git-154)
|
|
|