Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 932f72ad authored by He, Qing's avatar He, Qing Committed by Avi Kivity
Browse files

KVM: round robin for APIC lowest priority delivery mode



Signed-off-by: default avatarQing He <qing.he@intel.com>
Signed-off-by: default avatarAvi Kivity <avi@qumranet.com>
parent 40487c68
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -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)
+28 −5
Original line number Diff line number Diff line
@@ -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;

	/* TODO for real round robin */
	vcpu_id = fls(bitmap) - 1;
	if (vcpu_id < 0)
	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");
	return kvm->vcpus[vcpu_id]->apic;
		}
		apic = kvm->vcpus[vcpu_id]->apic;
	}

	return apic;
}

static void apic_set_eoi(struct kvm_lapic *apic)