mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Avi Kivity <avi@redhat.com>
To: linux-kernel@vger.kernel.org
Cc: kvm@vger.kernel.org
Subject: [PATCH 20/43] KVM: APIC: kvm_apic_set_irq deliver all kinds of interrupts
Date: Mon, 18 May 2009 12:22:42 +0300	[thread overview]
Message-ID: <1242638585-18470-21-git-send-email-avi@redhat.com> (raw)
In-Reply-To: <1242638585-18470-1-git-send-email-avi@redhat.com>

From: Gleb Natapov <gleb@redhat.com>

Get rid of ioapic_inj_irq() and ioapic_inj_nmi() functions.

Signed-off-by: Gleb Natapov <gleb@redhat.com>
Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
---
 arch/ia64/include/asm/kvm_host.h |    1 -
 arch/ia64/kvm/kvm-ia64.c         |    8 +++---
 arch/ia64/kvm/lapic.h            |    2 +-
 arch/x86/kvm/lapic.c             |   47 +++++++++++++++++++++++--------------
 arch/x86/kvm/lapic.h             |    2 +-
 virt/kvm/ioapic.c                |   40 +++++---------------------------
 virt/kvm/irq_comm.c              |    1 +
 7 files changed, 42 insertions(+), 59 deletions(-)

diff --git a/arch/ia64/include/asm/kvm_host.h b/arch/ia64/include/asm/kvm_host.h
index 4542651..5608488 100644
--- a/arch/ia64/include/asm/kvm_host.h
+++ b/arch/ia64/include/asm/kvm_host.h
@@ -585,7 +585,6 @@ int kvm_emulate_halt(struct kvm_vcpu *vcpu);
 int kvm_pal_emul(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run);
 void kvm_sal_emul(struct kvm_vcpu *vcpu);
 
-static inline void kvm_inject_nmi(struct kvm_vcpu *vcpu) {}
 #endif /* __ASSEMBLY__*/
 
 #endif
diff --git a/arch/ia64/kvm/kvm-ia64.c b/arch/ia64/kvm/kvm-ia64.c
index 774f0d7..99d6d17 100644
--- a/arch/ia64/kvm/kvm-ia64.c
+++ b/arch/ia64/kvm/kvm-ia64.c
@@ -292,13 +292,13 @@ static void vcpu_deliver_ipi(struct kvm_vcpu *vcpu, uint64_t dm,
 {
 	switch (dm) {
 	case SAPIC_FIXED:
-		kvm_apic_set_irq(vcpu, vector, 0);
+		kvm_apic_set_irq(vcpu, vector, dm, 0);
 		break;
 	case SAPIC_NMI:
-		kvm_apic_set_irq(vcpu, 2, 0);
+		kvm_apic_set_irq(vcpu, 2, dm, 0);
 		break;
 	case SAPIC_EXTINT:
-		kvm_apic_set_irq(vcpu, 0, 0);
+		kvm_apic_set_irq(vcpu, 0, dm, 0);
 		break;
 	case SAPIC_INIT:
 	case SAPIC_PMI:
@@ -1813,7 +1813,7 @@ void kvm_vcpu_kick(struct kvm_vcpu *vcpu)
 	put_cpu();
 }
 
-int kvm_apic_set_irq(struct kvm_vcpu *vcpu, u8 vec, u8 trig)
+int kvm_apic_set_irq(struct kvm_vcpu *vcpu, u8 vec, u8 dmode, u8 trig)
 {
 
 	struct vpd *vpd = to_host(vcpu->kvm, vcpu->arch.vpd);
diff --git a/arch/ia64/kvm/lapic.h b/arch/ia64/kvm/lapic.h
index 6d6cbcb..cbcfaa6 100644
--- a/arch/ia64/kvm/lapic.h
+++ b/arch/ia64/kvm/lapic.h
@@ -20,6 +20,6 @@ void kvm_free_lapic(struct kvm_vcpu *vcpu);
 
 int kvm_apic_match_physical_addr(struct kvm_lapic *apic, u16 dest);
 int kvm_apic_match_logical_addr(struct kvm_lapic *apic, u8 mda);
-int kvm_apic_set_irq(struct kvm_vcpu *vcpu, u8 vec, u8 trig);
+int kvm_apic_set_irq(struct kvm_vcpu *vcpu, u8 vec, u8 dmode, u8 trig);
 
 #endif
diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c
index 27ca43e..a42f968 100644
--- a/arch/x86/kvm/lapic.c
+++ b/arch/x86/kvm/lapic.c
@@ -196,20 +196,30 @@ int kvm_lapic_find_highest_irr(struct kvm_vcpu *vcpu)
 }
 EXPORT_SYMBOL_GPL(kvm_lapic_find_highest_irr);
 
-int kvm_apic_set_irq(struct kvm_vcpu *vcpu, u8 vec, u8 trig)
+static int __apic_accept_irq(struct kvm_lapic *apic, int delivery_mode,
+			     int vector, int level, int trig_mode);
+
+int kvm_apic_set_irq(struct kvm_vcpu *vcpu, u8 vec, u8 dmode, u8 trig)
 {
 	struct kvm_lapic *apic = vcpu->arch.apic;
+	int lapic_dmode;
 
-	if (!apic_test_and_set_irr(vec, apic)) {
-		/* a new pending irq is set in IRR */
-		if (trig)
-			apic_set_vector(vec, apic->regs + APIC_TMR);
-		else
-			apic_clear_vector(vec, apic->regs + APIC_TMR);
-		kvm_vcpu_kick(apic->vcpu);
-		return 1;
+	switch (dmode) {
+	case IOAPIC_LOWEST_PRIORITY:
+		lapic_dmode = APIC_DM_LOWEST;
+		break;
+	case IOAPIC_FIXED:
+		lapic_dmode = APIC_DM_FIXED;
+		break;
+	case IOAPIC_NMI:
+		lapic_dmode = APIC_DM_NMI;
+		break;
+	default:
+		printk(KERN_DEBUG"Ignoring delivery mode %d\n", dmode);
+		return 0;
+		break;
 	}
-	return 0;
+	return __apic_accept_irq(apic, lapic_dmode, vec, 1, trig);
 }
 
 static inline int apic_find_highest_isr(struct kvm_lapic *apic)
@@ -327,7 +337,7 @@ static int apic_match_dest(struct kvm_vcpu *vcpu, struct kvm_lapic *source,
 static int __apic_accept_irq(struct kvm_lapic *apic, int delivery_mode,
 			     int vector, int level, int trig_mode)
 {
-	int orig_irr, result = 0;
+	int result = 0;
 	struct kvm_vcpu *vcpu = apic->vcpu;
 
 	switch (delivery_mode) {
@@ -337,10 +347,11 @@ static int __apic_accept_irq(struct kvm_lapic *apic, int delivery_mode,
 		if (unlikely(!apic_enabled(apic)))
 			break;
 
-		orig_irr = apic_test_and_set_irr(vector, apic);
-		if (orig_irr && trig_mode) {
-			apic_debug("level trig mode repeatedly for vector %d",
-				   vector);
+		result = !apic_test_and_set_irr(vector, apic);
+		if (!result) {
+			if (trig_mode)
+				apic_debug("level trig mode repeatedly for "
+						"vector %d", vector);
 			break;
 		}
 
@@ -349,10 +360,7 @@ static int __apic_accept_irq(struct kvm_lapic *apic, int delivery_mode,
 			apic_set_vector(vector, apic->regs + APIC_TMR);
 		} else
 			apic_clear_vector(vector, apic->regs + APIC_TMR);
-
 		kvm_vcpu_kick(vcpu);
-
-		result = (orig_irr == 0);
 		break;
 
 	case APIC_DM_REMRD:
@@ -364,12 +372,14 @@ static int __apic_accept_irq(struct kvm_lapic *apic, int delivery_mode,
 		break;
 
 	case APIC_DM_NMI:
+		result = 1;
 		kvm_inject_nmi(vcpu);
 		kvm_vcpu_kick(vcpu);
 		break;
 
 	case APIC_DM_INIT:
 		if (level) {
+			result = 1;
 			if (vcpu->arch.mp_state == KVM_MP_STATE_RUNNABLE)
 				printk(KERN_DEBUG
 				       "INIT on a runnable vcpu %d\n",
@@ -386,6 +396,7 @@ static int __apic_accept_irq(struct kvm_lapic *apic, int delivery_mode,
 		apic_debug("SIPI to vcpu %d vector 0x%02x\n",
 			   vcpu->vcpu_id, vector);
 		if (vcpu->arch.mp_state == KVM_MP_STATE_INIT_RECEIVED) {
+			result = 1;
 			vcpu->arch.sipi_vector = vector;
 			vcpu->arch.mp_state = KVM_MP_STATE_SIPI_RECEIVED;
 			kvm_vcpu_kick(vcpu);
diff --git a/arch/x86/kvm/lapic.h b/arch/x86/kvm/lapic.h
index 2fc0d3c..1b0e3c0 100644
--- a/arch/x86/kvm/lapic.h
+++ b/arch/x86/kvm/lapic.h
@@ -31,7 +31,7 @@ u64 kvm_lapic_get_base(struct kvm_vcpu *vcpu);
 
 int kvm_apic_match_physical_addr(struct kvm_lapic *apic, u16 dest);
 int kvm_apic_match_logical_addr(struct kvm_lapic *apic, u8 mda);
-int kvm_apic_set_irq(struct kvm_vcpu *vcpu, u8 vec, u8 trig);
+int kvm_apic_set_irq(struct kvm_vcpu *vcpu, u8 vec, u8 dmode, u8 trig);
 
 u64 kvm_get_apic_base(struct kvm_vcpu *vcpu);
 void kvm_set_apic_base(struct kvm_vcpu *vcpu, u64 data);
diff --git a/virt/kvm/ioapic.c b/virt/kvm/ioapic.c
index ea268a8..d4a7948 100644
--- a/virt/kvm/ioapic.c
+++ b/virt/kvm/ioapic.c
@@ -142,25 +142,6 @@ static void ioapic_write_indirect(struct kvm_ioapic *ioapic, u32 val)
 	}
 }
 
-static int ioapic_inj_irq(struct kvm_ioapic *ioapic,
-			   struct kvm_vcpu *vcpu,
-			   u8 vector, u8 trig_mode, u8 delivery_mode)
-{
-	ioapic_debug("irq %d trig %d deliv %d\n", vector, trig_mode,
-		     delivery_mode);
-
-	ASSERT((delivery_mode == IOAPIC_FIXED) ||
-	       (delivery_mode == IOAPIC_LOWEST_PRIORITY));
-
-	return kvm_apic_set_irq(vcpu, vector, trig_mode);
-}
-
-static void ioapic_inj_nmi(struct kvm_vcpu *vcpu)
-{
-	kvm_inject_nmi(vcpu);
-	kvm_vcpu_kick(vcpu);
-}
-
 static int ioapic_deliver(struct kvm_ioapic *ioapic, int irq)
 {
 	union kvm_ioapic_redirect_entry entry = ioapic->redirtbl[irq];
@@ -193,21 +174,12 @@ static int ioapic_deliver(struct kvm_ioapic *ioapic, int irq)
 		__clear_bit(vcpu_id, deliver_bitmask);
 		vcpu = ioapic->kvm->vcpus[vcpu_id];
 		if (vcpu) {
-			if (entry.fields.delivery_mode ==
-					IOAPIC_LOWEST_PRIORITY ||
-			    entry.fields.delivery_mode == IOAPIC_FIXED) {
-				if (r < 0)
-					r = 0;
-				r += ioapic_inj_irq(ioapic, vcpu,
-						    entry.fields.vector,
-						    entry.fields.trig_mode,
-						    entry.fields.delivery_mode);
-			} else if (entry.fields.delivery_mode == IOAPIC_NMI) {
-				r = 1;
-				ioapic_inj_nmi(vcpu);
-			} else
-				ioapic_debug("unsupported delivery mode %x!\n",
-					     entry.fields.delivery_mode);
+			if (r < 0)
+				r = 0;
+			r += kvm_apic_set_irq(vcpu,
+					entry.fields.vector,
+					entry.fields.trig_mode,
+					entry.fields.delivery_mode);
 		} else
 			ioapic_debug("null destination vcpu: "
 				     "mask=%x vector=%x delivery_mode=%x\n",
diff --git a/virt/kvm/irq_comm.c b/virt/kvm/irq_comm.c
index 1c6ff6d..325c668 100644
--- a/virt/kvm/irq_comm.c
+++ b/virt/kvm/irq_comm.c
@@ -148,6 +148,7 @@ static int kvm_set_msi(struct kvm_kernel_irq_routing_entry *e,
 			if (r < 0)
 				r = 0;
 			r += kvm_apic_set_irq(vcpu, entry.fields.vector,
+					      entry.fields.dest_mode,
 					      entry.fields.trig_mode);
 		}
 	}
-- 
1.6.0.6


  parent reply	other threads:[~2009-05-18  9:36 UTC|newest]

Thread overview: 44+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-05-18  9:22 [PATCH 00/43] KVM updates for the 2.6.31 merge window (batch 1/4) Avi Kivity
2009-05-18  9:22 ` [PATCH 01/43] KVM: VMX: Don't use highmem pages for the msr and pio bitmaps Avi Kivity
2009-05-18  9:22 ` [PATCH 02/43] KVM: VMX: Don't intercept MSR_KERNEL_GS_BASE Avi Kivity
2009-05-18  9:22 ` [PATCH 03/43] KVM: Split IOAPIC structure Avi Kivity
2009-05-18  9:22 ` [PATCH 04/43] KVM: Unify the delivery of IOAPIC and MSI interrupts Avi Kivity
2009-05-18  9:22 ` [PATCH 05/43] KVM: Change API of kvm_ioapic_get_delivery_bitmask Avi Kivity
2009-05-18  9:22 ` [PATCH 06/43] KVM: Update intr delivery func to accept unsigned long* bitmap Avi Kivity
2009-05-18  9:22 ` [PATCH 07/43] KVM: bit ops for deliver_bitmap Avi Kivity
2009-05-18  9:22 ` [PATCH 08/43] KVM: Ioctls for init MSI-X entry Avi Kivity
2009-05-18  9:22 ` [PATCH 09/43] KVM: Add MSI-X interrupt injection logic Avi Kivity
2009-05-18  9:22 ` [PATCH 10/43] KVM: Enable MSI-X for KVM assigned device Avi Kivity
2009-05-18  9:22 ` [PATCH 11/43] KVM: x86: silence preempt warning on kvm_write_guest_time Avi Kivity
2009-05-18  9:22 ` [PATCH 12/43] KVM: x86: paravirt skip pit-through-ioapic boot check Avi Kivity
2009-05-18  9:22 ` [PATCH 13/43] KVM: declare ioapic functions only on affected hardware Avi Kivity
2009-05-18  9:22 ` [PATCH 14/43] KVM: PIT: remove unused scheduled variable Avi Kivity
2009-05-18  9:22 ` [PATCH 15/43] KVM: PIT: remove usage of count_load_time for channel 0 Avi Kivity
2009-05-18  9:22 ` [PATCH 16/43] KVM: unify part of generic timer handling Avi Kivity
2009-05-18  9:22 ` [PATCH 17/43] KVM: ia64: fix compilation error in kvm_get_lowest_prio_vcpu Avi Kivity
2009-05-18  9:22 ` [PATCH 18/43] KVM: Merge kvm_ioapic_get_delivery_bitmask into kvm_get_intr_delivery_bitmask Avi Kivity
2009-05-18  9:22 ` [PATCH 19/43] KVM: MMU: remove call to kvm_mmu_pte_write from walk_addr Avi Kivity
2009-05-18  9:22 ` Avi Kivity [this message]
2009-05-18  9:22 ` [PATCH 21/43] KVM: ioapic/msi interrupt delivery consolidation Avi Kivity
2009-05-18  9:22 ` [PATCH 22/43] KVM: consolidate ioapic/ipi interrupt delivery logic Avi Kivity
2009-05-18  9:22 ` [PATCH 23/43] KVM: change the way how lowest priority vcpu is calculated Avi Kivity
2009-05-18  9:22 ` [PATCH 24/43] KVM: APIC: get rid of deliver_bitmask Avi Kivity
2009-05-18  9:22 ` [PATCH 25/43] KVM: ia64: Map in SN2 RTC registers to the VMM module Avi Kivity
2009-05-18  9:22 ` [PATCH 26/43] KVM: ia64: Create inline function kvm_get_itc() to centralize ITC reading Avi Kivity
2009-05-18  9:22 ` [PATCH 27/43] KVM: ia64: SN2 adjust emulated ITC frequency to match RTC frequency Avi Kivity
2009-05-18  9:22 ` [PATCH 28/43] KVM: ia64: Drop in SN2 replacement of fast path ITC emulation fault handler Avi Kivity
2009-05-18  9:22 ` [PATCH 29/43] KVM: make 'lapic_timer_ops' and 'kpit_ops' static Avi Kivity
2009-05-18  9:22 ` [PATCH 30/43] KVM: Device assignment framework rework Avi Kivity
2009-05-18  9:22 ` [PATCH 31/43] KVM: MMU: do not free active mmu pages in free_mmu_pages() Avi Kivity
2009-05-18  9:22 ` [PATCH 32/43] KVM: x86: Ignore reads to EVNTSEL MSRs Avi Kivity
2009-05-18  9:22 ` [PATCH 33/43] KVM: SVM: Remove duplicate code in svm_do_inject_vector() Avi Kivity
2009-05-18  9:22 ` [PATCH 34/43] KVM: reuse (pop|push)_irq from svm.c in vmx.c Avi Kivity
2009-05-18  9:22 ` [PATCH 35/43] KVM: VMX: Make module parameters readable Avi Kivity
2009-05-18  9:22 ` [PATCH 36/43] KVM: VMX: Rename kvm_handle_exit() to vmx_handle_exit() Avi Kivity
2009-05-18  9:22 ` [PATCH 37/43] KVM: VMX: Simplify module parameter names Avi Kivity
2009-05-18  9:23 ` [PATCH 38/43] KVM: VMX: Annotate module parameters as __read_mostly Avi Kivity
2009-05-18  9:23 ` [PATCH 39/43] KVM: VMX: Zero the vpid module parameter if vpid is not supported Avi Kivity
2009-05-18  9:23 ` [PATCH 40/43] KVM: VMX: Zero ept module parameter if ept is not present Avi Kivity
2009-05-18  9:23 ` [PATCH 41/43] KVM: VMX: Fold vm_need_ept() into callers Avi Kivity
2009-05-18  9:23 ` [PATCH 42/43] KVM: Timer event should not unconditionally unhalt vcpu Avi Kivity
2009-05-18  9:23 ` [PATCH 43/43] KVM: Fix interrupt unhalting a vcpu when it shouldn't Avi Kivity

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1242638585-18470-21-git-send-email-avi@redhat.com \
    --to=avi@redhat.com \
    --cc=kvm@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®