From 94b58e51cd751c5aaa938da87f39f8c6768b451e Mon Sep 17 00:00:00 2001 From: "He, Qing" Date: Mon, 3 Sep 2007 17:01:36 +0300 Subject: [PATCH] --- yaml --- r: 68417 b: refs/heads/master c: 932f72adbe76f098922c746737cb0bd75fc21e27 h: refs/heads/master i: 68415: f8c7535f6f86095b93d6fcdfe786c91d502258fb v: v3 --- [refs] | 2 +- trunk/drivers/kvm/kvm.h | 1 + trunk/drivers/kvm/lapic.c | 33 ++++++++++++++++++++++++++++----- 3 files changed, 30 insertions(+), 6 deletions(-) diff --git a/[refs] b/[refs] index 0e6b8c181dff..42c2bb1afe14 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 40487c680d5855459dfdce340df13d40071bb774 +refs/heads/master: 932f72adbe76f098922c746737cb0bd75fc21e27 diff --git a/trunk/drivers/kvm/kvm.h b/trunk/drivers/kvm/kvm.h index f8fe87d3ddbd..dbb929d8a31e 100644 --- a/trunk/drivers/kvm/kvm.h +++ b/trunk/drivers/kvm/kvm.h @@ -413,6 +413,7 @@ struct kvm { struct kvm_io_bus pio_bus; struct kvm_pic *vpic; struct kvm_ioapic *vioapic; + int round_robin_prev_vcpu; }; static inline struct kvm_pic *pic_irqchip(struct kvm *kvm) diff --git a/trunk/drivers/kvm/lapic.c b/trunk/drivers/kvm/lapic.c index 01e769672dcc..ca1db3852ace 100644 --- a/trunk/drivers/kvm/lapic.c +++ b/trunk/drivers/kvm/lapic.c @@ -371,12 +371,35 @@ struct kvm_lapic *kvm_apic_round_robin(struct kvm *kvm, u8 vector, unsigned long bitmap) { int vcpu_id; + int last; + int next; + struct kvm_lapic *apic; + + last = kvm->round_robin_prev_vcpu; + next = last; + + do { + if (++next == KVM_MAX_VCPUS) + next = 0; + if (kvm->vcpus[next] == NULL || !test_bit(next, &bitmap)) + continue; + apic = kvm->vcpus[next]->apic; + if (apic && apic_enabled(apic)) + break; + apic = NULL; + } while (next != last); + kvm->round_robin_prev_vcpu = next; + + if (!apic) { + vcpu_id = ffs(bitmap) - 1; + if (vcpu_id < 0) { + vcpu_id = 0; + printk(KERN_DEBUG "vcpu not ready for apic_round_robin\n"); + } + apic = kvm->vcpus[vcpu_id]->apic; + } - /* TODO for real round robin */ - vcpu_id = fls(bitmap) - 1; - if (vcpu_id < 0) - printk(KERN_DEBUG "vcpu not ready for apic_round_robin\n"); - return kvm->vcpus[vcpu_id]->apic; + return apic; } static void apic_set_eoi(struct kvm_lapic *apic)