The type of cpu-irq pins we have may have nothing to do with the output pins
of our irqdevice abstraction.  However, we are currently overloading them to
be the same.  This patch splits them up in preparation for adding new types
to the vCPU

Signed-off-by: Gregory Haskins <[EMAIL PROTECTED]>
---

 drivers/kvm/kvm.h      |   12 ++++++++++--
 drivers/kvm/kvm_main.c |   25 ++++++++++++++++++++++---
 drivers/kvm/svm.c      |   20 ++++++++++----------
 drivers/kvm/vmx.c      |   24 ++++++++++++------------
 4 files changed, 54 insertions(+), 27 deletions(-)

diff --git a/drivers/kvm/kvm.h b/drivers/kvm/kvm.h
index 7030f0d..62c4c4d 100644
--- a/drivers/kvm/kvm.h
+++ b/drivers/kvm/kvm.h
@@ -163,6 +163,14 @@ struct vmcs {
 
 struct kvm_vcpu;
 
+typedef enum {
+       kvm_cpuirq_localint,
+       kvm_cpuirq_extint,
+       kvm_cpuirq_smi,
+       kvm_cpuirq_nmi,
+       kvm_cpuirq_invalid, /* must always be last */
+} kvm_cpuirq_t;
+
 int kvm_user_irqdev_init(struct kvm_irqdevice *dev);
 int kvm_user_irqdev_save(struct kvm_irqdevice *this, void *data);
 int kvm_user_irqdev_restore(struct kvm_irqdevice *this, void *data);
@@ -468,7 +476,7 @@ static inline int __kvm_vcpu_irq_pending(struct kvm_vcpu 
*vcpu)
        int pending = vcpu->irq.pending;
 
        if (vcpu->irq.deferred != -1)
-               __set_bit(kvm_irqpin_localint, &pending);
+               __set_bit(kvm_cpuirq_localint, &pending);
 
        return pending;
 }
@@ -506,7 +514,7 @@ static inline int kvm_vcpu_irq_pop(struct kvm_vcpu *vcpu,
         * If there are no more interrupts we must clear the status flag
         */
        if (!(data->flags & KVM_IRQACKDATA_VECTOR_PENDING))
-               __clear_bit(kvm_irqpin_localint, &vcpu->irq.pending);
+               __clear_bit(kvm_cpuirq_localint, &vcpu->irq.pending);
 
        return ret;
 }
diff --git a/drivers/kvm/kvm_main.c b/drivers/kvm/kvm_main.c
index 59f94cf..ede949d 100644
--- a/drivers/kvm/kvm_main.c
+++ b/drivers/kvm/kvm_main.c
@@ -2528,20 +2528,39 @@ static void kvm_vcpu_guest_intr(void *info)
  */
 static void kvm_vcpu_intr(struct kvm_irqsink *this,
                          struct kvm_irqdevice *dev,
-                         kvm_irqpin_t pin)
+                         kvm_irqpin_t opin)
 {
        struct kvm_vcpu *vcpu = (struct kvm_vcpu*)this->private;
        int direct_ipi = -1;
+       kvm_cpuirq_t ipin = kvm_cpuirq_invalid;
 
        ++vcpu->stat.irq_posted;
 
+       switch (opin) {
+       case kvm_irqpin_localint:
+               ipin = kvm_cpuirq_localint;
+               break;
+       case kvm_irqpin_extint:
+               ipin = kvm_cpuirq_extint;
+               break;
+       case kvm_irqpin_smi:
+               ipin = kvm_cpuirq_smi;
+               break;
+       case kvm_irqpin_nmi:
+               ipin = kvm_cpuirq_nmi;
+               break;
+       default:
+               BUG();
+               break;
+       }
+
        spin_lock_irq(&vcpu->irq.lock);
 
-       if (!test_bit(pin, &vcpu->irq.pending)) {
+       if (!test_bit(ipin, &vcpu->irq.pending)) {
                /*
                 * Record the change..
                 */
-               __set_bit(pin, &vcpu->irq.pending);
+               __set_bit(ipin, &vcpu->irq.pending);
 
                /*
                 * then wake up the vcpu (if necessary)
diff --git a/drivers/kvm/svm.c b/drivers/kvm/svm.c
index f81f3a2..02854f4 100644
--- a/drivers/kvm/svm.c
+++ b/drivers/kvm/svm.c
@@ -1378,7 +1378,7 @@ static void kvm_reput_irq(struct kvm_vcpu *vcpu)
 
 static void do_intr_requests(struct kvm_vcpu *vcpu,
                            struct kvm_run *kvm_run,
-                           kvm_irqpin_t pin)
+                           kvm_cpuirq_t pin)
 {
        struct vmcb_control_area *control = &vcpu->svm->vmcb->control;
        int pending = 0;
@@ -1398,15 +1398,15 @@ static void do_intr_requests(struct kvm_vcpu *vcpu,
                memset(&ack, 0, sizeof(ack));
 
                switch (pin) {
-               case kvm_irqpin_localint:
+               case kvm_cpuirq_localint:
                        r = kvm_vcpu_irq_pop(vcpu, &ack);
                        break;
-               case kvm_irqpin_extint:
+               case kvm_cpuirq_extint:
                        r = kvm_irqdevice_ack(&vcpu->kvm->isa_irq, 0, &ack);
                        if (!(ack.flags & KVM_IRQACKDATA_VECTOR_PENDING))
                                __clear_bit(pin, &vcpu->irq.pending);
                        break;
-               case kvm_irqpin_nmi:
+               case kvm_cpuirq_nmi:
                        /*
                         * FIXME: Someday we will handle this using the
                         * specific SVN NMI features.  For now, just inject
@@ -1472,20 +1472,20 @@ static void do_interrupt_requests(struct kvm_vcpu *vcpu,
        clear_pending_controls(vcpu, kvm_run);
 
        while (pending) {
-               kvm_irqpin_t pin = __fls(pending);
+               kvm_cpuirq_t pin = __fls(pending);
 
                switch (pin) {
-               case kvm_irqpin_localint:
-               case kvm_irqpin_extint:
-               case kvm_irqpin_nmi:
+               case kvm_cpuirq_localint:
+               case kvm_cpuirq_extint:
+               case kvm_cpuirq_nmi:
                        do_intr_requests(vcpu, kvm_run, pin);
                        break;
-               case kvm_irqpin_smi:
+               case kvm_cpuirq_smi:
                        /* ignored (for now) */
                        printk(KERN_WARNING "KVM: dropping unhandled SMI\n");
                        __clear_bit(pin, &vcpu->irq.pending);
                        break;
-               case kvm_irqpin_invalid:
+               case kvm_cpuirq_invalid:
                        /* drop */
                        break;
                default:
diff --git a/drivers/kvm/vmx.c b/drivers/kvm/vmx.c
index 6682f8d..62db2e0 100644
--- a/drivers/kvm/vmx.c
+++ b/drivers/kvm/vmx.c
@@ -1461,7 +1461,7 @@ static void do_nmi_requests(struct kvm_vcpu *vcpu)
 {
        int nmi_window = 0;
 
-       BUG_ON(!(test_bit(kvm_irqpin_nmi, &vcpu->irq.pending)));
+       BUG_ON(!(test_bit(kvm_cpuirq_nmi, &vcpu->irq.pending)));
 
        nmi_window =
                (((vmcs_read32(GUEST_INTERRUPTIBILITY_INFO) & 0xb) == 0)
@@ -1477,7 +1477,7 @@ static void do_nmi_requests(struct kvm_vcpu *vcpu)
                                     INTR_TYPE_NMI |
                                     INTR_INFO_VALID_MASK);
 
-               __clear_bit(kvm_irqpin_nmi, &vcpu->irq.pending);
+               __clear_bit(kvm_cpuirq_nmi, &vcpu->irq.pending);
        } else {
                /*
                 * NMIs blocked.  Wait for unblock.
@@ -1490,7 +1490,7 @@ static void do_nmi_requests(struct kvm_vcpu *vcpu)
 
 static void do_intr_requests(struct kvm_vcpu *vcpu,
                            struct kvm_run *kvm_run,
-                           kvm_irqpin_t pin)
+                           kvm_cpuirq_t pin)
 {
        int pending = 0;
 
@@ -1510,15 +1510,15 @@ static void do_intr_requests(struct kvm_vcpu *vcpu,
                memset(&ack, 0, sizeof(ack));
 
                switch (pin) {
-               case kvm_irqpin_localint:
+               case kvm_cpuirq_localint:
                        r = kvm_vcpu_irq_pop(vcpu, &ack);
                        break;
-               case kvm_irqpin_extint:
+               case kvm_cpuirq_extint:
                        r = kvm_irqdevice_ack(&vcpu->kvm->isa_irq, 0, &ack);
                        if (!(ack.flags & KVM_IRQACKDATA_VECTOR_PENDING))
                                __clear_bit(pin, &vcpu->irq.pending);
                        break;
-               case kvm_irqpin_nmi:
+               case kvm_cpuirq_nmi:
                        /*
                         * We should only get here if the processor does
                         * not support virtual NMIs.  Inject the NMI as a
@@ -1589,26 +1589,26 @@ static void do_interrupt_requests(struct kvm_vcpu *vcpu,
        clear_pending_controls(vcpu, kvm_run);
 
        while (pending) {
-               kvm_irqpin_t pin = __fls(pending);
+               kvm_cpuirq_t pin = __fls(pending);
 
                switch (pin) {
-               case kvm_irqpin_localint:
-               case kvm_irqpin_extint:
+               case kvm_cpuirq_localint:
+               case kvm_cpuirq_extint:
                        do_intr_requests(vcpu, kvm_run, pin);
                        break;
-               case kvm_irqpin_smi:
+               case kvm_cpuirq_smi:
                        /* ignored (for now) */
                        printk(KERN_WARNING "KVM: dropping unhandled SMI\n");
                        __clear_bit(pin, &vcpu->irq.pending);
                        break;
-               case kvm_irqpin_nmi:
+               case kvm_cpuirq_nmi:
                        if (vmcs_read32(PIN_BASED_VM_EXEC_CONTROL)
                            & PIN_BASED_VIRTUAL_NMI)
                                do_nmi_requests(vcpu);
                        else
                                do_intr_requests(vcpu, kvm_run, pin);
                        break;
-               case kvm_irqpin_invalid:
+               case kvm_cpuirq_invalid:
                        /* drop */
                        break;
                default:


-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
_______________________________________________
kvm-devel mailing list
kvm-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/kvm-devel

Reply via email to