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

Commit 46a47b1e authored by Marcelo Tosatti's avatar Marcelo Tosatti
Browse files

KVM: convert ioapic lock to spinlock



kvm_set_irq is used from non sleepable contexes, so convert ioapic from
mutex to spinlock.

KVM-Stable-Tag.
Tested-by: default avatarRalf Bonenkamp <ralf.bonenkamp@swyx.com>
Signed-off-by: default avatarMarcelo Tosatti <mtosatti@redhat.com>
parent be835674
Loading
Loading
Loading
Loading
+15 −15
Original line number Original line Diff line number Diff line
@@ -197,7 +197,7 @@ int kvm_ioapic_set_irq(struct kvm_ioapic *ioapic, int irq, int level)
	union kvm_ioapic_redirect_entry entry;
	union kvm_ioapic_redirect_entry entry;
	int ret = 1;
	int ret = 1;


	mutex_lock(&ioapic->lock);
	spin_lock(&ioapic->lock);
	if (irq >= 0 && irq < IOAPIC_NUM_PINS) {
	if (irq >= 0 && irq < IOAPIC_NUM_PINS) {
		entry = ioapic->redirtbl[irq];
		entry = ioapic->redirtbl[irq];
		level ^= entry.fields.polarity;
		level ^= entry.fields.polarity;
@@ -214,7 +214,7 @@ int kvm_ioapic_set_irq(struct kvm_ioapic *ioapic, int irq, int level)
		}
		}
		trace_kvm_ioapic_set_irq(entry.bits, irq, ret == 0);
		trace_kvm_ioapic_set_irq(entry.bits, irq, ret == 0);
	}
	}
	mutex_unlock(&ioapic->lock);
	spin_unlock(&ioapic->lock);


	return ret;
	return ret;
}
}
@@ -238,9 +238,9 @@ static void __kvm_ioapic_update_eoi(struct kvm_ioapic *ioapic, int vector,
		 * is dropped it will be put into irr and will be delivered
		 * is dropped it will be put into irr and will be delivered
		 * after ack notifier returns.
		 * after ack notifier returns.
		 */
		 */
		mutex_unlock(&ioapic->lock);
		spin_unlock(&ioapic->lock);
		kvm_notify_acked_irq(ioapic->kvm, KVM_IRQCHIP_IOAPIC, i);
		kvm_notify_acked_irq(ioapic->kvm, KVM_IRQCHIP_IOAPIC, i);
		mutex_lock(&ioapic->lock);
		spin_lock(&ioapic->lock);


		if (trigger_mode != IOAPIC_LEVEL_TRIG)
		if (trigger_mode != IOAPIC_LEVEL_TRIG)
			continue;
			continue;
@@ -259,9 +259,9 @@ void kvm_ioapic_update_eoi(struct kvm *kvm, int vector, int trigger_mode)
	smp_rmb();
	smp_rmb();
	if (!test_bit(vector, ioapic->handled_vectors))
	if (!test_bit(vector, ioapic->handled_vectors))
		return;
		return;
	mutex_lock(&ioapic->lock);
	spin_lock(&ioapic->lock);
	__kvm_ioapic_update_eoi(ioapic, vector, trigger_mode);
	__kvm_ioapic_update_eoi(ioapic, vector, trigger_mode);
	mutex_unlock(&ioapic->lock);
	spin_unlock(&ioapic->lock);
}
}


static inline struct kvm_ioapic *to_ioapic(struct kvm_io_device *dev)
static inline struct kvm_ioapic *to_ioapic(struct kvm_io_device *dev)
@@ -287,7 +287,7 @@ static int ioapic_mmio_read(struct kvm_io_device *this, gpa_t addr, int len,
	ASSERT(!(addr & 0xf));	/* check alignment */
	ASSERT(!(addr & 0xf));	/* check alignment */


	addr &= 0xff;
	addr &= 0xff;
	mutex_lock(&ioapic->lock);
	spin_lock(&ioapic->lock);
	switch (addr) {
	switch (addr) {
	case IOAPIC_REG_SELECT:
	case IOAPIC_REG_SELECT:
		result = ioapic->ioregsel;
		result = ioapic->ioregsel;
@@ -301,7 +301,7 @@ static int ioapic_mmio_read(struct kvm_io_device *this, gpa_t addr, int len,
		result = 0;
		result = 0;
		break;
		break;
	}
	}
	mutex_unlock(&ioapic->lock);
	spin_unlock(&ioapic->lock);


	switch (len) {
	switch (len) {
	case 8:
	case 8:
@@ -338,7 +338,7 @@ static int ioapic_mmio_write(struct kvm_io_device *this, gpa_t addr, int len,
	}
	}


	addr &= 0xff;
	addr &= 0xff;
	mutex_lock(&ioapic->lock);
	spin_lock(&ioapic->lock);
	switch (addr) {
	switch (addr) {
	case IOAPIC_REG_SELECT:
	case IOAPIC_REG_SELECT:
		ioapic->ioregsel = data;
		ioapic->ioregsel = data;
@@ -356,7 +356,7 @@ static int ioapic_mmio_write(struct kvm_io_device *this, gpa_t addr, int len,
	default:
	default:
		break;
		break;
	}
	}
	mutex_unlock(&ioapic->lock);
	spin_unlock(&ioapic->lock);
	return 0;
	return 0;
}
}


@@ -386,7 +386,7 @@ int kvm_ioapic_init(struct kvm *kvm)
	ioapic = kzalloc(sizeof(struct kvm_ioapic), GFP_KERNEL);
	ioapic = kzalloc(sizeof(struct kvm_ioapic), GFP_KERNEL);
	if (!ioapic)
	if (!ioapic)
		return -ENOMEM;
		return -ENOMEM;
	mutex_init(&ioapic->lock);
	spin_lock_init(&ioapic->lock);
	kvm->arch.vioapic = ioapic;
	kvm->arch.vioapic = ioapic;
	kvm_ioapic_reset(ioapic);
	kvm_ioapic_reset(ioapic);
	kvm_iodevice_init(&ioapic->dev, &ioapic_mmio_ops);
	kvm_iodevice_init(&ioapic->dev, &ioapic_mmio_ops);
@@ -419,9 +419,9 @@ int kvm_get_ioapic(struct kvm *kvm, struct kvm_ioapic_state *state)
	if (!ioapic)
	if (!ioapic)
		return -EINVAL;
		return -EINVAL;


	mutex_lock(&ioapic->lock);
	spin_lock(&ioapic->lock);
	memcpy(state, ioapic, sizeof(struct kvm_ioapic_state));
	memcpy(state, ioapic, sizeof(struct kvm_ioapic_state));
	mutex_unlock(&ioapic->lock);
	spin_unlock(&ioapic->lock);
	return 0;
	return 0;
}
}


@@ -431,9 +431,9 @@ int kvm_set_ioapic(struct kvm *kvm, struct kvm_ioapic_state *state)
	if (!ioapic)
	if (!ioapic)
		return -EINVAL;
		return -EINVAL;


	mutex_lock(&ioapic->lock);
	spin_lock(&ioapic->lock);
	memcpy(ioapic, state, sizeof(struct kvm_ioapic_state));
	memcpy(ioapic, state, sizeof(struct kvm_ioapic_state));
	update_handled_vectors(ioapic);
	update_handled_vectors(ioapic);
	mutex_unlock(&ioapic->lock);
	spin_unlock(&ioapic->lock);
	return 0;
	return 0;
}
}
+1 −1
Original line number Original line Diff line number Diff line
@@ -45,7 +45,7 @@ struct kvm_ioapic {
	struct kvm_io_device dev;
	struct kvm_io_device dev;
	struct kvm *kvm;
	struct kvm *kvm;
	void (*ack_notifier)(void *opaque, int irq);
	void (*ack_notifier)(void *opaque, int irq);
	struct mutex lock;
	spinlock_t lock;
	DECLARE_BITMAP(handled_vectors, 256);
	DECLARE_BITMAP(handled_vectors, 256);
};
};