From: Joerg Roedel <[email protected]> This will remove the need to update kvm_running_vcpu on plane switches.
Signed-off-by: Joerg Roedel <[email protected]> --- 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
