[PATCH 26/60] kvm: Introduce arch-specific plane state

From: Jörg Rödel

Date: Mon Jun 08 2026 - 12:21:06 EST


From: Joerg Roedel <joerg.roedel@xxxxxxx>

Introduce struct kvm_arch_plane which is per architecture and will be
used to store architecture-specific per-plane state.

Signed-off-by: Joerg Roedel <joerg.roedel@xxxxxxx>
---
arch/arm64/include/asm/kvm_host.h | 12 ++++++++++++
arch/loongarch/include/asm/kvm_host.h | 12 ++++++++++++
arch/mips/include/asm/kvm_host.h | 12 ++++++++++++
arch/powerpc/include/asm/kvm_host.h | 12 ++++++++++++
arch/riscv/include/asm/kvm_host.h | 12 ++++++++++++
arch/s390/include/asm/kvm_host.h | 12 ++++++++++++
arch/x86/include/asm/kvm_host.h | 12 ++++++++++++
include/linux/kvm_host.h | 2 ++
include/linux/kvm_types.h | 1 +
virt/kvm/kvm_main.c | 9 +++++++++
10 files changed, 96 insertions(+)

diff --git a/arch/arm64/include/asm/kvm_host.h b/arch/arm64/include/asm/kvm_host.h
index 32dc484781f0..e9cca2adb371 100644
--- a/arch/arm64/include/asm/kvm_host.h
+++ b/arch/arm64/include/asm/kvm_host.h
@@ -306,6 +306,18 @@ enum fgt_group_id {
__NR_FGT_GROUP_IDS__
};

+/* Per-plane state of VM */
+struct kvm_arch_plane {};
+
+static inline int kvm_arch_plane_init(struct kvm *kvm,
+ struct kvm_plane *plane,
+ unsigned plane_level)
+{
+ return 0;
+}
+
+static inline void kvm_arch_plane_destroy(struct kvm_plane *plane) {}
+
struct kvm_arch {
struct kvm_s2_mmu mmu;

diff --git a/arch/loongarch/include/asm/kvm_host.h b/arch/loongarch/include/asm/kvm_host.h
index 776bc487a705..225aa87ebbdd 100644
--- a/arch/loongarch/include/asm/kvm_host.h
+++ b/arch/loongarch/include/asm/kvm_host.h
@@ -116,6 +116,18 @@ struct kvm_phyid_map {
struct kvm_phyid_info phys_map[KVM_MAX_PHYID];
};

+/* Per-plane state of VM */
+struct kvm_arch_plane {};
+
+static inline int kvm_arch_plane_init(struct kvm *kvm,
+ struct kvm_plane *plane,
+ unsigned plane_level)
+{
+ return 0;
+}
+
+static inline void kvm_arch_plane_destroy(struct kvm_plane *plane) {}
+
struct kvm_arch {
/* Guest physical mm */
kvm_pte_t *pgd;
diff --git a/arch/mips/include/asm/kvm_host.h b/arch/mips/include/asm/kvm_host.h
index c14b10821817..b01911eb9064 100644
--- a/arch/mips/include/asm/kvm_host.h
+++ b/arch/mips/include/asm/kvm_host.h
@@ -172,6 +172,18 @@ struct loongson_kvm_ipi {
};
#endif

+/* Per-plane state of VM */
+struct kvm_arch_plane {};
+
+static inline int kvm_arch_plane_init(struct kvm *kvm,
+ struct kvm_plane *plane,
+ unsigned plane_level)
+{
+ return 0;
+}
+
+static inline void kvm_arch_plane_destroy(struct kvm_plane *plane) {}
+
struct kvm_arch {
/* Guest physical mm */
struct mm_struct gpa_mm;
diff --git a/arch/powerpc/include/asm/kvm_host.h b/arch/powerpc/include/asm/kvm_host.h
index 2d139c807577..c5b9fbaf34f3 100644
--- a/arch/powerpc/include/asm/kvm_host.h
+++ b/arch/powerpc/include/asm/kvm_host.h
@@ -269,6 +269,18 @@ struct kvm_hpt_info {

struct kvm_resize_hpt;

+/* Per-plane state of VM */
+struct kvm_arch_plane {};
+
+static inline int kvm_arch_plane_init(struct kvm *kvm,
+ struct kvm_plane *plane,
+ unsigned plane_level)
+{
+ return 0;
+}
+
+static inline void kvm_arch_plane_destroy(struct kvm_plane *plane) {}
+
/* Flag values for kvm_arch.secure_guest */
#define KVMPPC_SECURE_INIT_START 0x1 /* H_SVM_INIT_START has been called */
#define KVMPPC_SECURE_INIT_DONE 0x2 /* H_SVM_INIT_DONE completed */
diff --git a/arch/riscv/include/asm/kvm_host.h b/arch/riscv/include/asm/kvm_host.h
index 75b0a951c1bc..bcbf487d4cb7 100644
--- a/arch/riscv/include/asm/kvm_host.h
+++ b/arch/riscv/include/asm/kvm_host.h
@@ -76,6 +76,18 @@ struct kvm_vcpu_stat {
struct kvm_arch_memory_slot {
};

+/* Per-plane state of VM */
+struct kvm_arch_plane {};
+
+static inline int kvm_arch_plane_init(struct kvm *kvm,
+ struct kvm_plane *plane,
+ unsigned plane_level)
+{
+ return 0;
+}
+
+static inline void kvm_arch_plane_destroy(struct kvm_plane *plane) {}
+
struct kvm_arch {
/* G-stage vmid */
struct kvm_vmid vmid;
diff --git a/arch/s390/include/asm/kvm_host.h b/arch/s390/include/asm/kvm_host.h
index 8a4f4a39f7a2..bb3bfbfd35d8 100644
--- a/arch/s390/include/asm/kvm_host.h
+++ b/arch/s390/include/asm/kvm_host.h
@@ -638,6 +638,18 @@ struct kvm_s390_pv {

struct kvm_s390_mmu_cache;

+/* Per-plane state of VM */
+struct kvm_arch_plane {};
+
+static inline int kvm_arch_plane_init(struct kvm *kvm,
+ struct kvm_plane *plane,
+ unsigned plane_level)
+{
+ return 0;
+}
+
+static inline void kvm_arch_plane_destroy(struct kvm_plane *plane) {}
+
struct kvm_arch {
struct esca_block *sca;
debug_info_t *dbf;
diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h
index 43c92f0ada1e..dd95c70bfdba 100644
--- a/arch/x86/include/asm/kvm_host.h
+++ b/arch/x86/include/asm/kvm_host.h
@@ -1412,6 +1412,18 @@ enum kvm_mmu_type {
KVM_NR_MMU_TYPES,
};

+/* Per-plane state of VM */
+struct kvm_arch_plane {};
+
+static inline int kvm_arch_plane_init(struct kvm *kvm,
+ struct kvm_plane *plane,
+ unsigned plane_level)
+{
+ return 0;
+}
+
+static inline void kvm_arch_plane_destroy(struct kvm_plane *plane) {}
+
struct kvm_arch {
unsigned long n_used_mmu_pages;
unsigned long n_requested_mmu_pages;
diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h
index 7d06459a06f3..4a0eaa1de479 100644
--- a/include/linux/kvm_host.h
+++ b/include/linux/kvm_host.h
@@ -847,6 +847,8 @@ struct kvm_plane {

/* Per-Plane VCPU array */
struct xarray vcpu_array;
+
+ struct kvm_arch_plane arch;
};

struct kvm {
diff --git a/include/linux/kvm_types.h b/include/linux/kvm_types.h
index a568d8e6f4e8..07e82928c948 100644
--- a/include/linux/kvm_types.h
+++ b/include/linux/kvm_types.h
@@ -42,6 +42,7 @@ struct kvm_interrupt;
struct kvm_irq_routing_table;
struct kvm_memory_slot;
struct kvm_one_reg;
+struct kvm_plane;
struct kvm_run;
struct kvm_userspace_memory_region;
struct kvm_vcpu;
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
index f85ddb0fc781..91fb9abf9b31 100644
--- a/virt/kvm/kvm_main.c
+++ b/virt/kvm/kvm_main.c
@@ -1211,13 +1211,22 @@ static struct kvm_plane *kvm_create_plane(struct kvm *kvm, unsigned plane_level)

xa_init(&plane->vcpu_array);

+ if (kvm_arch_plane_init(kvm, plane, plane_level))
+ goto out_free_plane;
+
kvm->planes[plane_level] = plane;

return plane;
+
+out_free_plane:
+ kfree(plane);
+
+ return NULL;
}

static void kvm_destroy_one_plane(struct kvm_plane *plane)
{
+ kvm_arch_plane_destroy(plane);
kfree(plane);
}

--
2.53.0