Commit 11954536 authored by gongchangsui's avatar gongchangsui
Browse files

Bug fix: Resolve the issue of host hard lockup

virtcca inclusion
category: feature
bugzilla: https://gitee.com/openeuler/kernel/issues/IBQSQW



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

VirtCCA Feature:
Bug fix: Resolve the issue of host hard lockup

Resolve the issue of host hard lockup during the destruction of
large secure memory in CVM.

Signed-off-by: default avatargongchangsui <gongchangsui@outlook.com>
parent 1112b20b
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -31,6 +31,7 @@
#define TMI_ERROR_INTERNAL		11
#define TMI_ERROR_CVM_POWEROFF		12
#define TMI_ERROR_TTT_CREATED		13
#define TMI_ERROR_TTT_DESTROY_AGAIN	14

#define TMI_RETURN_STATUS(ret)		((ret) & 0xFF)
#define TMI_RETURN_INDEX(ret)		(((ret) >> 8) & 0xFF)
@@ -230,6 +231,7 @@ struct tmi_tec_run {
#define TMI_FNUM_FEATURES               U(0x26C)
#define TMI_FNUM_TTT_MAP_RANGE          U(0x26D)
#define TMI_FNUM_TTT_UNMAP_RANGE        U(0x26E)
#define TMI_FNUM_TTT_DESTROY            U(0x26F)
#define TMI_FNUM_INF_TEST               U(0x270)
#define TMI_FNUM_KAE_INIT               U(0x273)
#define TMI_FNUM_KAE_ENABLE             U(0x274)
@@ -266,6 +268,7 @@ struct tmi_tec_run {
#define TMI_TMM_MEM_INFO_SHOW           TMI_FID(SMC_64, TMI_FNUM_MEM_INFO_SHOW)
#define TMI_TMM_TTT_MAP_RANGE           TMI_FID(SMC_64, TMI_FNUM_TTT_MAP_RANGE)
#define TMI_TMM_TTT_UNMAP_RANGE         TMI_FID(SMC_64, TMI_FNUM_TTT_UNMAP_RANGE)
#define TMI_TMM_TTT_DESTROY             TMI_FID(SMC_64, TMI_FNUM_TTT_DESTROY)
#define TMI_TMM_INF_TEST                TMI_FID(SMC_64, TMI_FNUM_INF_TEST)
#define TMI_TMM_KAE_INIT                TMI_FID(SMC_64, TMI_FNUM_KAE_INIT)
#define TMI_TMM_KAE_ENABLE              TMI_FID(SMC_64, TMI_FNUM_KAE_ENABLE)
@@ -392,6 +395,7 @@ u64 tmi_ttt_create(u64 numa_set, u64 rd, u64 map_addr, u64 level);
u64 tmi_psci_complete(u64 calling_tec, u64 target_tec);
u64 tmi_features(u64 index);
u64 tmi_ttt_map_range(u64 rd, u64 map_addr, u64 size, u64 cur_node, u64 target_node);
u64 tmi_ttt_destroy(u64 rd);
u64 tmi_mem_info_show(u64 mem_info_addr);

u64 tmi_dev_ttt_create(u64 numa_set, u64 rd, u64 map_addr, u64 level);
+8 −0
Original line number Diff line number Diff line
@@ -163,6 +163,14 @@ u64 tmi_ttt_map_range(u64 rd, u64 map_addr, u64 size, u64 cur_node, u64 target_n
	return res.a1;
}

u64 tmi_ttt_destroy(u64 rd)
{
	struct arm_smccc_res res;

	arm_smccc_1_1_smc(TMI_TMM_TTT_DESTROY, rd, &res);
	return res.a1;
}

/* Used to create smmu command queue and event queue */
u64 tmi_smmu_queue_create(u64 params_ptr)
{
+14 −0
Original line number Diff line number Diff line
@@ -6,6 +6,7 @@
#include <linux/kvm.h>
#include <linux/vfio.h>
#include <linux/vfio_pci_core.h>
#include <linux/nmi.h>
#include <asm/kvm_tmi.h>
#include <asm/kvm_pgtable.h>
#include <asm/kvm_emulate.h>
@@ -181,6 +182,7 @@ int kvm_arm_create_cvm(struct kvm *kvm)
void kvm_destroy_cvm(struct kvm *kvm)
{
	struct virtcca_cvm *cvm = kvm->arch.virtcca_cvm;
	int ret;
	uint32_t cvm_vmid;
#ifdef CONFIG_HISI_VIRTCCA_CODA
	struct arm_smmu_domain *arm_smmu_domain;
@@ -215,6 +217,18 @@ void kvm_destroy_cvm(struct kvm *kvm)
	if (tmi_kae_enable(cvm->rd, numa_set, 0))
		kvm_err("vf destroy failed!\n");

	do {
		touch_nmi_watchdog();
		ret = tmi_ttt_destroy(cvm->rd);
	} while (ret == TMI_ERROR_TTT_DESTROY_AGAIN);

	/*
	 * Considering that lower versions of TMM do not support
	 * the tmi_ttt_destroy interface.
	 */
	if (ret)
		pr_warn("KVM destroy cVM ttt failed\n");

	if (!tmi_cvm_destroy(cvm->rd))
		kvm_info("KVM has destroyed cVM: %d\n", cvm->cvm_vmid);