On 08/27/2009 04:20 AM, Marcelo Tosatti wrote:

+}
+
+void kvm_vcpu_ipi(struct kvm_vcpu *vcpu)
+{
+       int me;
+       int cpu = vcpu->cpu;

        me = get_cpu();
-       if (cpu != me&&  (unsigned)cpu<  nr_cpu_ids&&  cpu_online(cpu))
-               if (!test_and_set_bit(KVM_REQ_KICK,&vcpu->requests))
-                       smp_send_reschedule(cpu);
+       if (cpu != me&&  (unsigned)cpu<  nr_cpu_ids&&  cpu_online(cpu)) {
+               if (test_bit(KVM_VCPU_GUEST_MODE,&vcpu->vcpu_state)) {
+                       if (!test_and_set_bit(KVM_VCPU_KICKED,
+                                       &vcpu->vcpu_state))
+                               smp_send_reschedule(cpu);
+               }
+       }
        put_cpu();
  }

@@ -168,6 +176,30 @@ static bool make_all_cpus_request(struct
        return called;
  }

+static int kvm_req_wait(void *unused)
+{
+       cpu_relax();
+       return 0;
+}
+
+static void kvm_vcpu_request(struct kvm_vcpu *vcpu, unsigned int req)
+{
+       set_bit(req,&vcpu->requests);
+       barrier();
+       kvm_vcpu_ipi(vcpu);
+       wait_on_bit(&vcpu->vcpu_state, KVM_VCPU_GUEST_MODE, kvm_req_wait,
+                   TASK_UNINTERRUPTIBLE);
+}
+
+static void kvm_vcpus_request(struct kvm *kvm, unsigned int req)
+{
+       int i;
+       struct kvm_vcpu *vcpu;
+
+       kvm_for_each_vcpu(i, vcpu, kvm)
+               kvm_vcpu_request(vcpu, req);
+}

Gleb notes there are two problems here: instead of using a multicast IPI, you're sending multiple unicast IPIs. Second, you're serializing the waiting. It would be better to batch-send the IPIs, then batch-wait for results.

--
error compiling committee.c: too many arguments to function

--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to