[PATCH 2/2] make the injection of interrupts run at sleepable mode.

Izik Eidus
2007-10-15T21:25:39Z

[-- Attachment #1: Type: text/plain, Size: 1 bytes --]

[-- Attachment #2: 0013-this-patch-make-the-injection-of-interrupts-run-at-s.patch --]
[-- Type: text/x-patch, Size: 3780 bytes --]

>From c5761ef6c1333062a7cd9d5b0003955bc7b7a93e Mon Sep 17 00:00:00 2001
From: Izik Eidus <izike-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
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 <izike-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
---
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

[-- Attachment #3: Type: text/plain, Size: 314 bytes --]

-------------------------------------------------------------------------
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/

[-- Attachment #4: Type: text/plain, Size: 186 bytes --]

_______________________________________________
kvm-devel mailing list
kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org