From patchwork Wed Mar 12 17:58:15 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Fuad Tabba X-Patchwork-Id: 14013728 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 6B476C28B2E for ; Wed, 12 Mar 2025 17:58:34 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id B3526280004; Wed, 12 Mar 2025 13:58:32 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id AE323280001; Wed, 12 Mar 2025 13:58:32 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 89FE6280004; Wed, 12 Mar 2025 13:58:32 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0011.hostedemail.com [216.40.44.11]) by kanga.kvack.org (Postfix) with ESMTP id 571F7280001 for ; Wed, 12 Mar 2025 13:58:32 -0400 (EDT) Received: from smtpin15.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay05.hostedemail.com (Postfix) with ESMTP id A9D8856C05 for ; Wed, 12 Mar 2025 17:58:32 +0000 (UTC) X-FDA: 83213658864.15.6FF1E39 Received: from mail-wm1-f74.google.com (mail-wm1-f74.google.com [209.85.128.74]) by imf14.hostedemail.com (Postfix) with ESMTP id F2CC610000B for ; Wed, 12 Mar 2025 17:58:30 +0000 (UTC) Authentication-Results: imf14.hostedemail.com; dkim=pass header.d=google.com header.s=20230601 header.b=GfyDgSDq; dmarc=pass (policy=reject) header.from=google.com; spf=pass (imf14.hostedemail.com: domain of 3RcvRZwUKCGgZGHHGMUUMRK.IUSROTad-SSQbGIQ.UXM@flex--tabba.bounces.google.com designates 209.85.128.74 as permitted sender) smtp.mailfrom=3RcvRZwUKCGgZGHHGMUUMRK.IUSROTad-SSQbGIQ.UXM@flex--tabba.bounces.google.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1741802311; 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=ZH2ddFSySXL8ljh40ScGRRkvOagkKQt0yLw/o+/C9xs=; b=ewuls0/SQq1uXw10qpnWNMgWYMqZOz2ZmJr3WIN3z5jfAvEy2OHFZhg/sYoCl6VWGSFjBA LVIi0ffTBU9csL23GW5XG8LKAV6oC/Y9A1Qe6TZQkpVXOwuNpbdpaJ7fZre5flMtvv3tUM yl0qsboW7Za9/UXXkSMzWearOk8lHFg= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1741802311; a=rsa-sha256; cv=none; b=1I0eFPIBWSyeseDHhpXYltIcZCb5LKGps9OPz8HDX5gA/a1TZ4shtPcd2VSsbcaGNXxx+1 NtFmr8bFD5MiCJuHC5LQpFC48ksLTdlmYwPC87+bLCuxxphUBXhlWrVieHXL+N4QnLpWs6 IiQ/fLiflZZ0K5NY94ZxrsB1DFsKOBI= ARC-Authentication-Results: i=1; imf14.hostedemail.com; dkim=pass header.d=google.com header.s=20230601 header.b=GfyDgSDq; dmarc=pass (policy=reject) header.from=google.com; spf=pass (imf14.hostedemail.com: domain of 3RcvRZwUKCGgZGHHGMUUMRK.IUSROTad-SSQbGIQ.UXM@flex--tabba.bounces.google.com designates 209.85.128.74 as permitted sender) smtp.mailfrom=3RcvRZwUKCGgZGHHGMUUMRK.IUSROTad-SSQbGIQ.UXM@flex--tabba.bounces.google.com Received: by mail-wm1-f74.google.com with SMTP id 5b1f17b1804b1-43ceed237efso549355e9.0 for ; Wed, 12 Mar 2025 10:58:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1741802309; x=1742407109; 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=ZH2ddFSySXL8ljh40ScGRRkvOagkKQt0yLw/o+/C9xs=; b=GfyDgSDqOTYwUP9aHSgkn2dFWMtn9ulO3XqneuC6EJRvV1DYvffUV/IV+TTqEpZa0M LEHANjVhWmbIrFE+kaoRJuxPz/bgkPoADhh8//h5WW8a7ov5TnEIJOBL/LECDMTA/W/a h6gHxpeonhFD9vqKuKZ77h2zUIX2hDRhwNExGhibExDdmXc0KJl14ApYeJOxktM+uZ3x bYsYEF2DMuiHpAhJvsz/Un8aTuPk7WVjVRGmFaQQH0o4OyEJjEtMHIQQjoGP2H/Ia710 HLJsUBPbCpk74KWdokTeiTyOAlSQKfcVdl2uX0uwb4GaEnr0xfpuoEHBEV3BK6HHqL8F /hnQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741802309; x=1742407109; 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=ZH2ddFSySXL8ljh40ScGRRkvOagkKQt0yLw/o+/C9xs=; b=iA/AUqLHiHOp570wQgWBPdaEov+YKGJdK37+4XS6/L2va8iIPtpTI4AVBfwtK4BRot sAlTEaPf9fF0F/TS/4tgCjUpaxsQ6vU+KQJm3e2jSlnk8WsW/A54op6bCMJ9XE0sDhl9 8Gq+FPCFDygsfxvPX4WNXMecsQZK/5ag7p33a0wTn2EJYy7UHfpOknp5bXzK0otHas56 UaEGzOW/Bv7lHCqA6HlxV6qFx+3DwGkb98+yTGqYCkdQE6bPqfR0MoPR28SALrG9bz6w DoWa0kbcqugQBwH1nGh0MIidLlLiN7Tn1coBjVgK5LiPdKJT05BkrBtfgsc/qore/hSk /ZRA== X-Forwarded-Encrypted: i=1; AJvYcCWKVlIQeqULAlxrEInjbKV1LD16yy5b+rWYz0cgur8ybE6G1rQhPKjFKBrEnW+LOnJb30h8ssipJg==@kvack.org X-Gm-Message-State: AOJu0YyhtkyFtCZShxuY0rZ8itUFdbxp0y4XSnXRzVkCjYE1SwhNO5Zw 2ZiurjI14Hr0qHphdRHEglKIJqIUF98EjVB+kj/MAq2mCed7kqWdb0fVEwgdBSD/bVWe5e7xfw= = X-Google-Smtp-Source: AGHT+IG3QL0FD0w8QJ+6eYUXr0ym7H16e0KnHlntRiSz0AzMSuHdXLBjD/jyLDhLgORTX5AXNY0xHban7Q== X-Received: from wmbgz9-n2.prod.google.com ([2002:a05:600c:8889:20b0:43c:fcbd:f2eb]) (user=tabba job=prod-delivery.src-stubby-dispatcher) by 2002:a05:600c:4f90:b0:43d:fa:1f9a with SMTP id 5b1f17b1804b1-43d01c22acfmr99270665e9.30.1741802309618; Wed, 12 Mar 2025 10:58:29 -0700 (PDT) Date: Wed, 12 Mar 2025 17:58:15 +0000 In-Reply-To: <20250312175824.1809636-1-tabba@google.com> Mime-Version: 1.0 References: <20250312175824.1809636-1-tabba@google.com> X-Mailer: git-send-email 2.49.0.rc0.332.g42c0ae87b1-goog Message-ID: <20250312175824.1809636-3-tabba@google.com> Subject: [PATCH v6 02/10] 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-Server: rspam04 X-Rspamd-Queue-Id: F2CC610000B X-Stat-Signature: nxt1kopy3tgkd53z91fzr5s8bf9ux1i3 X-HE-Tag: 1741802310-608935 X-HE-Meta: U2FsdGVkX1/Exqo1f94pLr+dfJq11MbfoYlZNsWLZDToWIeLapwZpBVo9mmqvvKVrBT0vuT7GeNlGbyrC7RMyVN9UNmZhr6LeoNmjOfW7Ma2ttShT5qDdUHAQDG4wZFyUVlVLEM5whGGzLGJjNu0saoK08nNXJwKzJ+ytJsgFqs8Z7qOijhi8jTJ1A+J7bsjBzU00JZFNekI/z5IUNdmmUIb+DKjE28BChhwNif6btCeyfL1BNogtG/Z2Ud39ACCnIVGEk5QzOAbwjc6PMyU0ub5RF/m7mcXiFIhMqKpHYqtUb+Igfcy9NGafkdxOURiydgT4dlyxU+3gLZ/qfhlkqwo9jM5xxe6LiO6AF2yy8dYCBZYBQ/b0robT7c7+JeTx08hoFFvblZQLHzBeh0hql3iW5L2yFz2kaXafekEMKU0bs0CvX4fTQ5581ftcBQB6aU33DooWJu0lZH1bEgjTxac6cK22MxXpnewtqYjKe5+q+PGKUXlgbPtlqXD4xvk1rgUzgzpeo5t52k6fS8Zzbrxuzkg0MLFu+Q+Wv/iEqGjAsaZS5RyuPCkcbm9bmqz1RjN0OCy0fjVyKzHK0R+gsivFCFZF7FxQ3VGXuAe7zDZKkjtPpIcNt3XzUEQ46ErtmklGwpELn55ojgBHXTtb3WM83o8vqkjtDK7n9MDVhIe7JKLVfPO0PBzms+AYNAvfkVdvJXU1YgapM7SzqfaSVv04DvFexB/LRkUugtJTLKdDf4QL/ihnASavtw2gL09af+TFgwXFmzJlPqmi7qBSQxqbVxO4MvIqGc7ZVQBBWcGRnRa+Vbetdr+vnXKndYdZBnbcm2DnSCCNfoTt14YDL+JHUlJgnSYqjEAq9983H0JPVzh96k0NpjyKDBLzJnUaxOF4fGKvWfuYts+Fs/tcRzL/qbheDyhKL+MTQScYb7m6sm28m16RgvuE/n0VwnLNyFBO2khJZh9MgGfQCO DD/6OWv9 bPG41GsV2nYefoXTCO+cZHAnasGAbs0QTFF9SYW6D90UqWLGPDc9XmN7g15eZ4pvz0Mxxasxk25awgGdi6cxxTabWaRR4bWurfbYzt3f/l/vtAtLm5YALFlvZyMxHL8TsbN9sSfYX6gJ4t2G63ZkWH2FjLj3rXEuSQU+IIoysQ8LRYons1KL5wt+zfCIJ/iR6Mvgi2/SaHEiT+B6PNoBuJmRY+0kiK2QGAhlH2dMlb9lMi4lOfdbtn5w3l8a8cG4i43CaygZWH/lSRtyiSf2SArw+FF+jvRpD+0bskJkY8nOJoHMx8W3Su/v6jnDo4HTvv9Q0Kurlhdqc1ZqwnUfoB1bS5q6wRKyIHoROV0bn8/fwvOc= 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 | 7 +++++++ include/linux/page-flags.h | 16 ++++++++++++++++ mm/debug.c | 1 + mm/swap.c | 9 +++++++++ virt/kvm/Kconfig | 4 ++++ 5 files changed, 37 insertions(+) diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index f34f4cfaa513..7788e3625f6d 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h @@ -2571,4 +2571,11 @@ long kvm_arch_vcpu_pre_fault_memory(struct kvm_vcpu *vcpu, struct kvm_pre_fault_memory *range); #endif +#ifdef CONFIG_KVM_GMEM_SHARED_MEM +static inline void kvm_gmem_handle_folio_put(struct folio *folio) +{ + WARN_ONCE(1, "A placeholder that shouldn't trigger. Work in progress."); +} +#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..241880a46358 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 @@ -101,6 +105,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: + kvm_gmem_handle_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