Commit f51feae0 authored by Xianglai Li's avatar Xianglai Li
Browse files

LoongArch: arch/loongarch/kvm: Fix extioi restart issue

LoongArch inclusion
category: feature
bugzilla: https://gitee.com/openeuler/kernel/issues/IBC7SN



------------------------------------------

When the virtual machine is restarted, the data in extioi is not zeroed,
and there is a residual set interrupt bit, resulting in a hang

Signed-off-by: default avatarXianglai Li <lixianglai@loongson.cn>
parent 46064348
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -92,4 +92,5 @@ struct loongarch_extioi {

void extioi_set_irq(struct loongarch_extioi *s, int irq, int level);
int kvm_loongarch_register_extioi_device(void);
int kvm_loongarch_reset_extioi(struct kvm *kvm);
#endif /* LOONGARCH_EXTIOI_H */
+21 −0
Original line number Diff line number Diff line
@@ -781,3 +781,24 @@ int kvm_loongarch_register_extioi_device(void)
	return kvm_register_device_ops(&kvm_loongarch_extioi_dev_ops,
					KVM_DEV_TYPE_LA_EXTIOI);
}

int kvm_loongarch_reset_extioi(struct kvm *kvm)
{
	struct loongarch_extioi *extioi = kvm->arch.extioi;
	unsigned long flags;
	u8 offset, size;
	u8 *pstart;

	if (!extioi)
		return -EINVAL;

	pstart = (char *)&extioi->nodetype;
	offset = (char *)&extioi->nodetype - (char *)extioi;
	size = sizeof(struct loongarch_extioi) - offset;

	loongarch_ext_irq_lock(extioi, flags);
	memset(pstart, 0, size);
	loongarch_ext_irq_unlock(extioi, flags);

	return 0;
}
+2 −0
Original line number Diff line number Diff line
@@ -870,6 +870,8 @@ static int kvm_set_one_reg(struct kvm_vcpu *vcpu,
			break;
		case KVM_REG_LOONGARCH_VCPU_RESET:
			vcpu->arch.st.guest_addr = 0;
			if (vcpu->vcpu_id == 0)
				kvm_loongarch_reset_extioi(vcpu->kvm);
			memset(&vcpu->arch.irq_pending, 0, sizeof(vcpu->arch.irq_pending));
			memset(&vcpu->arch.irq_clear, 0, sizeof(vcpu->arch.irq_clear));
			break;