From nobody Mon Feb 9 00:00:56 2026 Received: from mail-pf1-f202.google.com (mail-pf1-f202.google.com [209.85.210.202]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 65B26376469 for ; Thu, 29 Jan 2026 01:16:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769649401; cv=none; b=F4CMQ3CZEUwl839IL7CKRV9VjKd79pLtE9tOMN5WhlTEuQfPkxWKEYw/OZqtlAJdmeh/HVp9eul42/YHL9AohzU5G+PdUeJYEB9794Rouzyr763SO85fKww3lxtyu8ryfSVqtTGf0WGEtTNxhemWsqxLIrwEGMAjYddF9u2V3EI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769649401; c=relaxed/simple; bh=E81ZhmT2t0PJD5dbqVBjf6xweJIj6b/NPrrZPd0lj4k=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=sSiv2w2MQuYR6MOcUWXwRLyV15HCGA5lXGKZ9HRPz4edgsumFn5+eFjL67gWQJJTGLHXVq51tRTp1orNqAIUrj2xQHjB5sDIs45duro97Y/BMq0W5jroIitgYWsRULHtmNvAVifiIJ6+5Qot8/6innNTensoFAUo5CpYacNN9Rc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=eq19XCw9; arc=none smtp.client-ip=209.85.210.202 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="eq19XCw9" Received: by mail-pf1-f202.google.com with SMTP id d2e1a72fcca58-81c68fef4d4so1145348b3a.2 for ; Wed, 28 Jan 2026 17:16:40 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1769649400; x=1770254200; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=4KWczVW3BK+JCRmXurxu5hKVHytxWOCNoKeowZmDwwM=; b=eq19XCw9ByLa0Fhtodu7upOCibpeL/vACstyYEa+YcjJoAkedHpXo2AxfvjseOQu2D WIKp3SL3FTnew9zbjYBAr5tsAeCr9+aKmH8g0b5M4wFG+sa0kSCkTdKAxyGa59Gc5Huk wuP6yayJ9s9iYCQf2hpWU1Wvs+S/EFRmipvHnhlEK10VpSjtUo23KDEHeWgrQApcK9fd xcv7G2nGsv84MPfJygHnH6pgPcJ/P6dSKbR5q4hZUjHk9KWHEx8Y4GwACDa5j1wDXazE r57SjR62f9E6pyUMALl7aDHgCnAnbhd3WJzml5QEfZDgz31eHwzRU5G0NIVfvwolIStz tsvA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1769649400; x=1770254200; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=4KWczVW3BK+JCRmXurxu5hKVHytxWOCNoKeowZmDwwM=; b=qqHcJEw4ds+cCoYv4CUpRuELUP+HRQQ9qcgQnQYoLM864NXF0PeIG0bpcKLu5uZYkM HJJl++tt/fy40Pi7Dqn9OE/gcpr1MwwFk/mV4FgIusgVP5vX/27Gfn70boC29dPP1N7F eMa30jbwdFhTPZ9BimLlN46pUy4NUERI4TQghNd/J7mmXbfxXJNbahAYPncNu2sL2SQ5 IC/1epKvQMnHYO9r7OrrTfDKPcQplRTpwXZZ9JChQnwucqHMz34+gFfpMoA6uB+7+Y7A RZFqxxQrX5iNlPZgASuZ3ajaOLCkob8OE7EG54XmU5RlL5GPJEx08DwnqewgbHptEvmW PhWQ== X-Gm-Message-State: AOJu0YywTb+yOX1cWClUmWtCqGrrZRNzRFuOl9PsnV7/ai/nR39TdUiP Rhz6l1DqmcpooNwi5qG+yFXoPhXpu9kjixb1qz/qgZ/D+2Eg+G2idFO4MiA3LIn26gw/W8Pr1c8 k1RZ5Vw== X-Received: from pfcy16.prod.google.com ([2002:a05:6a00:93d0:b0:823:747:7567]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:3d14:b0:81b:1a87:9eb9 with SMTP id d2e1a72fcca58-823691866damr6265136b3a.25.1769649399557; Wed, 28 Jan 2026 17:16:39 -0800 (PST) Reply-To: Sean Christopherson Date: Wed, 28 Jan 2026 17:15:10 -0800 In-Reply-To: <20260129011517.3545883-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260129011517.3545883-1-seanjc@google.com> X-Mailer: git-send-email 2.53.0.rc1.217.geba53bf80e-goog Message-ID: <20260129011517.3545883-39-seanjc@google.com> Subject: [RFC PATCH v5 38/45] KVM: x86/mmu: Add Dynamic PAMT support in TDP MMU for vCPU-induced page split From: Sean Christopherson To: Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, Kiryl Shutsemau , Sean Christopherson , Paolo Bonzini Cc: linux-kernel@vger.kernel.org, linux-coco@lists.linux.dev, kvm@vger.kernel.org, Kai Huang , Rick Edgecombe , Yan Zhao , Vishal Annapurve , Ackerley Tng , Sagi Shahar , Binbin Wu , Xiaoyao Li , Isaku Yamahata Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Extend the TDP MMU to support vCPU-induced hugepage splits in mirror roots when Dynamic PAMT is enabled. I.e. top-up the PAMT cache when allocating a new child page table, so that if the split is successful, there will be a PAMT paging waiting to associated with the new less/non-huge mapping. Note, the allocation is for the guest memory, not the S-EPT page, as PAMT pages are accounted up front by .alloc_external_sp(). Signed-off-by: Sean Christopherson --- arch/x86/kvm/mmu/tdp_mmu.c | 25 ++++++++++++++++--------- arch/x86/kvm/vmx/tdx.c | 3 +++ 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/arch/x86/kvm/mmu/tdp_mmu.c b/arch/x86/kvm/mmu/tdp_mmu.c index 4f5b80f0ca03..e32034bfca5a 100644 --- a/arch/x86/kvm/mmu/tdp_mmu.c +++ b/arch/x86/kvm/mmu/tdp_mmu.c @@ -1456,21 +1456,28 @@ static struct kvm_mmu_page *tdp_mmu_alloc_sp_for_sp= lit(struct tdp_iter *iter) return NULL; =20 sp->spt =3D (void *)get_zeroed_page(GFP_KERNEL_ACCOUNT); - if (!sp->spt) { - kmem_cache_free(mmu_page_header_cache, sp); - return NULL; - } + if (!sp->spt) + goto err_spt; =20 if (is_mirror_sptep(iter->sptep)) { sp->external_spt =3D (void *)kvm_x86_call(alloc_external_sp)(GFP_KERNEL_= ACCOUNT); - if (!sp->external_spt) { - free_page((unsigned long)sp->spt); - kmem_cache_free(mmu_page_header_cache, sp); - return NULL; - } + if (!sp->external_spt) + goto err_external_spt; + + if (kvm_x86_call(topup_external_cache)(kvm_get_running_vcpu(), 1)) + goto err_external_split; } =20 return sp; + +err_external_split: + kvm_x86_call(free_external_sp)((unsigned long)sp->external_spt); +err_external_spt: + free_page((unsigned long)sp->spt); +err_spt: + kmem_cache_free(mmu_page_header_cache, sp); + return NULL; + } =20 /* Note, the caller is responsible for initializing @sp. */ diff --git a/arch/x86/kvm/vmx/tdx.c b/arch/x86/kvm/vmx/tdx.c index 59b7ba36d3d9..e90610540a0b 100644 --- a/arch/x86/kvm/vmx/tdx.c +++ b/arch/x86/kvm/vmx/tdx.c @@ -1625,6 +1625,9 @@ static int tdx_topup_external_pamt_cache(struct kvm_v= cpu *vcpu, int min) if (!tdx_supports_dynamic_pamt(tdx_sysinfo)) return 0; =20 + if (WARN_ON_ONCE(!vcpu)) + return -EIO; + return tdx_topup_pamt_cache(&to_tdx(vcpu)->pamt_cache, min); } =20 --=20 2.53.0.rc1.217.geba53bf80e-goog