mirror of
https://github.com/torvalds/linux.git
synced 2025-12-07 20:06:24 +00:00
KVM: TDX: Fold tdx_sept_zap_private_spte() into tdx_sept_remove_private_spte()
Do TDH_MEM_RANGE_BLOCK directly in tdx_sept_remove_private_spte() instead of using a one-off helper now that the nr_premapped tracking is gone. Opportunistically drop the WARN on hugepages, which was dead code (see the KVM_BUG_ON() in tdx_sept_remove_private_spte()). No functional change intended. Reviewed-by: Rick Edgecombe <rick.p.edgecombe@intel.com> Reviewed-by: Kai Huang <kai.huang@intel.com> Reviewed-by: Binbin Wu <binbin.wu@linux.intel.com> Reviewed-by: Yan Zhao <yan.y.zhao@intel.com> Tested-by: Yan Zhao <yan.y.zhao@intel.com> Tested-by: Kai Huang <kai.huang@intel.com> Link: https://patch.msgid.link/20251030200951.3402865-18-seanjc@google.com Signed-off-by: Sean Christopherson <seanjc@google.com>
This commit is contained in:
@@ -1683,33 +1683,6 @@ static int tdx_sept_link_private_spt(struct kvm *kvm, gfn_t gfn,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int tdx_sept_zap_private_spte(struct kvm *kvm, gfn_t gfn,
|
||||
enum pg_level level, struct page *page)
|
||||
{
|
||||
int tdx_level = pg_level_to_tdx_sept_level(level);
|
||||
struct kvm_tdx *kvm_tdx = to_kvm_tdx(kvm);
|
||||
gpa_t gpa = gfn_to_gpa(gfn) & KVM_HPAGE_MASK(level);
|
||||
u64 err, entry, level_state;
|
||||
|
||||
/* For now large page isn't supported yet. */
|
||||
WARN_ON_ONCE(level != PG_LEVEL_4K);
|
||||
|
||||
err = tdh_mem_range_block(&kvm_tdx->td, gpa, tdx_level, &entry, &level_state);
|
||||
|
||||
if (unlikely(tdx_operand_busy(err))) {
|
||||
/* After no vCPUs enter, the second retry is expected to succeed */
|
||||
tdx_no_vcpus_enter_start(kvm);
|
||||
err = tdh_mem_range_block(&kvm_tdx->td, gpa, tdx_level, &entry, &level_state);
|
||||
tdx_no_vcpus_enter_stop(kvm);
|
||||
}
|
||||
|
||||
if (KVM_BUG_ON(err, kvm)) {
|
||||
pr_tdx_error_2(TDH_MEM_RANGE_BLOCK, err, entry, level_state);
|
||||
return -EIO;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Ensure shared and private EPTs to be flushed on all vCPUs.
|
||||
* tdh_mem_track() is the only caller that increases TD epoch. An increase in
|
||||
@@ -1790,7 +1763,6 @@ static void tdx_sept_remove_private_spte(struct kvm *kvm, gfn_t gfn,
|
||||
struct kvm_tdx *kvm_tdx = to_kvm_tdx(kvm);
|
||||
gpa_t gpa = gfn_to_gpa(gfn);
|
||||
u64 err, entry, level_state;
|
||||
int ret;
|
||||
|
||||
/*
|
||||
* HKID is released after all private pages have been removed, and set
|
||||
@@ -1804,9 +1776,18 @@ static void tdx_sept_remove_private_spte(struct kvm *kvm, gfn_t gfn,
|
||||
if (KVM_BUG_ON(level != PG_LEVEL_4K, kvm))
|
||||
return;
|
||||
|
||||
ret = tdx_sept_zap_private_spte(kvm, gfn, level, page);
|
||||
if (ret <= 0)
|
||||
err = tdh_mem_range_block(&kvm_tdx->td, gpa, tdx_level, &entry, &level_state);
|
||||
if (unlikely(tdx_operand_busy(err))) {
|
||||
/* After no vCPUs enter, the second retry is expected to succeed */
|
||||
tdx_no_vcpus_enter_start(kvm);
|
||||
err = tdh_mem_range_block(&kvm_tdx->td, gpa, tdx_level, &entry, &level_state);
|
||||
tdx_no_vcpus_enter_stop(kvm);
|
||||
}
|
||||
|
||||
if (KVM_BUG_ON(err, kvm)) {
|
||||
pr_tdx_error_2(TDH_MEM_RANGE_BLOCK, err, entry, level_state);
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* TDX requires TLB tracking before dropping private page. Do
|
||||
|
||||
Reference in New Issue
Block a user