From mboxrd@z Thu Jan 1 00:00:00 1970 From: Izik Eidus Subject: [PATCH 2/2] make the injection of interrupts run at sleepable mode. Date: Mon, 15 Oct 2007 23:25:39 +0200 Message-ID: <4713DAD3.90904@qumranet.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="------------010300010704010003030005" To: kvm-devel Return-path: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: kvm-devel-bounces-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org Errors-To: kvm-devel-bounces-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org List-Id: kvm.vger.kernel.org This is a multi-part message in MIME format. --------------010300010704010003030005 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit --------------010300010704010003030005 Content-Type: text/x-patch; name="0013-this-patch-make-the-injection-of-interrupts-run-at-s.patch" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename*0="0013-this-patch-make-the-injection-of-interrupts-run-at-s.pa"; filename*1="tch" >>From c5761ef6c1333062a7cd9d5b0003955bc7b7a93e Mon Sep 17 00:00:00 2001 From: Izik Eidus Date: Mon, 15 Oct 2007 23:16:42 +0200 Subject: [PATCH] this patch make the injection of interrupts run at sleepable mode. Signed-off-by: Izik Eidus --- drivers/kvm/kvm.h | 3 +++ drivers/kvm/kvm_main.c | 20 ++++++++++++++++++-- drivers/kvm/svm.c | 1 + drivers/kvm/vmx.c | 6 ++++-- 4 files changed, 26 insertions(+), 4 deletions(-) diff --git a/drivers/kvm/kvm.h b/drivers/kvm/kvm.h index 74b427f..0b12a98 100644 --- a/drivers/kvm/kvm.h +++ b/drivers/kvm/kvm.h @@ -68,6 +68,7 @@ * vcpu->requests bit members */ #define KVM_TLB_FLUSH 0 +#define VMX_INJECT_RMODE_IRQ 1 /* * Address types: @@ -319,6 +320,7 @@ struct kvm_vcpu { int guest_mode; unsigned long requests; unsigned long irq_summary; /* bit vector: 1 per word in irq_pending */ + int inject_rmode_irq; DECLARE_BITMAP(irq_pending, KVM_NR_INTERRUPTS); unsigned long regs[NR_VCPU_REGS]; /* for rsp: vcpu_load_rsp_rip() */ unsigned long rip; /* needs vcpu_load_rsp_rip() */ @@ -520,6 +522,7 @@ struct kvm_x86_ops { void (*inject_pending_irq)(struct kvm_vcpu *vcpu); void (*inject_pending_vectors)(struct kvm_vcpu *vcpu, struct kvm_run *run); + void (*vmx_inject_rmode_irq)(struct kvm_vcpu *vcpu, int irq); }; extern struct kvm_x86_ops *kvm_x86_ops; diff --git a/drivers/kvm/kvm_main.c b/drivers/kvm/kvm_main.c index f58d49b..0e2bbe5 100644 --- a/drivers/kvm/kvm_main.c +++ b/drivers/kvm/kvm_main.c @@ -2178,6 +2178,10 @@ again: if (unlikely(r)) goto out; +vmx_inject_rmode: + if (test_and_clear_bit(VMX_INJECT_RMODE_IRQ, &vcpu->requests)) + kvm_x86_ops->vmx_inject_rmode_irq(vcpu, vcpu->inject_rmode_irq); + preempt_disable(); kvm_x86_ops->prepare_guest_switch(vcpu); @@ -2194,10 +2198,22 @@ again: goto out; } - if (irqchip_in_kernel(vcpu->kvm)) + if (irqchip_in_kernel(vcpu->kvm)) { kvm_x86_ops->inject_pending_irq(vcpu); - else if (!vcpu->mmio_read_completed) + if (test_bit(VMX_INJECT_RMODE_IRQ, &vcpu->requests)) { + local_irq_enable(); + preempt_enable(); + goto vmx_inject_rmode; + } + } + else if (!vcpu->mmio_read_completed) { kvm_x86_ops->inject_pending_vectors(vcpu, kvm_run); + if (test_bit(VMX_INJECT_RMODE_IRQ, &vcpu->requests)) { + local_irq_enable(); + preempt_enable(); + goto vmx_inject_rmode; + } + } vcpu->guest_mode = 1; diff --git a/drivers/kvm/svm.c b/drivers/kvm/svm.c index f643379..77b19be 100644 --- a/drivers/kvm/svm.c +++ b/drivers/kvm/svm.c @@ -1732,6 +1732,7 @@ static struct kvm_x86_ops svm_x86_ops = { .set_irq = svm_set_irq, .inject_pending_irq = svm_intr_assist, .inject_pending_vectors = do_interrupt_requests, + .vmx_inject_rmode_irq = NULL, }; static int __init svm_init(void) diff --git a/drivers/kvm/vmx.c b/drivers/kvm/vmx.c index 2d75599..f014971 100644 --- a/drivers/kvm/vmx.c +++ b/drivers/kvm/vmx.c @@ -1678,10 +1678,11 @@ static void inject_rmode_irq(struct kvm_vcpu *vcpu, int irq) vmcs_writel(GUEST_RSP, (vmcs_readl(GUEST_RSP) & ~0xffff) | (sp - 6)); } -static void vmx_inject_irq(struct kvm_vcpu *vcpu, int irq) +void vmx_inject_irq(struct kvm_vcpu *vcpu, int irq) { if (vcpu->rmode.active) { - inject_rmode_irq(vcpu, irq); + vcpu->inject_rmode_irq = irq; + set_bit(VMX_INJECT_RMODE_IRQ, &vcpu->requests); return; } vmcs_write32(VM_ENTRY_INTR_INFO_FIELD, @@ -2539,6 +2540,7 @@ static struct kvm_x86_ops vmx_x86_ops = { .set_irq = vmx_inject_irq, .inject_pending_irq = vmx_intr_assist, .inject_pending_vectors = do_interrupt_requests, + .vmx_inject_rmode_irq = inject_rmode_irq, }; static int __init vmx_init(void) -- 1.5.2.4 --------------010300010704010003030005 Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline ------------------------------------------------------------------------- This SF.net email is sponsored by: Splunk Inc. Still grepping through log files to find problems? Stop. Now Search log events and configuration files using AJAX and a browser. Download your FREE copy of Splunk now >> http://get.splunk.com/ --------------010300010704010003030005 Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ kvm-devel mailing list kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org https://lists.sourceforge.net/lists/listinfo/kvm-devel --------------010300010704010003030005--