kvm hypervisor: Simplify kvm_for_each_vcpu with kvm_irq_delivery_to_apic
authorRaghavendra K T <raghavendra.kt@linux.vnet.ibm.com>
Mon, 26 Aug 2013 08:48:35 +0000 (14:18 +0530)
committerGleb Natapov <gleb@redhat.com>
Mon, 26 Aug 2013 09:47:09 +0000 (12:47 +0300)
Note that we are using APIC_DM_REMRD which has reserved usage.
In future if APIC_DM_REMRD usage is standardized, then we should
find some other way or go back to old method.

Suggested-by: Gleb Natapov <gleb@redhat.com>
Signed-off-by: Raghavendra K T <raghavendra.kt@linux.vnet.ibm.com>
Acked-by: Gleb Natapov <gleb@redhat.com>
Acked-by: Ingo Molnar <mingo@kernel.org>
Signed-off-by: Gleb Natapov <gleb@redhat.com>
arch/x86/kvm/lapic.c
arch/x86/kvm/x86.c

index c98f054..5439117 100644 (file)
@@ -689,7 +689,10 @@ static int __apic_accept_irq(struct kvm_lapic *apic, int delivery_mode,
                break;
 
        case APIC_DM_REMRD:
-               apic_debug("Ignoring delivery mode 3\n");
+               result = 1;
+               vcpu->arch.pv.pv_unhalted = 1;
+               kvm_make_request(KVM_REQ_EVENT, vcpu);
+               kvm_vcpu_kick(vcpu);
                break;
 
        case APIC_DM_SMI:
index c537417..cb276e9 100644 (file)
@@ -5595,27 +5595,14 @@ int kvm_hv_hypercall(struct kvm_vcpu *vcpu)
  */
 static void kvm_pv_kick_cpu_op(struct kvm *kvm, unsigned long flags, int apicid)
 {
-       struct kvm_vcpu *vcpu = NULL;
-       int i;
+       struct kvm_lapic_irq lapic_irq;
 
-       kvm_for_each_vcpu(i, vcpu, kvm) {
-               if (!kvm_apic_present(vcpu))
-                       continue;
+       lapic_irq.shorthand = 0;
+       lapic_irq.dest_mode = 0;
+       lapic_irq.dest_id = apicid;
 
-               if (kvm_apic_match_dest(vcpu, 0, 0, apicid, 0))
-                       break;
-       }
-       if (vcpu) {
-               /*
-                * Setting unhalt flag here can result in spurious runnable
-                * state when unhalt reset does not happen in vcpu_block.
-                * But that is harmless since that should soon result in halt.
-                */
-               vcpu->arch.pv.pv_unhalted = true;
-               /* We need everybody see unhalt before vcpu unblocks */
-               smp_wmb();
-               kvm_vcpu_kick(vcpu);
-       }
+       lapic_irq.delivery_mode = APIC_DM_REMRD;
+       kvm_irq_delivery_to_apic(kvm, 0, &lapic_irq, NULL);
 }
 
 int kvm_emulate_hypercall(struct kvm_vcpu *vcpu)