Unverified Commit 17d734cf authored by openeuler-ci-bot's avatar openeuler-ci-bot Committed by Gitee
Browse files

!14229 Fix extioi restart issue in vm

Merge Pull Request from: @lixianglai 
 
ISSUE: 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 
 
Link:https://gitee.com/openeuler/kernel/pulls/14229

 

Reviewed-by: default avatarMao Bibo <maobibo@loongson.cn>
Signed-off-by: default avatarZhang Peng <zhangpeng362@huawei.com>
parents 51a55d4e f51feae0
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;