KVM: Factor out kvm_vcpu_kick to arch-generic code
PATCH 1/1 KVM: Factor out kvm_vcpu_kick to arch-generic code
The kvm_vcpu_kick function performs roughly the same funcitonality on most all architectures, so we shouldn't have separate copies.
PowerPC keeps a pointer to interchanging waitqueues on the vcpu_arch structure and to accomodate this special need a __KVM_HAVE_ARCH_VCPU_GET_WQ define and accompanying function kvm_arch_vcpu_wq have been defined. For all other architectures this is a generic inline that just returns &vcpu->wq;
This patch applies to Linus' tree on the Linux 3.3-rc1 tag.
--- arch/ia64/include/asm/kvm_host.h | 1 + arch/ia64/kvm/kvm-ia64.c | 15 --------------- arch/powerpc/include/asm/kvm_host.h | 6 ++++++ arch/powerpc/kvm/powerpc.c | 12 ++---------- arch/x86/kvm/x86.c | 17 ----------------- include/linux/kvm_host.h | 8 ++++++++ virt/kvm/kvm_main.c | 23 +++++++++++++++++++++++ 7 files changed, 40 insertions(+), 42 deletions(-)
arch/ia64/include/asm/kvm_host.h +1 -0
@@ -365,6 +365,7 @@ struct thash_cb { };struct kvm_vcpu_stat { +u32 halt_wakeup; };struct kvm_vcpu_arch {
arch/ia64/kvm/kvm-ia64.c +0 -15
@@ -1851,21 +1851,6 @@ void kvm_arch_hardware_unsetup(void) { } -void kvm_vcpu_kick (struct kvm_vcpu *vcpu) -{ -int me; -int cpu = vcpu->cpu; - -if (waitqueue_active (&vcpu->wq)) -wake_up_interruptible (&vcpu->wq); - - me =get_cpu (); -if (cpu != me && (unsigned ) cpu < nr_cpu_ids &&cpu_online (cpu)) -if (!test_and_set_bit (KVM_REQ_KICK , &vcpu->requests)) -smp_send_reschedule (cpu); -put_cpu (); -} -int kvm_apic_set_irq (struct kvm_vcpu *vcpu,struct kvm_lapic_irq *irq) {return __apic_accept_irq (vcpu, irq->vector);
arch/powerpc/include/asm/kvm_host.h +6 -0
@@ -438,4 +438,10 @@ struct kvm_vcpu_arch {#define KVMPPC_VCPU_BUSY_IN_HOST 1#define KVMPPC_VCPU_RUNNABLE 2 +#define __KVM_HAVE_ARCH_VCPU_GET_WQ 1 +static inline wait_queue_head *kvm_arch_vcpu_wq (struct kvm_vcpu *vcpu) +{ +return vcpu->arch.wqp; +} +#endif /* __POWERPC_KVM_HOST_H__ */
arch/powerpc/kvm/powerpc.c +2 -10
@@ -311,10 +311,7 @@ static void kvmppc_decrementer_func(unsigned long data)kvmppc_core_queue_dec (vcpu); -if (waitqueue_active (vcpu->arch.wqp)) { -wake_up_interruptible (vcpu->arch.wqp); - vcpu->stat.halt_wakeup++; - } +kvm_vcpu_kick (vcpu); }/*
@@ -572,12 +569,7 @@ int kvm_vcpu_ioctl_interrupt(struct kvm_vcpu *vcpu, struct kvm_interrupt *irq)kvmppc_core_queue_external (vcpu, irq); -if (waitqueue_active (vcpu->arch.wqp)) { -wake_up_interruptible (vcpu->arch.wqp); - vcpu->stat.halt_wakeup++; - }else if (vcpu->cpu !=-1 ) { -smp_send_reschedule (vcpu->cpu); - } +kvm_vcpu_kick (vcpu);return 0 ; }
arch/x86/kvm/x86.c +0 -17
@@ -6688,23 +6688,6 @@ int kvm_arch_vcpu_runnable(struct kvm_vcpu *vcpu) kvm_cpu_has_interrupt(vcpu)); } -void kvm_vcpu_kick (struct kvm_vcpu *vcpu) -{ -int me; -int cpu = vcpu->cpu; - -if (waitqueue_active (&vcpu->wq)) { -wake_up_interruptible (&vcpu->wq); - ++vcpu->stat.halt_wakeup; - } - - me =get_cpu (); -if (cpu != me && (unsigned )cpu < nr_cpu_ids &&cpu_online (cpu)) -if (kvm_vcpu_exiting_guest_mode (vcpu) ==IN_GUEST_MODE ) -smp_send_reschedule (cpu); -put_cpu (); -} -int kvm_arch_interrupt_allowed (struct kvm_vcpu *vcpu) {return kvm_x86_ops->interrupt_allowed (vcpu);
include/linux/kvm_host.h +8 -0
@@ -407,6 +407,7 @@ void mark_page_dirty_in_slot(struct kvm *kvm, struct kvm_memory_slot *memslot, gfn_t gfn);void kvm_vcpu_block (struct kvm_vcpu *vcpu); +void kvm_vcpu_kick (struct kvm_vcpu *vcpu);void kvm_vcpu_on_spin (struct kvm_vcpu *vcpu);void kvm_resched (struct kvm_vcpu *vcpu);void kvm_load_guest_fpu (struct kvm_vcpu *vcpu);
@@ -489,6 +490,13 @@ static inline void kvm_arch_free_vm(struct kvm *kvm) }#endif +#ifndef __KVM_HAVE_ARCH_VCPU_GET_WQ +static inline wait_queue_head_t *kvm_arch_vcpu_wq (struct kvm_vcpu *vcpu) +{ +return &vcpu->wq; +} +#endif +int kvm_arch_init_vm (struct kvm *kvm);void kvm_arch_destroy_vm (struct kvm *kvm);void kvm_free_all_assigned_devices (struct kvm *kvm);
virt/kvm/kvm_main.c +23 -0
@@ -153,6 +153,7 @@ void vcpu_load(struct kvm_vcpu *vcpu) cpu =get_cpu ();preempt_notifier_register (&vcpu->preempt_notifier);kvm_arch_vcpu_load (vcpu, cpu); + vcpu->cpu = cpu;put_cpu (); }
@@ -1528,6 +1529,28 @@ void kvm_vcpu_block(struct kvm_vcpu *vcpu)finish_wait (&vcpu->wq, &wait); } +/* +* Kick a sleeping VCPU, or a guest VCPU in guest mode, into host kernel mode. +*/ +void kvm_vcpu_kick (struct kvm_vcpu *vcpu) +{ +int me; +int cpu = vcpu->cpu; +wait_queue_head_t *wqp; + + wqp =kvm_arch_vcpu_wq (vcpu); +if (waitqueue_active (wqp)) { +wake_up_interruptible (wqp); + ++vcpu->stat.halt_wakeup; + } + + me =get_cpu (); +if (cpu != me && (unsigned )cpu < nr_cpu_ids &&cpu_online (cpu)) +if (kvm_vcpu_exiting_guest_mode (vcpu) ==IN_GUEST_MODE ) +smp_send_reschedule (cpu); +put_cpu (); +} +void kvm_resched (struct kvm_vcpu *vcpu) {if (!need_resched ())
virt/kvm/kvm_main.c void vcpu_load(struct kvm_vcpu *vcpu) · line 156
Quoted 9 lines · Christoffer Dall
virt/kvm/kvm_main.c +1
-0@@ -153,6 +153,7 @@ void vcpu_load(struct kvm_vcpu *vcpu) cpu =get_cpu ();preempt_notifier_register (&vcpu->preempt_notifier);kvm_arch_vcpu_load (vcpu, cpu); + vcpu->cpu = cpu;
That means setting it in the various kvm_arch_vcpu_load handlers becomes redundant and should be cleaned up.
Jan
Signature · 2 lines
Siemens AG, Corporate Technology, CT T DE IT 1 Corporate Competence Center Embedded Linux
Quoted 187 lines · Christoffer Dall
The
kvm_vcpu_kickfunction performs roughly the same funcitonality on most all architectures, so we shouldn't have separate copies.PowerPC keeps a pointer to interchanging waitqueues on the
vcpu_archstructure and to accomodate this special need a__KVM_HAVE_ARCH_VCPU_GET_WQdefine and accompanying functionkvm_arch_vcpu_wqhave been defined. For all other architectures this is a generic inline that just returns&vcpu->wq;This patch applies to Linus' tree on the Linux 3.3-rc1 tag.
Signed-off-by Christoffer Dall <[email protected]>--- arch/ia64/include/asm/kvm_host.h | 1 + arch/ia64/kvm/kvm-ia64.c | 15 --------------- arch/powerpc/include/asm/kvm_host.h | 6 ++++++ arch/powerpc/kvm/powerpc.c | 12 ++---------- arch/x86/kvm/x86.c | 17 ----------------- include/linux/kvm_host.h | 8 ++++++++ virt/kvm/kvm_main.c | 23 +++++++++++++++++++++++ 7 files changed, 40 insertions(+), 42 deletions(-)arch/ia64/include/asm/kvm_host.h +1
-0@@ -365,6 +365,7 @@ struct thash_cb { };struct kvm_vcpu_stat { +u32 halt_wakeup; };struct kvm_vcpu_arch {arch/ia64/kvm/kvm-ia64.c +0
-15@@ -1851,21 +1851,6 @@ void kvm_arch_hardware_unsetup(void) { } -void kvm_vcpu_kick (struct kvm_vcpu *vcpu) -{ -int me; -int cpu = vcpu->cpu; - -if (waitqueue_active (&vcpu->wq)) -wake_up_interruptible (&vcpu->wq); - - me =get_cpu (); -if (cpu != me && (unsigned ) cpu < nr_cpu_ids &&cpu_online (cpu)) -if (!test_and_set_bit (KVM_REQ_KICK , &vcpu->requests)) -smp_send_reschedule (cpu); -put_cpu (); -} -int kvm_apic_set_irq (struct kvm_vcpu *vcpu,struct kvm_lapic_irq *irq) {return __apic_accept_irq (vcpu, irq->vector);arch/powerpc/include/asm/kvm_host.h +6
-0@@ -438,4 +438,10 @@ struct kvm_vcpu_arch {#define KVMPPC_VCPU_BUSY_IN_HOST 1#define KVMPPC_VCPU_RUNNABLE 2 +#define __KVM_HAVE_ARCH_VCPU_GET_WQ 1 +static inline wait_queue_head *kvm_arch_vcpu_wq (struct kvm_vcpu *vcpu) +{ +return vcpu->arch.wqp; +} +#endif /* __POWERPC_KVM_HOST_H__ */ arch/powerpc/kvm/powerpc.c +2
-10@@ -311,10 +311,7 @@ static void kvmppc_decrementer_func(unsigned long data)kvmppc_core_queue_dec (vcpu); -if (waitqueue_active (vcpu->arch.wqp)) { -wake_up_interruptible (vcpu->arch.wqp); - vcpu->stat.halt_wakeup++; - } +kvm_vcpu_kick (vcpu); }/* @@ -572,12 +569,7 @@ int kvm_vcpu_ioctl_interrupt(struct kvm_vcpu *vcpu, struct kvm_interrupt *irq)kvmppc_core_queue_external (vcpu, irq); -if (waitqueue_active (vcpu->arch.wqp)) { -wake_up_interruptible (vcpu->arch.wqp); - vcpu->stat.halt_wakeup++; - }else if (vcpu->cpu !=-1 ) { -smp_send_reschedule (vcpu->cpu); - } +kvm_vcpu_kick (vcpu);return 0 ; }arch/x86/kvm/x86.c +0
-17@@ -6688,23 +6688,6 @@ int kvm_arch_vcpu_runnable(struct kvm_vcpu *vcpu) kvm_cpu_has_interrupt(vcpu)); } -void kvm_vcpu_kick (struct kvm_vcpu *vcpu) -{ -int me; -int cpu = vcpu->cpu; - -if (waitqueue_active (&vcpu->wq)) { -wake_up_interruptible (&vcpu->wq); - ++vcpu->stat.halt_wakeup; - } - - me =get_cpu (); -if (cpu != me && (unsigned )cpu < nr_cpu_ids &&cpu_online (cpu)) -if (kvm_vcpu_exiting_guest_mode (vcpu) =IN_GUEST_MODE ) -smp_send_reschedule (cpu); -put_cpu (); -} -int kvm_arch_interrupt_allowed (struct kvm_vcpu *vcpu) {return kvm_x86_ops->interrupt_allowed (vcpu);include/linux/kvm_host.h +8
-0@@ -407,6 +407,7 @@ void mark_page_dirty_in_slot(struct kvm *kvm, struct kvm_memory_slot *memslot, gfn_t gfn);void kvm_vcpu_block (struct kvm_vcpu *vcpu); +void kvm_vcpu_kick (struct kvm_vcpu *vcpu);void kvm_vcpu_on_spin (struct kvm_vcpu *vcpu);void kvm_resched (struct kvm_vcpu *vcpu);void kvm_load_guest_fpu (struct kvm_vcpu *vcpu);@@ -489,6 +490,13 @@ static inline void kvm_arch_free_vm(struct kvm *kvm) }#endif +#ifndef __KVM_HAVE_ARCH_VCPU_GET_WQ +static inline wait_queue_head_t *kvm_arch_vcpu_wq (struct kvm_vcpu *vcpu) +{ +return &vcpu->wq; +} +#endif +int kvm_arch_init_vm (struct kvm *kvm);void kvm_arch_destroy_vm (struct kvm *kvm);void kvm_free_all_assigned_devices (struct kvm *kvm);virt/kvm/kvm_main.c +13
-0@@ -153,6 +153,7 @@ void vcpu_load(struct kvm_vcpu *vcpu) cpu =get_cpu ();preempt_notifier_register (&vcpu->preempt_notifier);kvm_arch_vcpu_load (vcpu, cpu); + vcpu->cpu = cpu;put_cpu (); }@@ -1528,6 +1529,28 @@ void kvm_vcpu_block(struct kvm_vcpu *vcpu)finish_wait (&vcpu->wq, &wait); } +/* +* Kick a sleeping VCPU, or a guest VCPU in guest mode, into host kernel mode. +*/ +void kvm_vcpu_kick (struct kvm_vcpu *vcpu) +{ +int me; +int cpu = vcpu->cpu; +wait_queue_head_t *wqp; + + wqp =kvm_arch_vcpu_wq (vcpu); +if (waitqueue_active (wqp)) { +wake_up_interruptible (wqp);
virt/kvm/kvm_main.c void kvm_vcpu_block(struct kvm_vcpu *vcpu) · line 1553
Quoted 10 lines
virt/kvm/kvm_main.c +10
-0+ ++vcpu->stat.halt_wakeup; + } + + me =get_cpu (); +if (cpu != me && (unsigned )cpu < nr_cpu_ids &&cpu_online (cpu)) +if (kvm_vcpu_exiting_guest_mode (vcpu) =IN_GUEST_MODE ) +smp_send_reschedule (cpu); +put_cpu (); +} +
Only x86 and IA-64 set appropriate values for vcpu->mode. You probably want to abstract the test away.