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

Commit 680b3648 authored by Gleb Natapov's avatar Gleb Natapov Committed by Avi Kivity
Browse files

KVM: Drop kvm->irq_lock lock from irq injection path



The only thing it protects now is interrupt injection into lapic and
this can work lockless. Even now with kvm->irq_lock in place access
to lapic is not entirely serialized since vcpu access doesn't take
kvm->irq_lock.

Signed-off-by: default avatarGleb Natapov <gleb@redhat.com>
Signed-off-by: default avatarAvi Kivity <avi@redhat.com>
parent eba0226b
Loading
Loading
Loading
Loading
+0 −2
Original line number Diff line number Diff line
@@ -982,10 +982,8 @@ long kvm_arch_vm_ioctl(struct file *filp,
			goto out;
		if (irqchip_in_kernel(kvm)) {
			__s32 status;
			mutex_lock(&kvm->irq_lock);
			status = kvm_set_irq(kvm, KVM_USERSPACE_IRQ_SOURCE_ID,
				    irq_event.irq, irq_event.level);
			mutex_unlock(&kvm->irq_lock);
			if (ioctl == KVM_IRQ_LINE_STATUS) {
				irq_event.status = status;
				if (copy_to_user(argp, &irq_event,
+0 −2
Original line number Diff line number Diff line
@@ -688,10 +688,8 @@ static void __inject_pit_timer_intr(struct kvm *kvm)
	struct kvm_vcpu *vcpu;
	int i;

	mutex_lock(&kvm->irq_lock);
	kvm_set_irq(kvm, kvm->arch.vpit->irq_source_id, 0, 1);
	kvm_set_irq(kvm, kvm->arch.vpit->irq_source_id, 0, 0);
	mutex_unlock(&kvm->irq_lock);

	/*
	 * Provides NMI watchdog support via Virtual Wire mode.
+0 −2
Original line number Diff line number Diff line
@@ -501,9 +501,7 @@ static void apic_send_ipi(struct kvm_lapic *apic)
		   irq.trig_mode, irq.level, irq.dest_mode, irq.delivery_mode,
		   irq.vector);

	mutex_lock(&apic->vcpu->kvm->irq_lock);
	kvm_irq_delivery_to_apic(apic->vcpu->kvm, apic, &irq);
	mutex_unlock(&apic->vcpu->kvm->irq_lock);
}

static u32 apic_get_tmcct(struct kvm_lapic *apic)
+0 −2
Original line number Diff line number Diff line
@@ -2286,10 +2286,8 @@ long kvm_arch_vm_ioctl(struct file *filp,
			goto out;
		if (irqchip_in_kernel(kvm)) {
			__s32 status;
			mutex_lock(&kvm->irq_lock);
			status = kvm_set_irq(kvm, KVM_USERSPACE_IRQ_SOURCE_ID,
					irq_event.irq, irq_event.level);
			mutex_unlock(&kvm->irq_lock);
			if (ioctl == KVM_IRQ_LINE_STATUS) {
				irq_event.status = status;
				if (copy_to_user(argp, &irq_event,
+0 −2
Original line number Diff line number Diff line
@@ -61,10 +61,8 @@ irqfd_inject(struct work_struct *work)
	struct _irqfd *irqfd = container_of(work, struct _irqfd, inject);
	struct kvm *kvm = irqfd->kvm;

	mutex_lock(&kvm->irq_lock);
	kvm_set_irq(kvm, KVM_USERSPACE_IRQ_SOURCE_ID, irqfd->gsi, 1);
	kvm_set_irq(kvm, KVM_USERSPACE_IRQ_SOURCE_ID, irqfd->gsi, 0);
	mutex_unlock(&kvm->irq_lock);
}

/*
Loading