* [patch 0/2] use smp_send_reschedule in kvm_vcpu_kick (v3) @ 2009-04-14 0:41 Marcelo Tosatti 2009-04-14 0:41 ` [patch 1/2] IA64: export smp_send_reschedule Marcelo Tosatti 2009-04-14 0:41 ` [patch 2/2] KVM: use smp_send_reschedule in kvm_vcpu_kick Marcelo Tosatti 0 siblings, 2 replies; 6+ messages in thread From: Marcelo Tosatti @ 2009-04-14 0:41 UTC (permalink / raw) To: kvm This is needed to fix http://www.mail-archive.com/kvm@vger.kernel.org/msg11004.html with the added benefit of collapsing IPI's. - Export smp_send_reschedule on IA64 as requested by Xiantao Zhang. - Possible to use workqueue on compat code (< 2.6.24). -- ^ permalink raw reply [flat|nested] 6+ messages in thread
* [patch 1/2] IA64: export smp_send_reschedule 2009-04-14 0:41 [patch 0/2] use smp_send_reschedule in kvm_vcpu_kick (v3) Marcelo Tosatti @ 2009-04-14 0:41 ` Marcelo Tosatti 2009-04-14 1:56 ` Zhang, Xiantao 2009-04-14 0:41 ` [patch 2/2] KVM: use smp_send_reschedule in kvm_vcpu_kick Marcelo Tosatti 1 sibling, 1 reply; 6+ messages in thread From: Marcelo Tosatti @ 2009-04-14 0:41 UTC (permalink / raw) To: kvm; +Cc: xiantao.zhang, Gleb Natapov, Marcelo Tosatti [-- Attachment #1: export-smp-send-resched-on-ia64 --] [-- Type: text/plain, Size: 521 bytes --] To be used by KVM. CC: <xiantao.zhang@intel.com> CC: Gleb Natapov <gleb@redhat.com> Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com> Index: kvm/arch/ia64/kernel/smp.c =================================================================== --- kvm.orig/arch/ia64/kernel/smp.c +++ kvm/arch/ia64/kernel/smp.c @@ -225,6 +225,7 @@ smp_send_reschedule (int cpu) { platform_send_ipi(cpu, IA64_IPI_RESCHEDULE, IA64_IPI_DM_INT, 0); } +EXPORT_SYMBOL_GPL(smp_send_reschedule); /* * Called with preemption disabled. -- ^ permalink raw reply [flat|nested] 6+ messages in thread
* RE: [patch 1/2] IA64: export smp_send_reschedule 2009-04-14 0:41 ` [patch 1/2] IA64: export smp_send_reschedule Marcelo Tosatti @ 2009-04-14 1:56 ` Zhang, Xiantao 2009-04-14 17:41 ` Luck, Tony 0 siblings, 1 reply; 6+ messages in thread From: Zhang, Xiantao @ 2009-04-14 1:56 UTC (permalink / raw) To: Marcelo Tosatti, kvm, Luck, Tony; +Cc: Gleb Natapov Hi, Tony Could you help to ack the patch ? Xiantao Acked-by: Xiantao Zhang <xiantao.zhang@intel.com> Marcelo Tosatti wrote: > To be used by KVM. > > CC: <xiantao.zhang@intel.com> > CC: Gleb Natapov <gleb@redhat.com> > Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com> > > Index: kvm/arch/ia64/kernel/smp.c > =================================================================== > --- kvm.orig/arch/ia64/kernel/smp.c > +++ kvm/arch/ia64/kernel/smp.c > @@ -225,6 +225,7 @@ smp_send_reschedule (int cpu) > { > platform_send_ipi(cpu, IA64_IPI_RESCHEDULE, IA64_IPI_DM_INT, 0); > } > +EXPORT_SYMBOL_GPL(smp_send_reschedule); > > /* > * Called with preemption disabled. ^ permalink raw reply [flat|nested] 6+ messages in thread
* RE: [patch 1/2] IA64: export smp_send_reschedule 2009-04-14 1:56 ` Zhang, Xiantao @ 2009-04-14 17:41 ` Luck, Tony 2009-04-14 21:08 ` Marcelo Tosatti 0 siblings, 1 reply; 6+ messages in thread From: Luck, Tony @ 2009-04-14 17:41 UTC (permalink / raw) To: Zhang, Xiantao, Marcelo Tosatti, kvm; +Cc: Gleb Natapov I could do more than Ack it, I could apply it (since it is in arch/ia64. But "To be used by KVM" is a bit vague for a commit description. A bit more detail please. -Tony -----Original Message----- From: Zhang, Xiantao Sent: Monday, April 13, 2009 6:57 PM To: Marcelo Tosatti; kvm@vger.kernel.org; Luck, Tony Cc: Gleb Natapov Subject: RE: [patch 1/2] IA64: export smp_send_reschedule Hi, Tony Could you help to ack the patch ? Xiantao Acked-by: Xiantao Zhang <xiantao.zhang@intel.com> Marcelo Tosatti wrote: > To be used by KVM. > > CC: <xiantao.zhang@intel.com> > CC: Gleb Natapov <gleb@redhat.com> > Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com> > > Index: kvm/arch/ia64/kernel/smp.c > =================================================================== > --- kvm.orig/arch/ia64/kernel/smp.c > +++ kvm/arch/ia64/kernel/smp.c > @@ -225,6 +225,7 @@ smp_send_reschedule (int cpu) > { > platform_send_ipi(cpu, IA64_IPI_RESCHEDULE, IA64_IPI_DM_INT, 0); > } > +EXPORT_SYMBOL_GPL(smp_send_reschedule); > > /* > * Called with preemption disabled. ^ permalink raw reply [flat|nested] 6+ messages in thread
* IA64: export smp_send_reschedule 2009-04-14 17:41 ` Luck, Tony @ 2009-04-14 21:08 ` Marcelo Tosatti 0 siblings, 0 replies; 6+ messages in thread From: Marcelo Tosatti @ 2009-04-14 21:08 UTC (permalink / raw) To: Luck, Tony; +Cc: Zhang, Xiantao, kvm, Gleb Natapov KVM will use smp_send_reschedule to force a cpu out of guest mode. Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com> Index: kvm/arch/ia64/kernel/smp.c =================================================================== --- kvm.orig/arch/ia64/kernel/smp.c +++ kvm/arch/ia64/kernel/smp.c @@ -225,6 +225,7 @@ smp_send_reschedule (int cpu) { platform_send_ipi(cpu, IA64_IPI_RESCHEDULE, IA64_IPI_DM_INT, 0); } +EXPORT_SYMBOL_GPL(smp_send_reschedule); /* * Called with preemption disabled. ^ permalink raw reply [flat|nested] 6+ messages in thread
* [patch 2/2] KVM: use smp_send_reschedule in kvm_vcpu_kick 2009-04-14 0:41 [patch 0/2] use smp_send_reschedule in kvm_vcpu_kick (v3) Marcelo Tosatti 2009-04-14 0:41 ` [patch 1/2] IA64: export smp_send_reschedule Marcelo Tosatti @ 2009-04-14 0:41 ` Marcelo Tosatti 1 sibling, 0 replies; 6+ messages in thread From: Marcelo Tosatti @ 2009-04-14 0:41 UTC (permalink / raw) To: kvm; +Cc: Gleb Natapov, Marcelo Tosatti [-- Attachment #1: smp-send-resch --] [-- Type: text/plain, Size: 5391 bytes --] KVM uses a function call IPI to cause the exit of a guest running on a physical cpu. For virtual interrupt notification there is no need to wait on IPI receival, or to execute any function. This is exactly what the reschedule IPI does, without the overhead of function IPI. So use it instead of smp_call_function_single in kvm_vcpu_kick. Also change the "guest_mode" variable to a bit in vcpu->requests, and use that to collapse multiple IPI's that would be issued between the first one and zeroing of guest mode. This allows kvm_vcpu_kick to called with interrupts disabled. Untested on IA64. CC: Gleb Natapov <gleb@redhat.com> Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com> Index: kvm/arch/ia64/kernel/irq_ia64.c =================================================================== --- kvm.orig/arch/ia64/kernel/irq_ia64.c +++ kvm/arch/ia64/kernel/irq_ia64.c @@ -610,6 +610,9 @@ static struct irqaction ipi_irqaction = .name = "IPI" }; +/* + * KVM uses this interrupt to force a cpu out of guest mode + */ static struct irqaction resched_irqaction = { .handler = dummy_handler, .flags = IRQF_DISABLED, Index: kvm/arch/ia64/kvm/kvm-ia64.c =================================================================== --- kvm.orig/arch/ia64/kvm/kvm-ia64.c +++ kvm/arch/ia64/kvm/kvm-ia64.c @@ -673,7 +673,7 @@ again: goto out; } - vcpu->guest_mode = 1; + clear_bit(KVM_REQ_KICK, &vcpu->requests); kvm_guest_enter(); down_read(&vcpu->kvm->slots_lock); r = vti_vcpu_run(vcpu, kvm_run); @@ -685,7 +685,7 @@ again: } vcpu->arch.launched = 1; - vcpu->guest_mode = 0; + set_bit(KVM_REQ_KICK, &vcpu->requests); local_irq_enable(); /* @@ -1875,24 +1875,17 @@ void kvm_arch_hardware_unsetup(void) { } -static void vcpu_kick_intr(void *info) -{ -#ifdef DEBUG - struct kvm_vcpu *vcpu = (struct kvm_vcpu *)info; - printk(KERN_DEBUG"vcpu_kick_intr %p \n", vcpu); -#endif -} - void kvm_vcpu_kick(struct kvm_vcpu *vcpu) { - int ipi_pcpu = vcpu->cpu; - int cpu = get_cpu(); + int me = get_cpu(); + int cpu = vcpu->cpu; if (waitqueue_active(&vcpu->wq)) wake_up_interruptible(&vcpu->wq); - if (vcpu->guest_mode && cpu != ipi_pcpu) - smp_call_function_single(ipi_pcpu, vcpu_kick_intr, vcpu, 0); + 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(); } Index: kvm/arch/x86/kernel/smp.c =================================================================== --- kvm.orig/arch/x86/kernel/smp.c +++ kvm/arch/x86/kernel/smp.c @@ -172,6 +172,9 @@ void smp_reschedule_interrupt(struct pt_ { ack_APIC_irq(); inc_irq_stat(irq_resched_count); + /* + * KVM uses this interrupt to force a cpu out of guest mode + */ } void smp_call_function_interrupt(struct pt_regs *regs) Index: kvm/arch/x86/kvm/x86.c =================================================================== --- kvm.orig/arch/x86/kvm/x86.c +++ kvm/arch/x86/kvm/x86.c @@ -3146,6 +3146,9 @@ static int vcpu_enter_guest(struct kvm_v local_irq_disable(); + clear_bit(KVM_REQ_KICK, &vcpu->requests); + smp_mb__after_clear_bit(); + if (vcpu->requests || need_resched() || signal_pending(current)) { local_irq_enable(); preempt_enable(); @@ -3153,13 +3156,6 @@ static int vcpu_enter_guest(struct kvm_v goto out; } - vcpu->guest_mode = 1; - /* - * Make sure that guest_mode assignment won't happen after - * testing the pending IRQ vector bitmap. - */ - smp_wmb(); - if (vcpu->arch.exception.pending) __queue_exception(vcpu); else if (irqchip_in_kernel(vcpu->kvm)) @@ -3201,7 +3197,7 @@ static int vcpu_enter_guest(struct kvm_v set_debugreg(vcpu->arch.host_dr6, 6); set_debugreg(vcpu->arch.host_dr7, 7); - vcpu->guest_mode = 0; + set_bit(KVM_REQ_KICK, &vcpu->requests); local_irq_enable(); ++vcpu->stat.exits; @@ -4483,29 +4479,20 @@ int kvm_arch_vcpu_runnable(struct kvm_vc || vcpu->arch.nmi_pending; } -static void vcpu_kick_intr(void *info) -{ -#ifdef DEBUG - struct kvm_vcpu *vcpu = (struct kvm_vcpu *)info; - printk(KERN_DEBUG "vcpu_kick_intr %p \n", vcpu); -#endif -} - void kvm_vcpu_kick(struct kvm_vcpu *vcpu) { - int ipi_pcpu = vcpu->cpu; - int cpu = get_cpu(); + int me = get_cpu(); + int cpu = vcpu->cpu; if (waitqueue_active(&vcpu->wq)) { wake_up_interruptible(&vcpu->wq); ++vcpu->stat.halt_wakeup; } - /* - * We may be called synchronously with irqs disabled in guest mode, - * So need not to call smp_call_function_single() in that case. - */ - if (vcpu->guest_mode && vcpu->cpu != cpu) - smp_call_function_single(ipi_pcpu, vcpu_kick_intr, vcpu, 0); + + 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(); } Index: kvm/include/linux/kvm_host.h =================================================================== --- kvm.orig/include/linux/kvm_host.h +++ kvm/include/linux/kvm_host.h @@ -38,6 +38,7 @@ #define KVM_REQ_UNHALT 6 #define KVM_REQ_MMU_SYNC 7 #define KVM_REQ_KVMCLOCK_UPDATE 8 +#define KVM_REQ_KICK 9 #define KVM_USERSPACE_IRQ_SOURCE_ID 0 @@ -72,7 +73,6 @@ struct kvm_vcpu { struct mutex mutex; int cpu; struct kvm_run *run; - int guest_mode; unsigned long requests; unsigned long guest_debug; int fpu_active; -- ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2009-04-14 21:09 UTC | newest] Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2009-04-14 0:41 [patch 0/2] use smp_send_reschedule in kvm_vcpu_kick (v3) Marcelo Tosatti 2009-04-14 0:41 ` [patch 1/2] IA64: export smp_send_reschedule Marcelo Tosatti 2009-04-14 1:56 ` Zhang, Xiantao 2009-04-14 17:41 ` Luck, Tony 2009-04-14 21:08 ` Marcelo Tosatti 2009-04-14 0:41 ` [patch 2/2] KVM: use smp_send_reschedule in kvm_vcpu_kick Marcelo Tosatti
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.