mirror of https://gitee.com/openkylin/linux.git
KVM: round robin for APIC lowest priority delivery mode
Signed-off-by: Qing He <qing.he@intel.com> Signed-off-by: Avi Kivity <avi@qumranet.com>
This commit is contained in:
parent
40487c680d
commit
932f72adbe
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
|
||||
/* 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;
|
||||
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;
|
||||
}
|
||||
|
||||
return apic;
|
||||
}
|
||||
|
||||
static void apic_set_eoi(struct kvm_lapic *apic)
|
||||
|
|
Loading…
Reference in New Issue