From patchwork Tue Mar 18 16:18:16 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Fuad Tabba X-Patchwork-Id: 14021235 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 7AD76C282EC for ; Tue, 18 Mar 2025 16:18:33 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 419C2280006; Tue, 18 Mar 2025 12:18:31 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 337DC280001; Tue, 18 Mar 2025 12:18:31 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 17C51280006; Tue, 18 Mar 2025 12:18:31 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0010.hostedemail.com [216.40.44.10]) by kanga.kvack.org (Postfix) with ESMTP id E6AA0280001 for ; Tue, 18 Mar 2025 12:18:30 -0400 (EDT) Received: from smtpin28.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay05.hostedemail.com (Postfix) with ESMTP id 1980958785 for ; Tue, 18 Mar 2025 16:18:32 +0000 (UTC) X-FDA: 83235179664.28.781D0F8 Received: from mail-wr1-f74.google.com (mail-wr1-f74.google.com [209.85.221.74]) by imf28.hostedemail.com (Postfix) with ESMTP id 38747C0022 for ; Tue, 18 Mar 2025 16:18:29 +0000 (UTC) Authentication-Results: imf28.hostedemail.com; dkim=pass header.d=google.com header.s=20230601 header.b=aqMu4tyZ; dmarc=pass (policy=reject) header.from=google.com; spf=pass (imf28.hostedemail.com: domain of 31JzZZwUKCLksZaaZfnnfkd.bnlkhmtw-lljuZbj.nqf@flex--tabba.bounces.google.com designates 209.85.221.74 as permitted sender) smtp.mailfrom=31JzZZwUKCLksZaaZfnnfkd.bnlkhmtw-lljuZbj.nqf@flex--tabba.bounces.google.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1742314710; a=rsa-sha256; cv=none; b=1yZh3XGQ+ulTaUoDR26FHV10GSC91Xa+62jHMRzZmGxqEW5wdsRVqSRpEqvM2yqnoWIaqN z3Tq8kEgaxvs65Yva5Z/V015HYXffY0K0lYkcwKhv67Gqia4Z/1xr0w0qad8GjjzT7tqcT Oe1TNcVQJhcA1Vkq+u1OwJ9J2wytBfo= ARC-Authentication-Results: i=1; imf28.hostedemail.com; dkim=pass header.d=google.com header.s=20230601 header.b=aqMu4tyZ; dmarc=pass (policy=reject) header.from=google.com; spf=pass (imf28.hostedemail.com: domain of 31JzZZwUKCLksZaaZfnnfkd.bnlkhmtw-lljuZbj.nqf@flex--tabba.bounces.google.com designates 209.85.221.74 as permitted sender) smtp.mailfrom=31JzZZwUKCLksZaaZfnnfkd.bnlkhmtw-lljuZbj.nqf@flex--tabba.bounces.google.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1742314710; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=f04fIvPqKRtI5t7f5B+Wihfsf/K5ZsIQslP/ug4gI5c=; b=6LD93CuKwWXPyhaX/Hy4oo48G+qccT1ZZDasY8PWgjRzt3+8i/3G0AOLNnSuPWnnct9fVf DOSP9axYAZVYKrPaVleCbM79qa2zFHCrNiwYcmbL4LiTikVi8547NL3WTLXZximb5aWIkU hs4QStJkizw7T0XuRNcybMIMXoYza0o= Received: by mail-wr1-f74.google.com with SMTP id ffacd0b85a97d-39134c762ebso2555813f8f.0 for ; Tue, 18 Mar 2025 09:18:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1742314709; x=1742919509; darn=kvack.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=f04fIvPqKRtI5t7f5B+Wihfsf/K5ZsIQslP/ug4gI5c=; b=aqMu4tyZaaHGlVcJV7NLKHM9wibHfA4l+nd8Fw5UZhGGJHGKWLfNqVKKVZYIiP8wiJ z6XkeoOrknXV0M1+kqm9pz/cDS2mjydl5/dVapvobXKgX92U8/lyzb/iv1Ts2D1KlTBM NcBLbnS2yGz3lSNBfSxGF2OzXBQNToAe+Z4jxeu++VJ7iXJngMOO//vcmZqOoVklDduu Io7T0o/dfXvo7yRLDoLtTS9j5PYJAOsrRisB9s82ZDRisTSUj4jMj6mTP9pdQ0FGvaov PQZi70TaeoNiJyok8Y3bhyWBkCyO7bkSEu73ZM5UabUkJTtvT0iQ5Lm/qqNz1RgYl1vx Syiw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1742314709; x=1742919509; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=f04fIvPqKRtI5t7f5B+Wihfsf/K5ZsIQslP/ug4gI5c=; b=Gh/u1i6qkW/QsuWYh7LtkqipBuHAClQe0rCra+3a07298TY8atQgl5Mj2Kd7mrMzXb /5D7expak3h8bVIOuH9uEU8MlIU+hNFzwKwwERfFTh1hwc/2y1pBHwHvANqZZD/MIYQR 0m0WWaR6eKWUXTgn7k/spXn55rsrQKW72nmc6mzBtX2+b4+ag9zb8pjZL0nl91oXDMYu /mcIphDkrl2CxlIcb+udgLQ6XNOdzikfpggdwBNglx5VI5406d9qNSu0OReJHir1YLjl ZyhOgKsc/Zl+ix0PBEOXiOdvMIBW7FR5+ci/xKeQhhazl1UZCHeEbpp5aLMIXTmoxBKI WiXQ== X-Forwarded-Encrypted: i=1; AJvYcCU039udujK1DqDMS3GAH2AuYXqOPDSJZlM+HajXOI9ctqmTb3W4vYMjenyeHBRdY83IU9z/CiYetA==@kvack.org X-Gm-Message-State: AOJu0Yz7hPqzp57s3dQXWSKOkpG4yVI1bIwLo7NiyRS+NU14I9IP6DOP VPmqlDzbXgC3BKqByn7qEkfgBybV9u6XNugT4MoR3iwyLIhMV4KKx/p/3RmTiFEJX+2So5yJQw= = X-Google-Smtp-Source: AGHT+IHKjyvE9aXNEsQehi7vFGlwHXvPcmdq406eUxRhHnas0MMzqCwbpt157B52I+uti71hU+p9WZ7i0w== X-Received: from wmgg6.prod.google.com ([2002:a05:600d:6:b0:43c:fc61:959c]) (user=tabba job=prod-delivery.src-stubby-dispatcher) by 2002:a5d:6d81:0:b0:397:8ef9:9952 with SMTP id ffacd0b85a97d-3996b499a00mr4539610f8f.38.1742314708814; Tue, 18 Mar 2025 09:18:28 -0700 (PDT) Date: Tue, 18 Mar 2025 16:18:16 +0000 In-Reply-To: <20250318161823.4005529-1-tabba@google.com> Mime-Version: 1.0 References: <20250318161823.4005529-1-tabba@google.com> X-Mailer: git-send-email 2.49.0.rc1.451.g8f38331e32-goog Message-ID: <20250318161823.4005529-3-tabba@google.com> Subject: [PATCH v7 2/9] KVM: guest_memfd: Handle final folio_put() of guest_memfd pages From: Fuad Tabba To: kvm@vger.kernel.org, linux-arm-msm@vger.kernel.org, linux-mm@kvack.org Cc: pbonzini@redhat.com, chenhuacai@kernel.org, mpe@ellerman.id.au, anup@brainfault.org, paul.walmsley@sifive.com, palmer@dabbelt.com, aou@eecs.berkeley.edu, seanjc@google.com, viro@zeniv.linux.org.uk, brauner@kernel.org, willy@infradead.org, akpm@linux-foundation.org, xiaoyao.li@intel.com, yilun.xu@intel.com, chao.p.peng@linux.intel.com, jarkko@kernel.org, amoorthy@google.com, dmatlack@google.com, isaku.yamahata@intel.com, mic@digikod.net, vbabka@suse.cz, vannapurve@google.com, ackerleytng@google.com, mail@maciej.szmigiero.name, david@redhat.com, michael.roth@amd.com, wei.w.wang@intel.com, liam.merwick@oracle.com, isaku.yamahata@gmail.com, kirill.shutemov@linux.intel.com, suzuki.poulose@arm.com, steven.price@arm.com, quic_eberman@quicinc.com, quic_mnalajal@quicinc.com, quic_tsoni@quicinc.com, quic_svaddagi@quicinc.com, quic_cvanscha@quicinc.com, quic_pderrin@quicinc.com, quic_pheragu@quicinc.com, catalin.marinas@arm.com, james.morse@arm.com, yuzenghui@huawei.com, oliver.upton@linux.dev, maz@kernel.org, will@kernel.org, qperret@google.com, keirf@google.com, roypat@amazon.co.uk, shuah@kernel.org, hch@infradead.org, jgg@nvidia.com, rientjes@google.com, jhubbard@nvidia.com, fvdl@google.com, hughd@google.com, jthoughton@google.com, peterx@redhat.com, tabba@google.com X-Rspam-User: X-Rspamd-Queue-Id: 38747C0022 X-Stat-Signature: fqim5u3jd1egi9wygwp99xo39z4n4jmh X-Rspamd-Server: rspam06 X-HE-Tag: 1742314709-399961 X-HE-Meta: U2FsdGVkX18y+tJVufYLGawsnJEPkA107Qggo7/db6iqau/M//5moq0e7J29IWjDcv387vM2CJPsS4nL8b8JRheavHzE409OMuzeMLA+5gjOKciy7AqhZuUvVvTHk1B09lgyUpImSXNZk6xuOmCebfFbY44RgY1as3BSa/1HAwt53wJMJEgkyDVEuVpirGamKV9oM6QxDdQfUiPi82MpyNedhbHimvdHPHncEr9ObjwGKswGZ1l2ZSNzXDSssngsNBmUvLe1HveZEmzpyTc7XB8ZBL6xhN8h/4EDpVcE1yOV/f1hDRdZAc+R9oROm7UiV4gAoCkSOY6ZElvuv8t4x20rH50dzngt8yRC5QDqm1H9Cz0cdcYfLl7fIuwFl+YT3bCe7GMf7MnhHbWvUKNwJrp6qLrNbyhV8rrP1gJW8StKytfMvNk8mWpqdkCrGBplhHM7TC/r+k1EaB5uXlEx+nsXY0Cg4zbE2IvOvL/GwA+ekopUSfFwRL7qU3KgUQ0GDG0eTTUqR8YyFdnTezAdIqlwxpqGcRUietvRjiaPVcyIwPjBk/GVPerEJlhIsQ2M7jqjnio0AJXdpFuMIxNOxJ9uedkGGWXKjSr+rRSKh+vFjSxj5OclPOjdPgaJZ4D9JwujY5BMaF0n5pV+WnScUXjUMzvwhYRvLPhqWz9B6BEkDFEVYDCR2NuqLn1yFcsa6UvTwoqQ7iBwKvUgLm4+riiC5pAgXCwnt/bo15eyOF+RWzE/RJuOpL5l0T3jEw/9rLRT/3Lc1IiL8Hs6aiDZpLN1JAQR+qWhYDn6QlvUN6CgdmYKgV/IRrNRLKypoqZgAq38Ng9UO0mNfrizFiH0ilmEuWJJFxVTmKahuB4p7/shDEKdXW84J/E1RMF/Xx+2gcTgowvXk37zYUvhogEL24PJ2ngG8iS6gix9PUYVwQpVvTFAMSCdS8TR9+OeYbCk+dKFoRuB/UWTj+hLjHX F1QFuppV FBNt9O4kWUxNIK6S+hVdrVbk39tvIAh43rBaOuB+2Mym6Qst7ffdDQej3xaLkm5nEwg432EYgmP1Ig5BtAxjkFQnfTN6DDR95av6z27p+q2jJ2OdN/2wq5XBukByQfrqG/QG1hFkHM1zR7AXxLjOosKctJB3xxWie5+wSZwXy+je8h4YIVmt+3j9w16TK+J9zvHCMF3MCpjStuFB0xQVX86HeV10DYwZ6KEpmvw8JzTPLx6mzeBJb1cdHItwVd6KId2sTTyfwpXoNR+VwiKLXBhA4P3gtUA2uMabUFYIh8I5oaLfC86yWmfFnZOdCxVaWolFotyxnMxqZRtH/0Dbgzasq9kWLJ3+Yy/pqUGH2il3sQIpocNpovHMaq9uKrHnxUXfs+tdWu3hUX45B+prr4wwNZM03ig6ov5q4yuszg/uRKCkRBFzycGiLNPHxMA7dFG9Qb9dCBB1/fYFDgK6sIdIWwA9hsZOK/sz7PYbiIW7PnYggfB9VCGzxXGVob2Jzjtfrdk40CJNdHDoF8ht80GwVNrHX/GVyhPvw3ty8UQq8YNZS1PEIDpNSj/cnreWkoQrIVutEBhigFXa/570itqO1H3eJ4qHVzj6xRirCC0XOv5UflnVHL1LZBbEkwtkGtRS7G8v+aNb2ahdV3uxtTztwCtB0TIEEpcYL4tKIaptINGo= X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: Before transitioning a guest_memfd folio to unshared, thereby disallowing access by the host and allowing the hypervisor to transition its view of the guest page as private, we need to be sure that the host doesn't have any references to the folio. This patch introduces a new type for guest_memfd folios, which isn't activated in this series but is here as a placeholder and to facilitate the code in the subsequent patch series. This will be used in the future to register a callback that informs the guest_memfd subsystem when the last reference is dropped, therefore knowing that the host doesn't have any remaining references. This patch also introduces the configuration option, KVM_GMEM_SHARED_MEM, which toggles support for mapping guest_memfd shared memory at the host. Signed-off-by: Fuad Tabba Acked-by: Vlastimil Babka Acked-by: David Hildenbrand --- include/linux/kvm_host.h | 4 ++++ include/linux/page-flags.h | 16 ++++++++++++++++ mm/debug.c | 1 + mm/swap.c | 29 +++++++++++++++++++++++++++++ virt/kvm/Kconfig | 4 ++++ virt/kvm/guest_memfd.c | 8 ++++++++ 6 files changed, 62 insertions(+) diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index f34f4cfaa513..3ad0719bfc4f 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h @@ -2571,4 +2571,8 @@ long kvm_arch_vcpu_pre_fault_memory(struct kvm_vcpu *vcpu, struct kvm_pre_fault_memory *range); #endif +#ifdef CONFIG_KVM_GMEM_SHARED_MEM +void kvm_gmem_handle_folio_put(struct folio *folio); +#endif + #endif diff --git a/include/linux/page-flags.h b/include/linux/page-flags.h index 6dc2494bd002..daeee9a38e4c 100644 --- a/include/linux/page-flags.h +++ b/include/linux/page-flags.h @@ -933,6 +933,7 @@ enum pagetype { PGTY_slab = 0xf5, PGTY_zsmalloc = 0xf6, PGTY_unaccepted = 0xf7, + PGTY_guestmem = 0xf8, PGTY_mapcount_underflow = 0xff }; @@ -1082,6 +1083,21 @@ FOLIO_TYPE_OPS(hugetlb, hugetlb) FOLIO_TEST_FLAG_FALSE(hugetlb) #endif +/* + * guestmem folios are used to back VM memory as managed by guest_memfd. Once + * the last reference is put, instead of freeing these folios back to the page + * allocator, they are returned to guest_memfd. + * + * For now, guestmem will only be set on these folios as long as they cannot be + * mapped to user space ("private state"), with the plan of always setting that + * type once typed folios can be mapped to user space cleanly. + */ +#ifdef CONFIG_KVM_GMEM_SHARED_MEM +FOLIO_TYPE_OPS(guestmem, guestmem) +#else +FOLIO_TEST_FLAG_FALSE(guestmem) +#endif + PAGE_TYPE_OPS(Zsmalloc, zsmalloc, zsmalloc) /* diff --git a/mm/debug.c b/mm/debug.c index 8d2acf432385..08bc42c6cba8 100644 --- a/mm/debug.c +++ b/mm/debug.c @@ -56,6 +56,7 @@ static const char *page_type_names[] = { DEF_PAGETYPE_NAME(table), DEF_PAGETYPE_NAME(buddy), DEF_PAGETYPE_NAME(unaccepted), + DEF_PAGETYPE_NAME(guestmem), }; static const char *page_type_name(unsigned int page_type) diff --git a/mm/swap.c b/mm/swap.c index 47bc1bb919cc..d8fda3948684 100644 --- a/mm/swap.c +++ b/mm/swap.c @@ -38,6 +38,10 @@ #include #include +#ifdef CONFIG_KVM_GMEM_SHARED_MEM +#include +#endif + #include "internal.h" #define CREATE_TRACE_POINTS @@ -94,6 +98,26 @@ static void page_cache_release(struct folio *folio) unlock_page_lruvec_irqrestore(lruvec, flags); } +#ifdef CONFIG_KVM_GMEM_SHARED_MEM +static void gmem_folio_put(struct folio *folio) +{ + /* + * Perform the callback only as long as the KVM module is still loaded. + * As long as the folio mapping is set, the folio is associated with a + * guest_memfd inode. + */ + if (folio->mapping) + kvm_gmem_handle_folio_put(folio); + + /* + * If there are no references to the folio left, it's not associated + * with a guest_memfd inode anymore. + */ + if (folio_ref_count(folio) == 0) + __folio_put(folio); +} +#endif /* CONFIG_KVM_GMEM_SHARED_MEM */ + static void free_typed_folio(struct folio *folio) { switch (folio_get_type(folio)) { @@ -101,6 +125,11 @@ static void free_typed_folio(struct folio *folio) case PGTY_hugetlb: free_huge_folio(folio); return; +#endif +#ifdef CONFIG_KVM_GMEM_SHARED_MEM + case PGTY_guestmem: + gmem_folio_put(folio); + return; #endif default: WARN_ON_ONCE(1); diff --git a/virt/kvm/Kconfig b/virt/kvm/Kconfig index 54e959e7d68f..4e759e8020c5 100644 --- a/virt/kvm/Kconfig +++ b/virt/kvm/Kconfig @@ -124,3 +124,7 @@ config HAVE_KVM_ARCH_GMEM_PREPARE config HAVE_KVM_ARCH_GMEM_INVALIDATE bool depends on KVM_PRIVATE_MEM + +config KVM_GMEM_SHARED_MEM + select KVM_PRIVATE_MEM + bool diff --git a/virt/kvm/guest_memfd.c b/virt/kvm/guest_memfd.c index b2aa6bf24d3a..5fc414becae5 100644 --- a/virt/kvm/guest_memfd.c +++ b/virt/kvm/guest_memfd.c @@ -13,6 +13,14 @@ struct kvm_gmem { struct list_head entry; }; +#ifdef CONFIG_KVM_GMEM_SHARED_MEM +void kvm_gmem_handle_folio_put(struct folio *folio) +{ + WARN_ONCE(1, "A placeholder that shouldn't trigger. Work in progress."); +} +EXPORT_SYMBOL_GPL(kvm_gmem_handle_folio_put); +#endif /* CONFIG_KVM_GMEM_SHARED_MEM */ + /** * folio_file_pfn - like folio_file_page, but return a pfn. * @folio: The folio which contains this index.