From nobody Sat Jul 25 18:53:41 2026 Received: from mail-pl1-f201.google.com (mail-pl1-f201.google.com [209.85.214.201]) (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 2E1D2441024 for ; Tue, 14 Jul 2026 23:10:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784070645; cv=none; b=ZGvoBjklNlgAm4Th09HgkZxs+Nj1pQwXDxuqJXdLE0zKZqqqEIbwp+Gmj/8aYg2Baw1yL3ZVyWsjuWfP5sjJPRDCsXTjTiKhm5nT0HCV19PesfJV+W2uc+TNbWKzxt0JQTg7enlIL3xxDniO8uIpwfQA9kz3gjfIsxV2HcdCiY0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784070645; c=relaxed/simple; bh=tz5b/wi/KYGTi5Nu6+p4FjHc5VJHE+aDIvXJoyYFA78=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=XoHIecug4m9ArIC98PZYCg9TqeYcFncQKz7nBzIQTgCwDRUP9zlNBQnNO9+pYLdZ3KC7wsQMUTftjtHcAQ+RDrrH5I1XDG+74QoMcG1Brj2Z++P8ERWbPfDnqb1Je/l3buz6cqDN6jJoIKVIhgX/EwgTMpyPDq0jwfs428yueTk= 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=tHp8I8PJ; arc=none smtp.client-ip=209.85.214.201 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="tHp8I8PJ" Received: by mail-pl1-f201.google.com with SMTP id d9443c01a7336-2cd01a14e81so69470065ad.1 for ; Tue, 14 Jul 2026 16:10:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1784070639; x=1784675439; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:reply-to:from:to:cc:subject:date:message-id :reply-to:content-type; bh=RrCeiUHQV6TkQ4lj9oPcaTCYumTpjVqI/CaCzGV8zm8=; b=tHp8I8PJgGIN2bFXhcMYInAs0uw0egFbPspSKXD0L/A31k4DCnEnvOXOE9Fl3hAvzH G+h8FJ5LzqcD0YG1sFhGUKzxyIH3ag8+AGk0mFzjZe877suZyhpHP274nujTUD/dIfmn km06QAl/n3yJZzbeEH5MMhW3Wb4q10Mjihhgy+Md6Ox1mXz1KIDvoT1i8mChZB5gtT1s kPRpzUrGtdZCA3wTl0Upq3XSGRQhg/EEAAnnQ4COgLcjgdcYZFlIy1YmMO0nJOgm8NMB SX4KGObVwezAOsr+qT7Av5QAVs05O3r5a5YX+jsH9Ri4SmJZQW+2P2a9nkLgRnXrvR1c SUYQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784070639; x=1784675439; h=content-type: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:content-type; bh=RrCeiUHQV6TkQ4lj9oPcaTCYumTpjVqI/CaCzGV8zm8=; b=eN07uE/RbJAsq19KNLVnqfOTqD+efkrbdI4CFwv7MUqyXG6ELDN0e5CodPoT7nOp1+ ytAsAC+noHBOm4yBaSAiPTPzcMH4LitUdQCpBMJmJQ3JE2Fll/KUsLK0M8z9BAOiGnIq 1Lr8PIwaNsBDxcD2O5qidumEeSwEc1N9V5knqKC55TMYazTZoXF5fZTi80A+oWJlLOP5 vGmbchanOuWukwH96fgogFRn21cNGc4RXi7FkSiUvHni4P3JXYqrVAltK+ktv9xORKHF VeQmKCYV7B+JeyDxUvqeCnSpYY1B625FZfk94bJl4EKdL71HSvx/TnVPx5Rr0DI8zmet tB2A== X-Forwarded-Encrypted: i=1; AHgh+RoY9YQqtyO/3pAJN52qZ4auZZ9bwn9QTFxVoPcq0jkSf7KFHm/LqWReKT7L73n0efkQH0Epuo2UI3lS3M0=@vger.kernel.org X-Gm-Message-State: AOJu0Yz8cp0RlD+969RvUBC/+C/WBoXYJwR5CuqajjOn98Vvtxl5Kr+Z kc01Y/BIP8C0c4rV+RNfNvxRlZGzPof9S/Lpk41CbUf521b5cDz2Qgd3p7ddY8Gm1cam7JEWGq5 9GOzQCg== X-Received: from pjbgb7.prod.google.com ([2002:a17:90b:607:b0:380:6618:e058]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:55cc:b0:381:22d6:f7a3 with SMTP id 98e67ed59e1d1-38e2a030362mr523926a91.18.1784070617847; Tue, 14 Jul 2026 16:10:17 -0700 (PDT) Reply-To: Sean Christopherson Date: Tue, 14 Jul 2026 16:10:09 -0700 In-Reply-To: <20260714231015.3337831-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: <20260714231015.3337831-1-seanjc@google.com> X-Mailer: git-send-email 2.55.0.141.g00534a21ce-goog Message-ID: <20260714231015.3337831-2-seanjc@google.com> Subject: [PATCH v5 1/7] KVM: guest_memfd: Plumb the number of pages and max order into .invalidate() From: Sean Christopherson To: Sean Christopherson , Paolo Bonzini Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Fuad Tabba , Ackerley Tng Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Plumb the number of pages to "invalidate", i.e. reclaim, along with the max order with which the pages can be mapped. This will allow x86 to combine its vendor-specific implementations for conversion and reclaim, a.k.a. preparation and invalidation, into a single hook. No functional change intended. Signed-off-by: Sean Christopherson Reviewed-by: Ackerley Tng Reviewed-by: Fuad Tabba --- arch/x86/kvm/x86.c | 4 ++-- include/linux/kvm_host.h | 2 +- virt/kvm/guest_memfd.c | 7 ++----- 3 files changed, 5 insertions(+), 8 deletions(-) diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 1f5dc685f049..a2cbf6fae118 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -10627,9 +10627,9 @@ int kvm_arch_gmem_prepare(struct kvm *kvm, gfn_t gf= n, kvm_pfn_t pfn, int max_ord #endif =20 #ifdef CONFIG_HAVE_KVM_ARCH_GMEM_INVALIDATE -void kvm_arch_gmem_invalidate(kvm_pfn_t start, kvm_pfn_t end) +void kvm_arch_gmem_invalidate(kvm_pfn_t pfn, kvm_pfn_t nr_pages, int max_o= rder) { - kvm_x86_call(gmem_invalidate)(start, end); + kvm_x86_call(gmem_invalidate)(pfn, pfn + nr_pages); } void kvm_arch_gmem_invalidate_range(struct kvm *kvm, struct kvm_gfn_range = *range) { diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index 9db6eb4023c4..996b39ebdb68 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h @@ -2614,7 +2614,7 @@ long kvm_gmem_populate(struct kvm *kvm, gfn_t start_g= fn, void __user *src, #endif =20 #ifdef CONFIG_HAVE_KVM_ARCH_GMEM_INVALIDATE -void kvm_arch_gmem_invalidate(kvm_pfn_t start, kvm_pfn_t end); +void kvm_arch_gmem_invalidate(kvm_pfn_t pfn, kvm_pfn_t nr_pages, int order= ); void kvm_arch_gmem_invalidate_range(struct kvm *kvm, struct kvm_gfn_range = *range); #endif =20 diff --git a/virt/kvm/guest_memfd.c b/virt/kvm/guest_memfd.c index 171a9da1b685..99c070bfd446 100644 --- a/virt/kvm/guest_memfd.c +++ b/virt/kvm/guest_memfd.c @@ -530,11 +530,8 @@ static int kvm_gmem_error_folio(struct address_space *= mapping, struct folio *fol #ifdef CONFIG_HAVE_KVM_ARCH_GMEM_INVALIDATE static void kvm_gmem_free_folio(struct folio *folio) { - struct page *page =3D folio_page(folio, 0); - kvm_pfn_t pfn =3D page_to_pfn(page); - int order =3D folio_order(folio); - - kvm_arch_gmem_invalidate(pfn, pfn + (1ul << order)); + kvm_arch_gmem_invalidate(folio_file_pfn(folio, 0), folio_nr_pages(folio), + folio_order(folio)); } #endif =20 --=20 2.55.0.141.g00534a21ce-goog From nobody Sat Jul 25 18:53:41 2026 Received: from mail-pg1-f201.google.com (mail-pg1-f201.google.com [209.85.215.201]) (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 2D049418A4A for ; Tue, 14 Jul 2026 23:10:29 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784070634; cv=none; b=JIjHb5xJwpwDzZljbzlKdIQlN/zrGOFFQGmAQnPIvu6m9XMDDfLCG4adASIivjYAKjAYFxrpf0U6uRU1f+AVAhesIO/EgqLP7RWF1nObKoe6Te/LAp5bme/fCPN7M5OU53VhS9bo7yUPIb2yMxigydW3uUKaqHajqMpR9XMevQ8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784070634; c=relaxed/simple; bh=UkkyQjvqNT2W6S+i7qozEefyt3of6Y2gOwMbSYTJvLo=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=seJwHkhBLMAiK4PSX2NBsCxfap+F0G0RwocvrlWbI+foHuLklpYP0Ot1AtPda4sZJhAu9aztOeeEtCe2iOr202qaD/w42ZFV/ekUL18DsMatPRyOlZmaKwHz/t58tqV7p6S71rWWZ0sQhJ/hCtPqaRxXgwUlYd9kH09HOQ2n/cg= 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=OoTW59HO; arc=none smtp.client-ip=209.85.215.201 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="OoTW59HO" Received: by mail-pg1-f201.google.com with SMTP id 41be03b00d2f7-c856470fe9fso1366698a12.2 for ; Tue, 14 Jul 2026 16:10:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1784070628; x=1784675428; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:reply-to:from:to:cc:subject:date:message-id :reply-to:content-type; bh=VgYwcrtH4ra6/vlAi0spcnkFJPt2G+1EVF5ztYS5YEE=; b=OoTW59HOEe/qRMPKaHvBGMZ0TgGboVyNAx3vr0l4Et14SKpY9GP3FseUR771zc3n84 jZHAwynHdsuuagcy3VouVVXtj4W8oP1gD6syCv7MCEWupEx/mgp9ikCffN6mR8el7uue ufbK9dJS5qCzEv/hJOFaJ3AdMYTjd+X8sT6WCS8xPEXsWBUbOi94E/FDCHXD3aBOEwa+ grFvzPZA7HSVqFMvuWzDdyvshwnokXHX23IUmImzYjvIjberYIkafQsuYF6jxfKx78UO Ta3aaB7oKo4NWbjkqyfJV9r/D0x7XauATw24JFMgGKFoebWk9TpTsxgoVpThSuFpjulk ffWw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784070628; x=1784675428; h=content-type: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:content-type; bh=VgYwcrtH4ra6/vlAi0spcnkFJPt2G+1EVF5ztYS5YEE=; b=lEMXk8p/Sr7gWrlFmHFHP0L4iatoCZzv53ppq4x1zDU0z2vrJBPpRbYXXpcbXbyfVJ VGMni+h1CWa6dflTM5DmeSrA43SpkAFamS0IJP652f2gPKEET7mci17RTZG8MmA3vvu3 GFgR8F0wO5l52xdt//27RGuaqzOBQi6Z2EL9shudpCHQKYHpw9IJJtBe/3G8xRmZ3y/H EWAmTtX+FTO9jjYTrGjL6qWOgm5KjMsGEqdMYbsjLKWx6eS9kB6vRKaR3PY3zY0ChskB fac86I8Sm8owQcXm2wHlv9l4lCehPY606q22+Ao/wWTFLjFf4hyLgivsxH0LyLUGkhX0 WnwQ== X-Forwarded-Encrypted: i=1; AHgh+RpyQoGq4MgQNN9JjldkfQVTF+Gd2OiADJCn3fcddxib6+FxzRNEtFZ2hdJQTRtiUSEqNgteqNnxSbCvz+g=@vger.kernel.org X-Gm-Message-State: AOJu0YyNMqWXYXrtMuswfWuIGNBds68ZivXf0eMaA7uEYtssjIVe+rSj IfuelTUIsdjUND/CM2Vesw6Z3/lH1+1NID10kNFfJfuxD0/OZ16Z95B8h9vlGITltNUZ88AJgwd KV4pV4w== X-Received: from pjyj22.prod.google.com ([2002:a17:90a:e616:b0:381:171e:961c]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:554e:b0:387:e0db:bc30 with SMTP id 98e67ed59e1d1-38dc7bb6bf8mr13572712a91.38.1784070628299; Tue, 14 Jul 2026 16:10:28 -0700 (PDT) Reply-To: Sean Christopherson Date: Tue, 14 Jul 2026 16:10:10 -0700 In-Reply-To: <20260714231015.3337831-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: <20260714231015.3337831-1-seanjc@google.com> X-Mailer: git-send-email 2.55.0.141.g00534a21ce-goog Message-ID: <20260714231015.3337831-3-seanjc@google.com> Subject: [PATCH v5 2/7] KVM: guest_memfd: Rename invalidate() arch hook to reclaim() and isolate it From: Sean Christopherson To: Sean Christopherson , Paolo Bonzini Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Fuad Tabba , Ackerley Tng Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Rename guest_memfd's invalidate() hook to reclaim() and isolate it via its own RECLAIM Kconfig, as the hook is called when a folio is freed, which is far too late and lacks sufficient information for KVM to actually invalidate its usage of the memory. E.g. SNP uses the hook to convert memory back to SHARED so that it can be safely accessed by the host, there is no invalidation of guest mappings anywhere. Isolating the hook will also allow pKVM on arm64 to opt-in to reclaim() without also having to differentiate between reclaim and conversions to shared for active VMs. Keep guest_memfd's trampoline, even though it would be trivial to wire up .free_folio() directly to an arch callback, to avoid bleeding guest_memfd internals into arch code (specifically, avoid referencing folios in arch code). Leave the kvm_x86_ops hook as-is for the moment, as the hook can be dropped entirely ("reclaim" on SNP is the same as convert-to-shared). Cc: Fuad Tabba Cc: Ackerley Tng Signed-off-by: Sean Christopherson Reviewed-by: Ackerley Tng Reviewed-by: Fuad Tabba Reviewed-by: Xiaoyao Li --- arch/x86/kvm/Kconfig | 1 + arch/x86/kvm/x86.c | 7 +++++-- include/linux/kvm_host.h | 5 ++++- virt/kvm/Kconfig | 4 ++++ virt/kvm/guest_memfd.c | 8 ++++---- 5 files changed, 18 insertions(+), 7 deletions(-) diff --git a/arch/x86/kvm/Kconfig b/arch/x86/kvm/Kconfig index 801bf9e520db..e0e7ad015839 100644 --- a/arch/x86/kvm/Kconfig +++ b/arch/x86/kvm/Kconfig @@ -161,6 +161,7 @@ config KVM_AMD_SEV select ARCH_HAS_CC_PLATFORM select KVM_GENERIC_MEMORY_ATTRIBUTES select HAVE_KVM_ARCH_GMEM_PREPARE + select HAVE_KVM_ARCH_GMEM_RECLAIM select HAVE_KVM_ARCH_GMEM_INVALIDATE select HAVE_KVM_ARCH_GMEM_POPULATE help diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index a2cbf6fae118..08d24c6fffa4 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -10626,11 +10626,14 @@ int kvm_arch_gmem_prepare(struct kvm *kvm, gfn_t = gfn, kvm_pfn_t pfn, int max_ord } #endif =20 -#ifdef CONFIG_HAVE_KVM_ARCH_GMEM_INVALIDATE -void kvm_arch_gmem_invalidate(kvm_pfn_t pfn, kvm_pfn_t nr_pages, int max_o= rder) +#ifdef CONFIG_HAVE_KVM_ARCH_GMEM_RECLAIM +void kvm_arch_gmem_reclaim(kvm_pfn_t pfn, kvm_pfn_t nr_pages, int max_orde= r) { kvm_x86_call(gmem_invalidate)(pfn, pfn + nr_pages); } +#endif + +#ifdef CONFIG_HAVE_KVM_ARCH_GMEM_INVALIDATE void kvm_arch_gmem_invalidate_range(struct kvm *kvm, struct kvm_gfn_range = *range) { kvm_x86_call(gmem_invalidate_range)(kvm, range); diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index 996b39ebdb68..ee87ddd3294f 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h @@ -2613,8 +2613,11 @@ long kvm_gmem_populate(struct kvm *kvm, gfn_t start_= gfn, void __user *src, kvm_gmem_populate_cb post_populate, void *opaque); #endif =20 +#ifdef CONFIG_HAVE_KVM_ARCH_GMEM_RECLAIM +void kvm_arch_gmem_reclaim(kvm_pfn_t pfn, kvm_pfn_t nr_pages, int order); +#endif + #ifdef CONFIG_HAVE_KVM_ARCH_GMEM_INVALIDATE -void kvm_arch_gmem_invalidate(kvm_pfn_t pfn, kvm_pfn_t nr_pages, int order= ); void kvm_arch_gmem_invalidate_range(struct kvm *kvm, struct kvm_gfn_range = *range); #endif =20 diff --git a/virt/kvm/Kconfig b/virt/kvm/Kconfig index 794976b88c6f..617876993225 100644 --- a/virt/kvm/Kconfig +++ b/virt/kvm/Kconfig @@ -111,6 +111,10 @@ config HAVE_KVM_ARCH_GMEM_PREPARE bool depends on KVM_GUEST_MEMFD =20 +config HAVE_KVM_ARCH_GMEM_RECLAIM + bool + depends on KVM_GUEST_MEMFD + config HAVE_KVM_ARCH_GMEM_INVALIDATE bool depends on KVM_GUEST_MEMFD diff --git a/virt/kvm/guest_memfd.c b/virt/kvm/guest_memfd.c index 99c070bfd446..d5d227476cda 100644 --- a/virt/kvm/guest_memfd.c +++ b/virt/kvm/guest_memfd.c @@ -527,11 +527,11 @@ static int kvm_gmem_error_folio(struct address_space = *mapping, struct folio *fol return MF_DELAYED; } =20 -#ifdef CONFIG_HAVE_KVM_ARCH_GMEM_INVALIDATE +#ifdef CONFIG_HAVE_KVM_ARCH_GMEM_RECLAIM static void kvm_gmem_free_folio(struct folio *folio) { - kvm_arch_gmem_invalidate(folio_file_pfn(folio, 0), folio_nr_pages(folio), - folio_order(folio)); + kvm_arch_gmem_reclaim(folio_file_pfn(folio, 0), folio_nr_pages(folio), + folio_order(folio)); } #endif =20 @@ -539,7 +539,7 @@ static const struct address_space_operations kvm_gmem_a= ops =3D { .dirty_folio =3D noop_dirty_folio, .migrate_folio =3D kvm_gmem_migrate_folio, .error_remove_folio =3D kvm_gmem_error_folio, -#ifdef CONFIG_HAVE_KVM_ARCH_GMEM_INVALIDATE +#ifdef CONFIG_HAVE_KVM_ARCH_GMEM_RECLAIM .free_folio =3D kvm_gmem_free_folio, #endif }; --=20 2.55.0.141.g00534a21ce-goog From nobody Sat Jul 25 18:53:41 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 64FB8429CF9 for ; Tue, 14 Jul 2026 23:10:30 +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=1784070635; cv=none; b=mMccfzp7e8IT8PJw4jY2IMNloOMB0uw5lxR0zMXy/rJ0j/6CjXKpKEP5XN8GQGH3Cq8a+RTcnScmHgt+UIMxQpeDIFJpT1G0CQQ78gowWSddqm7e3wHamM+sZTZ98XMpY6HYfcyh8qOrfTWExuhkFZJqskfw7CHm7RJA1t6QHFI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784070635; c=relaxed/simple; bh=JVKNzQsp+I7eOcRjNI53/TPW+1qioHsNQBp2VmMJGls=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=B0zsmnqD6QxppzLjGeWRqbrB5jF09A4MJX31gKTbMjms6iShE/XjFxdsnjlYS6+CYbYtLSUoXONUxLHC+xyFFD5UfDLUw3HP2tTK5cpCFnBdmxH72bZSXAvn+xVnGh03m7ksvTAI9FNLkj5Edjad3Zv1r6nEw1ivn4SU3qP4ens= 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=pOMtl06K; 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="pOMtl06K" Received: by mail-pf1-f202.google.com with SMTP id d2e1a72fcca58-8423f1fe39eso2660533b3a.1 for ; Tue, 14 Jul 2026 16:10:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1784070630; x=1784675430; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:reply-to:from:to:cc:subject:date:message-id :reply-to:content-type; bh=TkVP/QC6GYBOjGmFAKL/AZv0PRMUOYSMFnc3s7NXiA8=; b=pOMtl06Ky0kvefdSQvFlEvY7qkuAbFyqtGP6NXf2BTF2riZZ01jJK96UHNxX5MuZkz b/6LnIhkjDkfpfWP5DNfVz4gNSCQHqgME7jmqnrLExDP3SnBCnlAscZTV0dPE9SYjA4f gHaqK974WGB4ePGKQ5kgJs6LfBNhekGZxf50p2k4t82n5yg4ceHLPPsh1IxxujqAiRD/ txC9K2F2I34vMWEYwcblxojAxIqOGHDovSPEQnClrqPXELESZyEFZqqCX3r90UlotvRU uroqjI5eFCc8TJXSzIhOwWBTonwgpSd4qHl+muwp2U3xu6AQY4RGJzI4AFIhr9VEJdyS MHzg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784070630; x=1784675430; h=content-type: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:content-type; bh=TkVP/QC6GYBOjGmFAKL/AZv0PRMUOYSMFnc3s7NXiA8=; b=Eec6ECdGZ7ERZ3HoBXn+7k7d9qbjGiy7RWNYH1ABA0Y9sL0Kec5oLRFVXlj7AYZXzW o3cUdvozsiTu980A8AZz/JbDBnLObZyszf4PTdJujdpYpeg4SJK9XKKg8D8WkzCYhqZY 2WI9MwTCPQsUB0gUJ+sK9r6oIgrBupDkxC8KqPNSzAh6RlZZjwc4M8HmzuZtf/HjAY59 UufipVAdIVq26thENf3ekcg8HskkMYtdpLLQOA1obx+KaijirXK/9u6U8a4TUn6i2zk8 tnXFlvbeJ9QdHvOsqSJ4fmbfVGUiTrLTlfofhkM4r3EbXOByBrj9vlVLg/QPQGpESrar ovHA== X-Forwarded-Encrypted: i=1; AHgh+RquZCnpeaDwwSD44zgP9DPKHMaBYxqq0LT7pcJX98yytX6Rc+Sb7RVpuOmXOQp67DQ+vM3J6oZQpFZjMg4=@vger.kernel.org X-Gm-Message-State: AOJu0YyDHfOxinKcUmlKNXRNew1PjM9nauJMg93sMerZVXIlrjuh74bG aZixZn/K/iLipLzPHEFU70SR3KglMzdRWzMdCloUVROltZW4ltHrWkQoROTmVeyLzNpb+XcplbB c3iB+eA== X-Received: from pfbeb6.prod.google.com ([2002:a05:6a00:4c86:b0:84a:37df:a3b1]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:1398:b0:843:49f0:f5a0 with SMTP id d2e1a72fcca58-84889649003mr14779210b3a.32.1784070629377; Tue, 14 Jul 2026 16:10:29 -0700 (PDT) Reply-To: Sean Christopherson Date: Tue, 14 Jul 2026 16:10:11 -0700 In-Reply-To: <20260714231015.3337831-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: <20260714231015.3337831-1-seanjc@google.com> X-Mailer: git-send-email 2.55.0.141.g00534a21ce-goog Message-ID: <20260714231015.3337831-4-seanjc@google.com> Subject: [PATCH v5 3/7] KVM: guest_memfd: Drop the redundant printk on arch gmem_prepare() failure From: Sean Christopherson To: Sean Christopherson , Paolo Bonzini Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Fuad Tabba , Ackerley Tng Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Drop guest_memfd's ratelimited printk to log "preparation" failures, as KVM SNP alreads logs more precise messages in all error paths, and whether or not failure to convert the pfn to private is "unexpected", i.e. warrants logging, is firmly an architecture specific detail. Reviewed-by: Ackerley Tng Signed-off-by: Sean Christopherson Reviewed-by: Fuad Tabba Reviewed-by: Xiaoyao Li --- virt/kvm/guest_memfd.c | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/virt/kvm/guest_memfd.c b/virt/kvm/guest_memfd.c index d5d227476cda..62c2c157f0c1 100644 --- a/virt/kvm/guest_memfd.c +++ b/virt/kvm/guest_memfd.c @@ -66,15 +66,11 @@ static int __kvm_gmem_prepare_folio(struct kvm *kvm, st= ruct kvm_memory_slot *slo #ifdef CONFIG_HAVE_KVM_ARCH_GMEM_PREPARE kvm_pfn_t pfn =3D folio_file_pfn(folio, index); gfn_t gfn =3D slot->base_gfn + index - slot->gmem.pgoff; - int rc =3D kvm_arch_gmem_prepare(kvm, gfn, pfn, folio_order(folio)); - if (rc) { - pr_warn_ratelimited("gmem: Failed to prepare folio for index %lx GFN %ll= x PFN %llx error %d.\n", - index, gfn, pfn, rc); - return rc; - } -#endif =20 + return kvm_arch_gmem_prepare(kvm, gfn, pfn, folio_order(folio)); +#else return 0; +#endif } =20 /* --=20 2.55.0.141.g00534a21ce-goog From nobody Sat Jul 25 18:53:41 2026 Received: from mail-pf1-f201.google.com (mail-pf1-f201.google.com [209.85.210.201]) (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 6E52942BEBA for ; Tue, 14 Jul 2026 23:10:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784070636; cv=none; b=k/30ynOmIzLeAkMH6TJxco8wxyuFPyD+mM1NaQT1xQx1IJnD0QFuUSnEOKqdOJG+xrDeHiypofcYPBWc6OgUcZohVvGUu57D4agITsops9JHdJL+zTWbPSXGu4CXCWmTGrPnfSKsRwhcDUW7bFf8hoXq0Ha1Sg2yHd9hF3sEDJg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784070636; c=relaxed/simple; bh=VS5kLf1YHr+hxUl/0CfBAnuEHDyMwEcyfjPnCxppJuE=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=EpXHDhdAQvcIJEkGceezlC9YJJvsKDuFunH08wuyLwCu44cW5h/spwedfxRlRADV+dfnrZhonYhK1w6P/RDrPZbjeyfQxCocAUAi/JOtORl7YDCeGX6nA4YnveLjHtiabH552jW29pApCTjhmW55m+mFAeqjzPVEBg0tkjW0J40= 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=ToLrMPnE; arc=none smtp.client-ip=209.85.210.201 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="ToLrMPnE" Received: by mail-pf1-f201.google.com with SMTP id d2e1a72fcca58-84859a64079so8613930b3a.3 for ; Tue, 14 Jul 2026 16:10:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1784070631; x=1784675431; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:reply-to:from:to:cc:subject:date:message-id :reply-to:content-type; bh=uQPpkuZ7+BAJNsSp57OZqehFLTzlDB+hdw9yVvivlTA=; b=ToLrMPnEQgrvy/6pElccCWUX7IDXos9ZdEmw9Z2zbpNnd/xvLiWZiigPIQUGhDTJXH x2U6xrz6GZCa9gg+X6ZQq0pqqn52YwibXqkrIqVkXURKNMNSxPxuXud+rxj/Kv8bo1bV wiGYrICOZoKcVv9GyofzkNit5CUN+Xm9v6AEPyEcOhD7Fc99GxNGk2WzDBia+x1tTuqv R0CHkxTGdy/iRJsXd+Bn15c1rW/au4hALMl5sNGBNuhs+oxMfi1eaGcd3Wg6rgMedcvQ u4Adj1M/W1RNf3XsQtD7dLQRltomPYan72DV1Foofno3NzhFadYW6EFRus5aveHx/nD1 m80w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784070631; x=1784675431; h=content-type: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:content-type; bh=uQPpkuZ7+BAJNsSp57OZqehFLTzlDB+hdw9yVvivlTA=; b=LMVoBeMv1tbVMBpXLaVaHvmFB4aSqoeKk7kmPymls8WFq8rfUkjsnZYHCByZBiB9xN L7jSdbswjkhAtLJ4woBLpf9hycxCE01DX64o6HCiyAOtMqfuLSSqYlJYlD4InDMcMfGn rw5c6Go7cWijsJuWKDocFsjT51lO9XrXtZufRXN33sMmFkAE3piJ7ScilbeaOyZqNMkH U+zRMD8GBKyHVN6xuKCmEGDlVIi/vnZF3tACUzhUA7wqdIqfSeMFHHScvRH3AEnfH6Kq fBj0CVxi248ANqRun8ZucOlEi+wIM47Pud1GzmJTDolgvOffazKraM4jYJqhuS57pIxH HV+w== X-Forwarded-Encrypted: i=1; AHgh+RqIRpg1gczG9vyS26RcrPaPq1ngDfdoJf/jBITn4Dz5DLqsDbxReXoCOKWw2Drmse9e+TNAshJSvgcfqgY=@vger.kernel.org X-Gm-Message-State: AOJu0YzKBiUfV8b+6GhM+81nUiaLj11GdTlyrWAesAklUpWcdtlg2F8V Ysbe3VPrD3ZlWTNQxKPCd6hYAWboykZ7QLt1NcG/jfdUKOaJfH0Uwjq2ht2hgrOtt9EgUDwjID3 qBpmu4g== X-Received: from pfnx11.prod.google.com ([2002:aa7:84cb:0:b0:847:a522:7e85]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:3d55:b0:845:4fec:3f8f with SMTP id d2e1a72fcca58-84a55894653mr4282637b3a.40.1784070630545; Tue, 14 Jul 2026 16:10:30 -0700 (PDT) Reply-To: Sean Christopherson Date: Tue, 14 Jul 2026 16:10:12 -0700 In-Reply-To: <20260714231015.3337831-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: <20260714231015.3337831-1-seanjc@google.com> X-Mailer: git-send-email 2.55.0.141.g00534a21ce-goog Message-ID: <20260714231015.3337831-5-seanjc@google.com> Subject: [PATCH v5 4/7] KVM: guest_memfd: Fold __kvm_gmem_prepare_folio() into its sole caller From: Sean Christopherson To: Sean Christopherson , Paolo Bonzini Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Fuad Tabba , Ackerley Tng Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Fold __kvm_gmem_prepare_folio() into kvm_gmem_prepare_folio() and extend the #ifdef guard to cover all of the kvm_gmem_prepare_folio(). Take care to align the gfn _before_ computing the index, otherwise KVM would end up with a mismatched gfn+pfn pair for folios larger than order-0 (this detail was subtly handled by recomputing gfn in the helper using the aligned pfn). Providing a single-use, ~2 line tail-call helper adds no value. In fact, due to having to reconstitute the gfn, *and* effectively hiding the alignment adjustment for hugepages, the separate helper is very arguably a net negative. Opportunistically convert the existing WARN in the prepare flow to a only fire once, e.g. so that a guest_memfd bug doesn't unintentionally Dos the kernel by spamming the log. No functional change intended. Signed-off-by: Sean Christopherson --- virt/kvm/guest_memfd.c | 24 ++++++++---------------- 1 file changed, 8 insertions(+), 16 deletions(-) diff --git a/virt/kvm/guest_memfd.c b/virt/kvm/guest_memfd.c index 62c2c157f0c1..f9a1d6d64f6c 100644 --- a/virt/kvm/guest_memfd.c +++ b/virt/kvm/guest_memfd.c @@ -60,19 +60,6 @@ static pgoff_t kvm_gmem_get_index(struct kvm_memory_slot= *slot, gfn_t gfn) return gfn - slot->base_gfn + slot->gmem.pgoff; } =20 -static int __kvm_gmem_prepare_folio(struct kvm *kvm, struct kvm_memory_slo= t *slot, - pgoff_t index, struct folio *folio) -{ -#ifdef CONFIG_HAVE_KVM_ARCH_GMEM_PREPARE - kvm_pfn_t pfn =3D folio_file_pfn(folio, index); - gfn_t gfn =3D slot->base_gfn + index - slot->gmem.pgoff; - - return kvm_arch_gmem_prepare(kvm, gfn, pfn, folio_order(folio)); -#else - return 0; -#endif -} - /* * Process @folio, which contains @gfn, so that the guest can use it. * The folio must be locked and the gfn must be contained in @slot. @@ -82,6 +69,7 @@ static int __kvm_gmem_prepare_folio(struct kvm *kvm, stru= ct kvm_memory_slot *slo static int kvm_gmem_prepare_folio(struct kvm *kvm, struct kvm_memory_slot = *slot, gfn_t gfn, struct folio *folio) { +#ifdef CONFIG_HAVE_KVM_ARCH_GMEM_PREPARE pgoff_t index; =20 /* @@ -97,11 +85,15 @@ static int kvm_gmem_prepare_folio(struct kvm *kvm, stru= ct kvm_memory_slot *slot, * The order will be passed when creating the guest_memfd, and * checked when creating memslots. */ - WARN_ON(!IS_ALIGNED(slot->gmem.pgoff, folio_nr_pages(folio))); + WARN_ON_ONCE(!IS_ALIGNED(slot->gmem.pgoff, folio_nr_pages(folio))); + gfn =3D ALIGN_DOWN(gfn, folio_nr_pages(folio)); index =3D kvm_gmem_get_index(slot, gfn); - index =3D ALIGN_DOWN(index, folio_nr_pages(folio)); =20 - return __kvm_gmem_prepare_folio(kvm, slot, index, folio); + return kvm_arch_gmem_prepare(kvm, gfn, folio_file_pfn(folio, index), + folio_order(folio)); +#else + return 0; +#endif } =20 /* --=20 2.55.0.141.g00534a21ce-goog From nobody Sat Jul 25 18:53:41 2026 Received: from mail-pj1-f73.google.com (mail-pj1-f73.google.com [209.85.216.73]) (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 A955742E8D0 for ; Tue, 14 Jul 2026 23:10:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.73 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784070638; cv=none; b=apR23WFjruplQXLdWiOyAQPudswUp4TBcPK8xCKZrSDS9DQ6T4v8aJHqL3TPjBv6sEveP9EuaINxQa8btYy4PfjVVtEANeS+1Tn7lCyMaRQptJwVFtMHOr/ZlPxxmFogYdMLNaKwoKG/PKWJTVuq/nOzQTtitRKrDCDtKoZih4g= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784070638; c=relaxed/simple; bh=A8l3MpZJ66tJyWlzL4z4qnKcCBtdsHxmv+D4XcQUlhk=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=aXTnODEQVy7m3d3Y0KywHDe7QgmMA7NwPsmcIbmfRkjGfhc1Nzu3QN3icTLXZLp42bZhfm9vcuWCAtdS6zANo1fKCKOOC6vLOjLaGumVEEj9KKrosaInKdVs/w297AaHfk5Mbcdw7KfM1qhMUI3oRUybMniBsOCGbp5V807nJFE= 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=V+9+yDdV; arc=none smtp.client-ip=209.85.216.73 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="V+9+yDdV" Received: by mail-pj1-f73.google.com with SMTP id 98e67ed59e1d1-38dbf293831so3372459a91.3 for ; Tue, 14 Jul 2026 16:10:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1784070632; x=1784675432; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:reply-to:from:to:cc:subject:date:message-id :reply-to:content-type; bh=WbV659HPGvdEwoDP0ppeOEtMv4dB4rlQt/SLQHI4470=; b=V+9+yDdVpC8veDwgvAomvMFGVyg+mC8hd5LW/kj8DZsfOcAsVcGNelO148M+gZi1FN b5xB49xg1zg4sRa/1jybSiVDXONR3YO/sXwOSS8N9KkPBuTGM2di5qSa2jzNtpjrI/1w 7mW9tC7O9sdpi6CVZMBKcdtBSY/NyCSrKrw2tkdAusPIfxitJzBvL8Wpfq2itkds8G7r bsy4wR+lKtAgRnGITbbrYysRSHFUPNhd2UAT7V7L118uaN5hmHQHn1IFX+dzqiiiPw10 yRBjFbjB9gimVarqE3VuwxGQ6NeU83/QxOqVo0bA/qZd+TACprx5U/ZiHo+r0hfg4eTJ a9IA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784070632; x=1784675432; h=content-type: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:content-type; bh=WbV659HPGvdEwoDP0ppeOEtMv4dB4rlQt/SLQHI4470=; b=Q1qhAo/BR2Y9XrFOtPTpWADdS5sL+wy7bwzIEGR39heQeZNQ5CYAZpoelIOxlg24LC UyzlIcu7E2v5Rru4mi2hAwPKw7FuCxKml06AxszJs20JNeMRPV+Oi/f9rnn/+7OLhsZj CVBKruhq/A6MKOmhLCITXERacD6rSW5eo4PWzCRTLj43Lr+/MVovFwknLysFRr1mjBe7 P0ZOTwSJ5F3PTNXJmChu20ERV+gRrTDHL/+Y4sOkjLOgPvzkyWU2CQlItit59ioPIvWo C4YJqYjaVz7IPwCdhZSH8RkxpbBwuKyc7ZRDDmMyqrr/gVFw0tgNpq9fA+xcEfj1bDSc gtuA== X-Forwarded-Encrypted: i=1; AHgh+RrRloRxqyt1WXa/0DCjUXux7m9WeKpDab7+c7Yvuo53dou1KVJTrEgYO6MSokduQu+hDR4athY3mLwpK8E=@vger.kernel.org X-Gm-Message-State: AOJu0Yz8ILCJc3or/W9HUHi0MknbeUVFVxAfF2Jiv34prrpFi/0TEyZA GFcA72Ar1r0PZOvPDwYPSfqpr9rVjEQmuUMNpXgWQnxNPPlCV5tZp/RFXHAKU0qbc1I9t/oxy29 JSjoOyA== X-Received: from pgmh3.prod.google.com ([2002:a63:5743:0:b0:c99:cbb4:1dcb]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a21:9187:b0:3bf:a698:ce40 with SMTP id adf61e73a8af0-3c1108c1b22mr16240536637.58.1784070631711; Tue, 14 Jul 2026 16:10:31 -0700 (PDT) Reply-To: Sean Christopherson Date: Tue, 14 Jul 2026 16:10:13 -0700 In-Reply-To: <20260714231015.3337831-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: <20260714231015.3337831-1-seanjc@google.com> X-Mailer: git-send-email 2.55.0.141.g00534a21ce-goog Message-ID: <20260714231015.3337831-6-seanjc@google.com> Subject: [PATCH v5 5/7] KVM: guest_memfd: Explicitly pass number of pages to kvm_arch_gmem_prepare() From: Sean Christopherson To: Sean Christopherson , Paolo Bonzini Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Fuad Tabba , Ackerley Tng Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Tweak the guest_memfd prepare() hook to explicitly pass the number of pages to "prepare", so that the prepare() and invalidate() hooks can be combined into a single convert() hook, and because the existing code is outright broken if a guest_memfd folio is comprised of more than one page (which can't happen, yet). guest_memfd aligns the pfn down, and the SNP code *tries* to create a corresponding huge entry, but if the RMP must use 4KiB entries for whatever reason, KVM will only "prepare" the first pfn, and not the actual pfn that needs to be converted/prepared. Alternatively, @max_order could simply be repurposed as _the_ @order, but that will fall apart when in-place conversion comes along, at which point KVM will need to deal with conversions that aren't strictly bound to a one folio. WARN in the SNP code if the number of pages to prepare is anything other than '1', i.e. if guest_memfd is trying to prepare/convert more than a single 4KiB page, as sev_gmem_prepare() doesn't actually handle conversion greater than order-0 folios. Opportunistically swap the ordering of @pfn and @gfn params for kvm_x86_ops.gmem_prepare() to match that of kvm_arch_gmem_prepare(). Fixes: b85524314a3d ("KVM: guest_memfd: delay kvm_gmem_prepare_folio() unti= l the memory is passed to the guest") Reviewed-by: Ackerley Tng Signed-off-by: Sean Christopherson --- arch/x86/include/asm/kvm_host.h | 3 ++- arch/x86/kvm/svm/sev.c | 6 +++++- arch/x86/kvm/svm/svm.h | 3 ++- arch/x86/kvm/x86.c | 5 +++-- include/linux/kvm_host.h | 3 ++- virt/kvm/guest_memfd.c | 7 ++++--- 6 files changed, 18 insertions(+), 9 deletions(-) diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_hos= t.h index 58f156ae31e7..e7df537d36d5 100644 --- a/arch/x86/include/asm/kvm_host.h +++ b/arch/x86/include/asm/kvm_host.h @@ -1725,7 +1725,8 @@ struct kvm_x86_ops { gva_t (*get_untagged_addr)(struct kvm_vcpu *vcpu, gva_t gva, unsigned int= flags); void *(*alloc_apic_backing_page)(struct kvm_vcpu *vcpu); #ifdef CONFIG_HAVE_KVM_ARCH_GMEM_PREPARE - int (*gmem_prepare)(struct kvm *kvm, kvm_pfn_t pfn, gfn_t gfn, int max_or= der); + int (*gmem_prepare)(struct kvm *kvm, gfn_t gfn, kvm_pfn_t pfn, + kvm_pfn_t nr_pages, int max_order); #endif void (*gmem_invalidate)(kvm_pfn_t start, kvm_pfn_t end); #ifdef CONFIG_HAVE_KVM_ARCH_GMEM_INVALIDATE diff --git a/arch/x86/kvm/svm/sev.c b/arch/x86/kvm/svm/sev.c index 82b983484af2..adc58138fdd0 100644 --- a/arch/x86/kvm/svm/sev.c +++ b/arch/x86/kvm/svm/sev.c @@ -5114,7 +5114,8 @@ static bool is_large_rmp_possible(struct kvm *kvm, kv= m_pfn_t pfn, int order) return false; } =20 -int sev_gmem_prepare(struct kvm *kvm, kvm_pfn_t pfn, gfn_t gfn, int max_or= der) +int sev_gmem_prepare(struct kvm *kvm, gfn_t gfn, kvm_pfn_t pfn, + kvm_pfn_t nr_pages, int max_order) { struct kvm_sev_info *sev =3D to_kvm_sev_info(kvm); kvm_pfn_t pfn_aligned; @@ -5125,6 +5126,9 @@ int sev_gmem_prepare(struct kvm *kvm, kvm_pfn_t pfn, = gfn_t gfn, int max_order) if (!sev_snp_guest(kvm)) return 0; =20 + if (WARN_ON_ONCE(nr_pages !=3D 1)) + return -EIO; + rc =3D snp_lookup_rmpentry(pfn, &assigned, &level); if (rc) { pr_err_ratelimited("SEV: Failed to look up RMP entry: GFN %llx PFN %llx = error %d\n", diff --git a/arch/x86/kvm/svm/svm.h b/arch/x86/kvm/svm/svm.h index af25e4b56212..e35419456648 100644 --- a/arch/x86/kvm/svm/svm.h +++ b/arch/x86/kvm/svm/svm.h @@ -1009,7 +1009,8 @@ int sev_cpu_init(struct svm_cpu_data *sd); int sev_dev_get_attr(u32 group, u64 attr, u64 *val); extern unsigned int max_sev_asid; void sev_handle_rmp_fault(struct kvm_vcpu *vcpu, gpa_t gpa, u64 error_code= ); -int sev_gmem_prepare(struct kvm *kvm, kvm_pfn_t pfn, gfn_t gfn, int max_or= der); +int sev_gmem_prepare(struct kvm *kvm, gfn_t gfn, kvm_pfn_t pfn, + kvm_pfn_t nr_pages, int max_order); void sev_gmem_invalidate(kvm_pfn_t start, kvm_pfn_t end); void sev_gmem_invalidate_range(struct kvm *kvm, struct kvm_gfn_range *rang= e); int sev_gmem_max_mapping_level(struct kvm *kvm, kvm_pfn_t pfn, bool is_pri= vate); diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 08d24c6fffa4..d484d8b509b1 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -10620,9 +10620,10 @@ bool kvm_arch_supports_gmem_init_shared(struct kvm= *kvm) } =20 #ifdef CONFIG_HAVE_KVM_ARCH_GMEM_PREPARE -int kvm_arch_gmem_prepare(struct kvm *kvm, gfn_t gfn, kvm_pfn_t pfn, int m= ax_order) +int kvm_arch_gmem_prepare(struct kvm *kvm, gfn_t gfn, kvm_pfn_t pfn, + kvm_pfn_t nr_pages, int max_order) { - return kvm_x86_call(gmem_prepare)(kvm, pfn, gfn, max_order); + return kvm_x86_call(gmem_prepare)(kvm, gfn, pfn, nr_pages, max_order); } #endif =20 diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index ee87ddd3294f..0a06234a8a8b 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h @@ -2580,7 +2580,8 @@ static inline int kvm_gmem_get_pfn(struct kvm *kvm, #endif /* CONFIG_KVM_GUEST_MEMFD */ =20 #ifdef CONFIG_HAVE_KVM_ARCH_GMEM_PREPARE -int kvm_arch_gmem_prepare(struct kvm *kvm, gfn_t gfn, kvm_pfn_t pfn, int m= ax_order); +int kvm_arch_gmem_prepare(struct kvm *kvm, gfn_t gfn, kvm_pfn_t pfn, + kvm_pfn_t nr_pages, int max_order); #endif =20 #ifdef CONFIG_HAVE_KVM_ARCH_GMEM_POPULATE diff --git a/virt/kvm/guest_memfd.c b/virt/kvm/guest_memfd.c index f9a1d6d64f6c..0f6745f3b919 100644 --- a/virt/kvm/guest_memfd.c +++ b/virt/kvm/guest_memfd.c @@ -70,6 +70,7 @@ static int kvm_gmem_prepare_folio(struct kvm *kvm, struct= kvm_memory_slot *slot, gfn_t gfn, struct folio *folio) { #ifdef CONFIG_HAVE_KVM_ARCH_GMEM_PREPARE + unsigned long nr_pages =3D folio_nr_pages(folio); pgoff_t index; =20 /* @@ -85,12 +86,12 @@ static int kvm_gmem_prepare_folio(struct kvm *kvm, stru= ct kvm_memory_slot *slot, * The order will be passed when creating the guest_memfd, and * checked when creating memslots. */ - WARN_ON_ONCE(!IS_ALIGNED(slot->gmem.pgoff, folio_nr_pages(folio))); - gfn =3D ALIGN_DOWN(gfn, folio_nr_pages(folio)); + WARN_ON_ONCE(!IS_ALIGNED(slot->gmem.pgoff, nr_pages)); + gfn =3D ALIGN_DOWN(gfn, nr_pages); index =3D kvm_gmem_get_index(slot, gfn); =20 return kvm_arch_gmem_prepare(kvm, gfn, folio_file_pfn(folio, index), - folio_order(folio)); + nr_pages, folio_order(folio)); #else return 0; #endif --=20 2.55.0.141.g00534a21ce-goog From nobody Sat Jul 25 18:53:41 2026 Received: from mail-pl1-f201.google.com (mail-pl1-f201.google.com [209.85.214.201]) (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 C29CE364941 for ; Tue, 14 Jul 2026 23:10:33 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784070639; cv=none; b=bFc0T2ibArJ6iz4IYM9GLQESvvovlsFjUs2yyl7RyEtS3rXqmve/UbOR2gFRYfQtIUl2P4K24+keaKVnA5DW843OiVHDu9mQmwlheAlIydWUiD/Sfdg2bI38kALT2dG4V5RqXc33ai3jQinJyhR/4BS9XhRwMUMcdO1MIO4er1o= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784070639; c=relaxed/simple; bh=bVhGd3IOp8vlefiVeBZZ00Lcbxo+PpE+3BfB/TZdw7w=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=QFyVbbaiSkctGBo06Jv4Gz77xauQL9632kp6WN6ZKo73lo/xvdkhqMbV681UOCTvLGKWjuL/7VUKX/aNno0ZdbR1R/pt5LiDuHdw4Ckdwz2+0K6QjoxJh+T5KvzthyoPGbqEid6Ga4IjIW9tKPAalP/JfG0EtiyMuPKugc2Y9u8= 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=kT/zUCvA; arc=none smtp.client-ip=209.85.214.201 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="kT/zUCvA" Received: by mail-pl1-f201.google.com with SMTP id d9443c01a7336-2cec4226c70so53266715ad.1 for ; Tue, 14 Jul 2026 16:10:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1784070633; x=1784675433; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:reply-to:from:to:cc:subject:date:message-id :reply-to:content-type; bh=hTmnUCl/X0Wb9Nf3KvfF5kvI/1LtjOR8yNrn0+TOgsU=; b=kT/zUCvAeryYDra0XrE0YgSlzmRhLvWxuqh9YiAoqoSkODpfNu3/JVJo0K4TVX3KM7 nRSCOStNGyH6s3ngR20LcBBGUVkCAi3O2qlV5VOB0lNKW/28JRCqeqrAgvsYnaaxneKz f8D2Zb4dIdAbwEX1zCCLIsZTjP4GHXVxT7/WgWzht1DYWfWlxH4PkG4wX8al9vPWjk0W fVP2+GUMxaciY6lml6PPa+JnGqb8ppl2c/ecVwUCoSpvgciPQwlov1hjzo9IHsvwGWhU geub8duNj4z6Ob3JikpySg28B53V6bpmcC4vY70qBq3LAhEDHnMlGO+6/M9TR8aNeSDa NFsg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784070633; x=1784675433; h=content-type: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:content-type; bh=hTmnUCl/X0Wb9Nf3KvfF5kvI/1LtjOR8yNrn0+TOgsU=; b=c2GiMzGFwohGnXaRrPLfBYxT1E6iBWTPWQC5XqamOdBNFHTH+dqUdJQLDUQS5GrfxQ 6x7piBQWxEnrKqhDZZzrfu+VwNigSBX63CDLBsP/7TpWMfG7ZpDvkpA+scS+uphDL+4Y 9/q8IvOFrR/H+VXHW+KRJsXMiKqlYJ7EGgRuKVIiafUFFAQacUzrEczQgfHeCjZUpbjy z0cyvsh51to1JygOK3/Y+QXKkZ05szHJSxKaX5cV24EwaY2zgAmmP2QAJIIUmzi3IgD9 KMz978wsH4hejR8LThal0g7pWxuNbGy6CqIDEAWaom92OYg0tu6oltv3MiXmT6a1RHUF RnbA== X-Forwarded-Encrypted: i=1; AHgh+Ro1FiSmqpFesuqzKjPDlFfMpg3UaQUOJaIFqVqz7R4D7mp+B1pPF/18Jnx0q7saOXvDztmaDMCk9b5YxFw=@vger.kernel.org X-Gm-Message-State: AOJu0Yzy5eJpqwetwRPaVX8ldoSqOEfjHOHzTq3eB902ICDDNP3M7G+d D+j2dusmcVGU+wdOy8fIg69ScYB6DlNAVMLyqUOuIP9cEcX/lipUSNuizIkMhEpEsjF9kb3VQFJ ZsYKbUA== X-Received: from plblb6.prod.google.com ([2002:a17:902:fa46:b0:2ca:d7b4:a3b6]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a17:902:d48e:b0:2c6:8d95:fd6d with SMTP id d9443c01a7336-2cef136496amr44193965ad.21.1784070632861; Tue, 14 Jul 2026 16:10:32 -0700 (PDT) Reply-To: Sean Christopherson Date: Tue, 14 Jul 2026 16:10:14 -0700 In-Reply-To: <20260714231015.3337831-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: <20260714231015.3337831-1-seanjc@google.com> X-Mailer: git-send-email 2.55.0.141.g00534a21ce-goog Message-ID: <20260714231015.3337831-7-seanjc@google.com> Subject: [PATCH v5 6/7] KVM: x86: Combine .gmem_prepare()+.gmem_invalidate() into .gmem_convert() From: Sean Christopherson To: Sean Christopherson , Paolo Bonzini Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Fuad Tabba , Ackerley Tng Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Smush x86's prepare() and invalidate() hooks into a common convert() flow, as they are effectively two sides of the same coin for SNP: they're invoked when private/shared memory is about to made accessible/visible to the guest or host. I.e. prepare() is really "make private", and invalidate() is really "make shared". Using a single hook will yield more intuitive code when in-place conversion comes along. For all intents and purposes, no functional change intended. Signed-off-by: Sean Christopherson Reviewed-by: Ackerley Tng Reviewed-by: Fuad Tabba --- arch/x86/include/asm/kvm-x86-ops.h | 5 ++--- arch/x86/include/asm/kvm_host.h | 7 +++---- arch/x86/kvm/svm/sev.c | 21 ++++++++++++++++++--- arch/x86/kvm/svm/svm.c | 3 +-- arch/x86/kvm/svm/svm.h | 5 ++--- arch/x86/kvm/x86.c | 4 ++-- 6 files changed, 28 insertions(+), 17 deletions(-) diff --git a/arch/x86/include/asm/kvm-x86-ops.h b/arch/x86/include/asm/kvm-= x86-ops.h index 736129db272a..76ce691de2f8 100644 --- a/arch/x86/include/asm/kvm-x86-ops.h +++ b/arch/x86/include/asm/kvm-x86-ops.h @@ -146,10 +146,9 @@ KVM_X86_OP(vcpu_deliver_sipi_vector) KVM_X86_OP_OPTIONAL_RET0(vcpu_get_apicv_inhibit_reasons); KVM_X86_OP_OPTIONAL(get_untagged_addr) KVM_X86_OP_OPTIONAL(alloc_apic_backing_page) -#ifdef CONFIG_HAVE_KVM_ARCH_GMEM_PREPARE -KVM_X86_OP_OPTIONAL_RET0(gmem_prepare) +#if defined(CONFIG_HAVE_KVM_ARCH_GMEM_PREPARE) || defined(CONFIG_HAVE_KVM_= ARCH_GMEM_RECLAIM) +KVM_X86_OP_OPTIONAL_RET0(gmem_convert) #endif -KVM_X86_OP_OPTIONAL(gmem_invalidate) #ifdef CONFIG_HAVE_KVM_ARCH_GMEM_INVALIDATE KVM_X86_OP_OPTIONAL(gmem_invalidate_range) #endif diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_hos= t.h index e7df537d36d5..f60fec14c61a 100644 --- a/arch/x86/include/asm/kvm_host.h +++ b/arch/x86/include/asm/kvm_host.h @@ -1724,11 +1724,10 @@ struct kvm_x86_ops { =20 gva_t (*get_untagged_addr)(struct kvm_vcpu *vcpu, gva_t gva, unsigned int= flags); void *(*alloc_apic_backing_page)(struct kvm_vcpu *vcpu); -#ifdef CONFIG_HAVE_KVM_ARCH_GMEM_PREPARE - int (*gmem_prepare)(struct kvm *kvm, gfn_t gfn, kvm_pfn_t pfn, - kvm_pfn_t nr_pages, int max_order); +#if defined(CONFIG_HAVE_KVM_ARCH_GMEM_PREPARE) || defined(CONFIG_HAVE_KVM_= ARCH_GMEM_RECLAIM) + int (*gmem_convert)(struct kvm *kvm, gfn_t gfn, kvm_pfn_t pfn, + kvm_pfn_t nr_pages, int max_order, bool to_private); #endif - void (*gmem_invalidate)(kvm_pfn_t start, kvm_pfn_t end); #ifdef CONFIG_HAVE_KVM_ARCH_GMEM_INVALIDATE void (*gmem_invalidate_range)(struct kvm *kvm, struct kvm_gfn_range *rang= e); #endif diff --git a/arch/x86/kvm/svm/sev.c b/arch/x86/kvm/svm/sev.c index adc58138fdd0..b00623b2f26a 100644 --- a/arch/x86/kvm/svm/sev.c +++ b/arch/x86/kvm/svm/sev.c @@ -5114,8 +5114,8 @@ static bool is_large_rmp_possible(struct kvm *kvm, kv= m_pfn_t pfn, int order) return false; } =20 -int sev_gmem_prepare(struct kvm *kvm, gfn_t gfn, kvm_pfn_t pfn, - kvm_pfn_t nr_pages, int max_order) +static int sev_gmem_make_private(struct kvm *kvm, gfn_t gfn, kvm_pfn_t pfn, + kvm_pfn_t nr_pages, int max_order) { struct kvm_sev_info *sev =3D to_kvm_sev_info(kvm); kvm_pfn_t pfn_aligned; @@ -5165,8 +5165,9 @@ int sev_gmem_prepare(struct kvm *kvm, gfn_t gfn, kvm_= pfn_t pfn, return 0; } =20 -void sev_gmem_invalidate(kvm_pfn_t start, kvm_pfn_t end) +static void sev_gmem_make_shared(kvm_pfn_t start, kvm_pfn_t nr_pages) { + kvm_pfn_t end =3D start + nr_pages; kvm_pfn_t pfn; =20 if (!cc_platform_has(CC_ATTR_HOST_SEV_SNP)) @@ -5228,6 +5229,20 @@ void sev_gmem_invalidate(kvm_pfn_t start, kvm_pfn_t = end) } } =20 +int sev_gmem_convert(struct kvm *kvm, gfn_t gfn, kvm_pfn_t pfn, + kvm_pfn_t nr_pages, int order, bool to_private) +{ + if (to_private) { + if (WARN_ON_ONCE(!kvm || gfn >> (kvm_host.maxphyaddr - PAGE_SHIFT))) + return -EIO; + + return sev_gmem_make_private(kvm, gfn, pfn, nr_pages, order); + } + + sev_gmem_make_shared(pfn, nr_pages); + return 0; +} + void sev_gmem_invalidate_range(struct kvm *kvm, struct kvm_gfn_range *rang= e) { struct kvm_vcpu *vcpu; diff --git a/arch/x86/kvm/svm/svm.c b/arch/x86/kvm/svm/svm.c index 91286d46d13a..8c5018c65dc5 100644 --- a/arch/x86/kvm/svm/svm.c +++ b/arch/x86/kvm/svm/svm.c @@ -5438,8 +5438,7 @@ struct kvm_x86_ops svm_x86_ops __initdata =3D { .vm_copy_enc_context_from =3D sev_vm_copy_enc_context_from, .vm_move_enc_context_from =3D sev_vm_move_enc_context_from, =20 - .gmem_prepare =3D sev_gmem_prepare, - .gmem_invalidate =3D sev_gmem_invalidate, + .gmem_convert =3D sev_gmem_convert, .gmem_invalidate_range =3D sev_gmem_invalidate_range, .gmem_max_mapping_level =3D sev_gmem_max_mapping_level, #endif diff --git a/arch/x86/kvm/svm/svm.h b/arch/x86/kvm/svm/svm.h index e35419456648..57f692b5d709 100644 --- a/arch/x86/kvm/svm/svm.h +++ b/arch/x86/kvm/svm/svm.h @@ -1009,9 +1009,8 @@ int sev_cpu_init(struct svm_cpu_data *sd); int sev_dev_get_attr(u32 group, u64 attr, u64 *val); extern unsigned int max_sev_asid; void sev_handle_rmp_fault(struct kvm_vcpu *vcpu, gpa_t gpa, u64 error_code= ); -int sev_gmem_prepare(struct kvm *kvm, gfn_t gfn, kvm_pfn_t pfn, - kvm_pfn_t nr_pages, int max_order); -void sev_gmem_invalidate(kvm_pfn_t start, kvm_pfn_t end); +int sev_gmem_convert(struct kvm *kvm, gfn_t gfn, kvm_pfn_t pfn, + kvm_pfn_t nr_pages, int max_order, bool to_private); void sev_gmem_invalidate_range(struct kvm *kvm, struct kvm_gfn_range *rang= e); int sev_gmem_max_mapping_level(struct kvm *kvm, kvm_pfn_t pfn, bool is_pri= vate); struct vmcb_save_area *sev_decrypt_vmsa(struct kvm_vcpu *vcpu); diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index d484d8b509b1..e509d50c247c 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -10623,14 +10623,14 @@ bool kvm_arch_supports_gmem_init_shared(struct kv= m *kvm) int kvm_arch_gmem_prepare(struct kvm *kvm, gfn_t gfn, kvm_pfn_t pfn, kvm_pfn_t nr_pages, int max_order) { - return kvm_x86_call(gmem_prepare)(kvm, gfn, pfn, nr_pages, max_order); + return kvm_x86_call(gmem_convert)(kvm, gfn, pfn, nr_pages, max_order, tru= e); } #endif =20 #ifdef CONFIG_HAVE_KVM_ARCH_GMEM_RECLAIM void kvm_arch_gmem_reclaim(kvm_pfn_t pfn, kvm_pfn_t nr_pages, int max_orde= r) { - kvm_x86_call(gmem_invalidate)(pfn, pfn + nr_pages); + WARN_ON_ONCE(kvm_x86_call(gmem_convert)(NULL, -1ull, pfn, nr_pages, max_o= rder, false)); } #endif =20 --=20 2.55.0.141.g00534a21ce-goog From nobody Sat Jul 25 18:53:41 2026 Received: from mail-pl1-f202.google.com (mail-pl1-f202.google.com [209.85.214.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 D50E642BE94 for ; Tue, 14 Jul 2026 23:10:34 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784070640; cv=none; b=cFYxeZhpZmMn9nAxJ7aPceh0KTekM0Sp4As0o8GyIE9wyh56nRuAKtwHo6ybtwUZNDt2J/Ei57YtWUtfrMymFHTcMviJP4gvucMQcG4f/l1wOpbrwuZHW0XGDlnfQFuNokSuTl8937Lsw3GWNBzHU2yBqgnjt1UVHCwoRbKXfmM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784070640; c=relaxed/simple; bh=5BavKoMCQbuceEXAWAGaZ0PeXfjVBMYWYfqEIVIko9I=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=ubxtTlzF8pQadz4CzeaD8yU52BS/DmFBOIqnveLy8YoUXLupMxe+OdvPRgvRHIB8c5oRS3QHY91FOjTOyu9/4hTODq2NNJm2blVy/loNTRBpHJ6WmDYvLFZCdsvpYPvk78VR4IkK/85F7JR6+1/YMtkb6TCaohGZsloiOQ3pNDI= 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=L9JKDnVQ; arc=none smtp.client-ip=209.85.214.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="L9JKDnVQ" Received: by mail-pl1-f202.google.com with SMTP id d9443c01a7336-2ce7dff6253so689655ad.1 for ; Tue, 14 Jul 2026 16:10:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1784070634; x=1784675434; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:reply-to:from:to:cc:subject:date:message-id :reply-to:content-type; bh=oeBsN3Sd3KvkDRZPV9BJqhIhlZVgRgMQPPG+mndlRJY=; b=L9JKDnVQm94p4wkHGvr/0E45fVHrq599FxrdUdcxJUx+GWnSgOJWspEBu3kipQ0Vt9 w+wHtFR8tiyjDpPbzGt33SlYXfOhLArgw+w/N9d1/HnlM89YmQCY+nHB7Q4Ky4XL/O4p uRJ6kteidlpPjAnVEB7EGxIt0xhuBZbMncEqWcjGuJQYHguJyLaccWpl4fpRFImEssn3 gOml2GzPBCKYCDGCsSBQ3Mi9EvhUJ1Lz9xE0tkKDtQmmMhnrAeoSMWs+x6bLixtCxKkA jxFkxoXHsTHW3ABTQaPmmdGNXn7EiKfdDZKVd4FnzYK16WKGrxOtI+OHndWZRHGA6qtn oqNw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784070634; x=1784675434; h=content-type: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:content-type; bh=oeBsN3Sd3KvkDRZPV9BJqhIhlZVgRgMQPPG+mndlRJY=; b=El3+GcM0DNpnzEvIDBNVwR21Qq2sVC1R/uYLxc9eHGeRBLPFLOz2g48uhy/+fDFXTc wOr2XDMftZSMOWmVYcrcVkqfJ9BXTR0RcJMf5+d6AqrtpFbHK4Dltp35PP4Ou5E9IF50 up1lxuLWiECmGknVndQstx66cAWkvMoEVSTBoSbQ7hrx2knChcOKvnkt50hO9DZvE9UD Dz4lMdwSuj12Er/R+kz1BzxHBZdX+IZCWCjXr6vKnJ+5tT4rrFI6L6WR46bngAN99fkz 9EAu65aqwsKlB9ZabtWmo75ig4aWASTLLBHOi2awQ9lMRG7hwfD28H87REvptYniGVbi b0aQ== X-Forwarded-Encrypted: i=1; AHgh+RqhIAcTJ1k57e/XPPrP9Io59g+LW7FUlS4ozdfG1ogOpErzf0FhNi5P7OkXoSpY0ARiY56F/YmRTqx/SGg=@vger.kernel.org X-Gm-Message-State: AOJu0YzScI3nSR7AbER3C5Y6sDL72jB0rMJ3WrliZtOtKVDkmqiQR+41 da5T/x8vamEtfunoH049gNsY6pmMmgaajdFERVhu7Mp/oGQb4GBcSHhLIjNZdlFSwj2F8onRH/N aFBgpsQ== X-Received: from pjtl4.prod.google.com ([2002:a17:90a:c584:b0:37d:8595:7a08]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:4a43:b0:385:3ab:fecb with SMTP id 98e67ed59e1d1-38dc8070474mr12486550a91.4.1784070633929; Tue, 14 Jul 2026 16:10:33 -0700 (PDT) Reply-To: Sean Christopherson Date: Tue, 14 Jul 2026 16:10:15 -0700 In-Reply-To: <20260714231015.3337831-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: <20260714231015.3337831-1-seanjc@google.com> X-Mailer: git-send-email 2.55.0.141.g00534a21ce-goog Message-ID: <20260714231015.3337831-8-seanjc@google.com> Subject: [PATCH v5 7/7] KVM: guest_memfd: Rework PREPARE config and hook into a more generic CONVERT From: Sean Christopherson To: Sean Christopherson , Paolo Bonzini Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Fuad Tabba , Ackerley Tng Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Rework guest_memfd's "prepare" hook into a more generic "convert" flow in anticipation of supporting in-place conversion, at which point KVM will use the hook for both to-private and to-shared conversions, not just to "prepare" PRIVATE memory. Opportunistically rename kvm_gmem_prepare_folio() to kvm_gmem_make_private() to better reflect its role. No functional change intended. Signed-off-by: Sean Christopherson Reviewed-by: Ackerley Tng Reviewed-by: Fuad Tabba --- arch/x86/include/asm/kvm-x86-ops.h | 2 +- arch/x86/include/asm/kvm_host.h | 2 +- arch/x86/kvm/Kconfig | 2 +- arch/x86/kvm/x86.c | 8 ++++---- include/linux/kvm_host.h | 6 +++--- virt/kvm/Kconfig | 2 +- virt/kvm/guest_memfd.c | 12 ++++++------ 7 files changed, 17 insertions(+), 17 deletions(-) diff --git a/arch/x86/include/asm/kvm-x86-ops.h b/arch/x86/include/asm/kvm-= x86-ops.h index 76ce691de2f8..1764bad03b17 100644 --- a/arch/x86/include/asm/kvm-x86-ops.h +++ b/arch/x86/include/asm/kvm-x86-ops.h @@ -146,7 +146,7 @@ KVM_X86_OP(vcpu_deliver_sipi_vector) KVM_X86_OP_OPTIONAL_RET0(vcpu_get_apicv_inhibit_reasons); KVM_X86_OP_OPTIONAL(get_untagged_addr) KVM_X86_OP_OPTIONAL(alloc_apic_backing_page) -#if defined(CONFIG_HAVE_KVM_ARCH_GMEM_PREPARE) || defined(CONFIG_HAVE_KVM_= ARCH_GMEM_RECLAIM) +#if defined(CONFIG_HAVE_KVM_ARCH_GMEM_CONVERT) || defined(CONFIG_HAVE_KVM_= ARCH_GMEM_RECLAIM) KVM_X86_OP_OPTIONAL_RET0(gmem_convert) #endif #ifdef CONFIG_HAVE_KVM_ARCH_GMEM_INVALIDATE diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_hos= t.h index f60fec14c61a..08c4af487fa1 100644 --- a/arch/x86/include/asm/kvm_host.h +++ b/arch/x86/include/asm/kvm_host.h @@ -1724,7 +1724,7 @@ struct kvm_x86_ops { =20 gva_t (*get_untagged_addr)(struct kvm_vcpu *vcpu, gva_t gva, unsigned int= flags); void *(*alloc_apic_backing_page)(struct kvm_vcpu *vcpu); -#if defined(CONFIG_HAVE_KVM_ARCH_GMEM_PREPARE) || defined(CONFIG_HAVE_KVM_= ARCH_GMEM_RECLAIM) +#if defined(CONFIG_HAVE_KVM_ARCH_GMEM_CONVERT) || defined(CONFIG_HAVE_KVM_= ARCH_GMEM_RECLAIM) int (*gmem_convert)(struct kvm *kvm, gfn_t gfn, kvm_pfn_t pfn, kvm_pfn_t nr_pages, int max_order, bool to_private); #endif diff --git a/arch/x86/kvm/Kconfig b/arch/x86/kvm/Kconfig index e0e7ad015839..538ed1e80332 100644 --- a/arch/x86/kvm/Kconfig +++ b/arch/x86/kvm/Kconfig @@ -160,7 +160,7 @@ config KVM_AMD_SEV depends on CRYPTO_DEV_SP_PSP && !(KVM_AMD=3Dy && CRYPTO_DEV_CCP_DD=3Dm) select ARCH_HAS_CC_PLATFORM select KVM_GENERIC_MEMORY_ATTRIBUTES - select HAVE_KVM_ARCH_GMEM_PREPARE + select HAVE_KVM_ARCH_GMEM_CONVERT select HAVE_KVM_ARCH_GMEM_RECLAIM select HAVE_KVM_ARCH_GMEM_INVALIDATE select HAVE_KVM_ARCH_GMEM_POPULATE diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index e509d50c247c..11017f49b94a 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -10619,11 +10619,11 @@ bool kvm_arch_supports_gmem_init_shared(struct kv= m *kvm) return !kvm_arch_has_private_mem(kvm); } =20 -#ifdef CONFIG_HAVE_KVM_ARCH_GMEM_PREPARE -int kvm_arch_gmem_prepare(struct kvm *kvm, gfn_t gfn, kvm_pfn_t pfn, - kvm_pfn_t nr_pages, int max_order) +#ifdef CONFIG_HAVE_KVM_ARCH_GMEM_CONVERT +int kvm_arch_gmem_convert(struct kvm *kvm, gfn_t gfn, kvm_pfn_t pfn, + kvm_pfn_t nr_pages, int max_order, bool to_private) { - return kvm_x86_call(gmem_convert)(kvm, gfn, pfn, nr_pages, max_order, tru= e); + return kvm_x86_call(gmem_convert)(kvm, gfn, pfn, nr_pages, max_order, to_= private); } #endif =20 diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index 0a06234a8a8b..fdbd697d0337 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h @@ -2579,9 +2579,9 @@ static inline int kvm_gmem_get_pfn(struct kvm *kvm, } #endif /* CONFIG_KVM_GUEST_MEMFD */ =20 -#ifdef CONFIG_HAVE_KVM_ARCH_GMEM_PREPARE -int kvm_arch_gmem_prepare(struct kvm *kvm, gfn_t gfn, kvm_pfn_t pfn, - kvm_pfn_t nr_pages, int max_order); +#ifdef CONFIG_HAVE_KVM_ARCH_GMEM_CONVERT +int kvm_arch_gmem_convert(struct kvm *kvm, gfn_t gfn, kvm_pfn_t pfn, + kvm_pfn_t nr_pages, int max_order, bool to_private); #endif =20 #ifdef CONFIG_HAVE_KVM_ARCH_GMEM_POPULATE diff --git a/virt/kvm/Kconfig b/virt/kvm/Kconfig index 617876993225..c3c0ee253fc7 100644 --- a/virt/kvm/Kconfig +++ b/virt/kvm/Kconfig @@ -107,7 +107,7 @@ config KVM_GUEST_MEMFD select XARRAY_MULTI bool =20 -config HAVE_KVM_ARCH_GMEM_PREPARE +config HAVE_KVM_ARCH_GMEM_CONVERT bool depends on KVM_GUEST_MEMFD =20 diff --git a/virt/kvm/guest_memfd.c b/virt/kvm/guest_memfd.c index 0f6745f3b919..173a7ed008d1 100644 --- a/virt/kvm/guest_memfd.c +++ b/virt/kvm/guest_memfd.c @@ -66,10 +66,10 @@ static pgoff_t kvm_gmem_get_index(struct kvm_memory_slo= t *slot, gfn_t gfn) * On successful return the guest sees a zero page so as to avoid * leaking host data and the up-to-date flag is set. */ -static int kvm_gmem_prepare_folio(struct kvm *kvm, struct kvm_memory_slot = *slot, - gfn_t gfn, struct folio *folio) +static int kvm_gmem_make_private(struct kvm *kvm, struct kvm_memory_slot *= slot, + gfn_t gfn, struct folio *folio) { -#ifdef CONFIG_HAVE_KVM_ARCH_GMEM_PREPARE +#ifdef CONFIG_HAVE_KVM_ARCH_GMEM_CONVERT unsigned long nr_pages =3D folio_nr_pages(folio); pgoff_t index; =20 @@ -90,8 +90,8 @@ static int kvm_gmem_prepare_folio(struct kvm *kvm, struct= kvm_memory_slot *slot, gfn =3D ALIGN_DOWN(gfn, nr_pages); index =3D kvm_gmem_get_index(slot, gfn); =20 - return kvm_arch_gmem_prepare(kvm, gfn, folio_file_pfn(folio, index), - nr_pages, folio_order(folio)); + return kvm_arch_gmem_convert(kvm, gfn, folio_file_pfn(folio, index), + nr_pages, folio_order(folio), true); #else return 0; #endif @@ -798,7 +798,7 @@ int kvm_gmem_get_pfn(struct kvm *kvm, struct kvm_memory= _slot *slot, folio_mark_uptodate(folio); } =20 - r =3D kvm_gmem_prepare_folio(kvm, slot, gfn, folio); + r =3D kvm_gmem_make_private(kvm, slot, gfn, folio); =20 folio_unlock(folio); =20 --=20 2.55.0.141.g00534a21ce-goog