[PATCH 14/60] kvm: Make kvm_running_vcpus point to struct kvm_vcpu_common
From: Jörg Rödel <joro@8bytes.org>
Date: 2026-06-08 14:43:16
Also in:
kvm, kvm-riscv, kvmarm, linux-mips, lkml, loongarch
Subsystem:
arm64 port (aarch64 architecture), kernel virtual machine (kvm), kernel virtual machine for arm64 (kvm/arm64), the rest · Maintainers:
Catalin Marinas, Will Deacon, Paolo Bonzini, Marc Zyngier, Oliver Upton, Linus Torvalds
From: Joerg Roedel <redacted> This will remove the need to update kvm_running_vcpu on plane switches. Signed-off-by: Joerg Roedel <redacted> --- arch/arm64/kvm/arch_timer.c | 3 ++- arch/arm64/kvm/vgic/vgic-init.c | 3 ++- include/linux/kvm_host.h | 2 +- virt/kvm/kvm_main.c | 18 +++++++++++------- 4 files changed, 16 insertions(+), 10 deletions(-)
diff --git a/arch/arm64/kvm/arch_timer.c b/arch/arm64/kvm/arch_timer.c
index cbea4d9ee955..b2c4f422414e 100644
--- a/arch/arm64/kvm/arch_timer.c
+++ b/arch/arm64/kvm/arch_timer.c@@ -204,7 +204,8 @@ static void soft_timer_cancel(struct hrtimer *hrt) static irqreturn_t kvm_arch_timer_handler(int irq, void *dev_id) { - struct kvm_vcpu *vcpu = *(struct kvm_vcpu **)dev_id; + struct kvm_vcpu_common *common = *(struct kvm_vcpu_common **)dev_id; + struct kvm_vcpu *vcpu = common->current_vcpu; struct arch_timer_context *ctx; struct timer_map map;
diff --git a/arch/arm64/kvm/vgic/vgic-init.c b/arch/arm64/kvm/vgic/vgic-init.c
index 933983bb2005..a12b89b423d5 100644
--- a/arch/arm64/kvm/vgic/vgic-init.c
+++ b/arch/arm64/kvm/vgic/vgic-init.c@@ -730,7 +730,8 @@ void kvm_vgic_cpu_down(void) static irqreturn_t vgic_maintenance_handler(int irq, void *data) { - struct kvm_vcpu *vcpu = *(struct kvm_vcpu **)data; + struct kvm_vcpu_common *common = *(struct kvm_vcpu_common **)data; + struct kvm_vcpu *vcpu = common->current_vcpu; /* * We cannot rely on the vgic maintenance interrupt to be
diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h
index b334c15d834e..d54f299218a4 100644
--- a/include/linux/kvm_host.h
+++ b/include/linux/kvm_host.h@@ -2462,7 +2462,7 @@ static inline bool kvm_is_visible_memslot(struct kvm_memory_slot *memslot) } struct kvm_vcpu *kvm_get_running_vcpu(void); -struct kvm_vcpu * __percpu *kvm_get_running_vcpus(void); +struct kvm_vcpu_common * __percpu *kvm_get_running_vcpus(void); #if IS_ENABLED(CONFIG_HAVE_KVM_IRQ_BYPASS) struct kvm_kernel_irqfd;
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
index 2c16e124a507..9c07321e30f4 100644
--- a/virt/kvm/kvm_main.c
+++ b/virt/kvm/kvm_main.c@@ -113,7 +113,7 @@ LIST_HEAD(vm_list); static struct kmem_cache *kvm_vcpu_cache; static __read_mostly struct preempt_ops kvm_preempt_ops; -static DEFINE_PER_CPU(struct kvm_vcpu *, kvm_running_vcpu); +static DEFINE_PER_CPU(struct kvm_vcpu_common *, kvm_running_vcpu); static struct dentry *kvm_debugfs_dir;
@@ -165,7 +165,7 @@ void vcpu_load(struct kvm_vcpu *vcpu) { int cpu = get_cpu(); - __this_cpu_write(kvm_running_vcpu, vcpu); + __this_cpu_write(kvm_running_vcpu, vcpu->common); preempt_notifier_register(&vcpu->preempt_notifier); kvm_arch_vcpu_load(vcpu, cpu); put_cpu();
@@ -3954,7 +3954,7 @@ void __kvm_vcpu_kick(struct kvm_vcpu *vcpu, bool wait) * kick" check does not need atomic operations if kvm_vcpu_kick is used * within the vCPU thread itself. */ - if (vcpu == __this_cpu_read(kvm_running_vcpu)) { + if (vcpu == kvm_get_running_vcpu()) { if (vcpu->mode == IN_GUEST_MODE) WRITE_ONCE(vcpu->mode, EXITING_GUEST_MODE); goto out;
@@ -6500,7 +6500,7 @@ static void kvm_sched_in(struct preempt_notifier *pn, int cpu) WRITE_ONCE(vcpu->preempted, false); WRITE_ONCE(vcpu->ready, false); - __this_cpu_write(kvm_running_vcpu, vcpu); + __this_cpu_write(kvm_running_vcpu, vcpu->common); kvm_arch_vcpu_load(vcpu, cpu); WRITE_ONCE(vcpu->scheduled_out, false);
@@ -6532,12 +6532,16 @@ static void kvm_sched_out(struct preempt_notifier *pn, */ struct kvm_vcpu *kvm_get_running_vcpu(void) { - struct kvm_vcpu *vcpu; + struct kvm_vcpu_common *common; + struct kvm_vcpu *vcpu = NULL; preempt_disable(); - vcpu = __this_cpu_read(kvm_running_vcpu); + common = __this_cpu_read(kvm_running_vcpu); preempt_enable(); + if (common) + vcpu = common->current_vcpu; + return vcpu; } EXPORT_SYMBOL_FOR_KVM_INTERNAL(kvm_get_running_vcpu);
@@ -6545,7 +6549,7 @@ EXPORT_SYMBOL_FOR_KVM_INTERNAL(kvm_get_running_vcpu); /** * kvm_get_running_vcpus - get the per-CPU array of currently running vcpus. */ -struct kvm_vcpu * __percpu *kvm_get_running_vcpus(void) +struct kvm_vcpu_common * __percpu *kvm_get_running_vcpus(void) { return &kvm_running_vcpu; }
--
2.53.0