From patchwork Mon Mar 3 17:10:06 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Fuad Tabba X-Patchwork-Id: 13999222 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 A291EC282CD for ; Mon, 3 Mar 2025 17:10:29 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 41F3D280027; Mon, 3 Mar 2025 12:10:24 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 3CD9D280016; Mon, 3 Mar 2025 12:10:24 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 19262280027; Mon, 3 Mar 2025 12:10:24 -0500 (EST) 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 CF92B280016 for ; Mon, 3 Mar 2025 12:10:23 -0500 (EST) Received: from smtpin06.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay01.hostedemail.com (Postfix) with ESMTP id 1930D1C8276 for ; Mon, 3 Mar 2025 17:10:23 +0000 (UTC) X-FDA: 83180878326.06.03A80FF Received: from mail-wm1-f73.google.com (mail-wm1-f73.google.com [209.85.128.73]) by imf14.hostedemail.com (Postfix) with ESMTP id 322A4100002 for ; Mon, 3 Mar 2025 17:10:20 +0000 (UTC) Authentication-Results: imf14.hostedemail.com; dkim=pass header.d=google.com header.s=20230601 header.b=33kBEpAk; dmarc=pass (policy=reject) header.from=google.com; spf=pass (imf14.hostedemail.com: domain of 3e-LFZwUKCJwP6776CKKCHA.8KIHEJQT-IIGR68G.KNC@flex--tabba.bounces.google.com designates 209.85.128.73 as permitted sender) smtp.mailfrom=3e-LFZwUKCJwP6776CKKCHA.8KIHEJQT-IIGR68G.KNC@flex--tabba.bounces.google.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1741021821; a=rsa-sha256; cv=none; b=XDVOcTmurkcSgg1PfygL2Jp9hOkKX8DdRUIAuWI6CoYig3epI4Eny3ksZbJhNvVlKaupOp uQE9f3RsE+CKKcEI8TQzceciYenz91rG1GDHY5aT6jO+1q41j2J8k6hYeVWspqD3MhaWBq Y2EOxlMAMOiBEjpA8T/ix5dfS7Rbwjw= ARC-Authentication-Results: i=1; imf14.hostedemail.com; dkim=pass header.d=google.com header.s=20230601 header.b=33kBEpAk; dmarc=pass (policy=reject) header.from=google.com; spf=pass (imf14.hostedemail.com: domain of 3e-LFZwUKCJwP6776CKKCHA.8KIHEJQT-IIGR68G.KNC@flex--tabba.bounces.google.com designates 209.85.128.73 as permitted sender) smtp.mailfrom=3e-LFZwUKCJwP6776CKKCHA.8KIHEJQT-IIGR68G.KNC@flex--tabba.bounces.google.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1741021821; 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=SRXCGSvCKi8KFNLeYd6jvsHWuv061HBQkZp/LgnTXzc=; b=WjDp/ot9exwADn75aBJ7QKS09bDwj6Ak+9casrUEA3a82PBfPI4e0ozdMa6lqy+xoZJCxL UMqcpVrFvW6LvpYy3LrOwF4vf0L4YsT8/5t3Jmam73Qt235CwmJF4BcT/qwjNsPpB/GHmm lyqQyxnz1D/ie0fjHEyIp/8zZeHuMeE= Received: by mail-wm1-f73.google.com with SMTP id 5b1f17b1804b1-4399a5afc95so18161355e9.3 for ; Mon, 03 Mar 2025 09:10:20 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1741021820; x=1741626620; 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=SRXCGSvCKi8KFNLeYd6jvsHWuv061HBQkZp/LgnTXzc=; b=33kBEpAkCqhO9SFsKYqEOPRpDvOHznmBCnbk5iK+wy62hoykPandWLPiKlGrBZH0S+ bDYkfcIKxjHAn2J/5ctr8GW/8vp3AovEr3BgL/qHREqYE73BXiiqxpYGXLymthULm55Y 7bMTHnRiCyRAlWe9/UQpGO8gSkZrMF2Ie/kABz5K/wGq1ikhYGsL5m0nc7qqx3xE1eh5 WOBXZxY8oexQiT0143VELDi2doGgb26v0BK+aExI/bMu2vnQmEyzaptR1hLCM9Y9NXhi 4K323Kd7sLdCxRXe+1zX9CH/J3Dk4b8daeEpOxAaKUspKTwaU+Q18YWs3Igc5fMqJiJt NVoQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741021820; x=1741626620; 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=SRXCGSvCKi8KFNLeYd6jvsHWuv061HBQkZp/LgnTXzc=; b=weaetZsntOZgcupvxIWDNGsFUXRqeiMo3jieHxQjAx4b0hSv3+fWk/JMovAC4WwLme x5BwbTOaHtuEkzvq+3Ixcz1P6lrrvu+dNkTLuLxOagwNc/a3SpxrVi9BEYSpvM8ZkdT+ 1kPW7dJXu1kQsr0GjraJkASXdr0VTLDF+6pXfYauyMhHlnMqc8WynQU3XwCtJrgumwmD mJqxmM09V+5Pji1QRS8aGulA13NBf18banpYNScysDTfadmlzPNux4U7i9aTSvQL4Y80 3ii1G21+H32tE9pQR0m6UQMSk3n2HDYsX43Q2VWEr9fnxlkES/qT33PuKRPmS/ZTVjW1 RGZw== X-Forwarded-Encrypted: i=1; AJvYcCUGPkglbVMK48D7yYqOa2qtJPmYWh089T6LPX78QaYbOTsD+f0cBZMhMVh3mZ6wEaLKLaAFq+39sw==@kvack.org X-Gm-Message-State: AOJu0YwxmHC9Rlzbr+14TqEguAmL1jD6hloNjKQRK1PxExXvwrAZ60Ik 0Vi5q2rCvDPlZuMnx07ttGqQc8iHWxsb8egI5l9/JoqN7W4+t+IAG775VwkoJlMzEWvWgLnnxg= = X-Google-Smtp-Source: AGHT+IHiT+g0b2FcJU3pHgUKOxKohFEOEB1W2gcQabUIaCdSRC5gA7558TblaDocxHQhpruqsN96dOjIwQ== X-Received: from wmbet10.prod.google.com ([2002:a05:600c:818a:b0:43b:c9e4:2160]) (user=tabba job=prod-delivery.src-stubby-dispatcher) by 2002:a05:600c:190a:b0:434:a4b3:5ebe with SMTP id 5b1f17b1804b1-43ba675830emr94037315e9.24.1741021819910; Mon, 03 Mar 2025 09:10:19 -0800 (PST) Date: Mon, 3 Mar 2025 17:10:06 +0000 In-Reply-To: <20250303171013.3548775-1-tabba@google.com> Mime-Version: 1.0 References: <20250303171013.3548775-1-tabba@google.com> X-Mailer: git-send-email 2.48.1.711.g2feabab25a-goog Message-ID: <20250303171013.3548775-3-tabba@google.com> Subject: [PATCH v5 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-Server: rspam03 X-Rspamd-Queue-Id: 322A4100002 X-Stat-Signature: enhato5cwkadm8ntsqtzbscdr6bezufe X-HE-Tag: 1741021820-667549 X-HE-Meta: U2FsdGVkX1/MTdMjJ1dsOahc0Fwih8d4W/AvhZuujTHwmp8lS3yPAY3pSZSfVrySfa8K7ga490YjrBYHO2II33z2J+yhXksFyr0G2PxW53VKcLCJo97qPGrSGGL0ZS29bU1XBBTlMc+yKCj9/SRmIYpSpIFd92B2sFDMIWM/Cbwgq0UOvhM/jAQMDFwPQDfm8oMNaUH+GHuy9eSMJPi55xp80um9vDajCndxdO+RVrq+rxn3b8Q7X1wkN6kRZ/baQX0DPDc2DequQXb31179ueF68CUiqysyl+UuLDwJTfUgJPOYWj3WvoIO1rTKrcnCZho5UpkjzxKmFtW7Y2BDcCxXrDgpHcz5tiddiZyUIK0bVVqL0iEISgs4aGJlhxAX/CxQM8o+YAyeEMuoIDsS3pyZ5ZJ+Ocxg1E7AssdJ1+JGnCT8/oxQYzUd5b/JC+zaQF0HSnwDXwsYR2YJjj3luCc3MLZaqriC6UVNXncmx6LIeLjT6afl/sf3Zt3Q9+0ljOm563xAe9iDkv4jY2ai0RDzd++tOGolRHyqnStlomZDkl+jxxU2WhBS1EkaaEYRCmGZswuFLSFf+eMbGTQvgK0BCTxD+dQyfmdPPmzTeaFJO6T9Qd5O5tLYgf3xFRp9+AF9b0r+9H5Uli+uKX//MIK5RDNL6cVXPLX5ADJcaDNKv7r+MNSZ6/sqJ8TQkq17ADJE3BXNgz1B9DhCNiM9A3b9ceiVwSwRWnza573BwhyDnriea3m7iDYy56sze4nEeUxCptA8w7eh8PxHUj8dW4fcDdk3gSQlz+TmcDisEbi2D+T6sSVW3feBzEihA94tjhIK1jW1ghCKTJjjRlg4/RJNOqjU6OpUvSnPTlx6yGGVMTR1JhmyhUXUg+4lBXPFptYL+RRopxPXU5maej6WgAP4THbUVj1sGOEzpixwv8VlcGUW8tnniYRaWBJAMddA8mGbt4pLCjlzf815+lY npI9Kv3K 8R+BTrkhwNaUdOFgWGUIItZais7mNFp5zO4Px568v5O24G8rjEYqWpOWNaO1e2sT6dlN+mO6s9PMuR3b05njP8NudWRIvEYBvp6UYM3Lt9zl6SZhC9OXFXa5IQZKid5KwZKZ+VAa69fN4M90Ce3v48ezB+aDQuuLorPg8nIvO86k31YrpsFWtH84ajlS7//Wx8XpZqrP//doDJwqmY4TFQ/lyvSO3uYxa4Kh7Ay58ParDmXevBqDUY1yJcMgANirfxrxl7wIcVSo3EdFI90c5WXgm5ej/+anLgPWHe3niQRJpD14Dz5XLM4+JdozvzEfE1pjbpKiSPmcXjXA6AjaqpC9NsDtahMGxXP1BiSMCEpLJ3brvNOCH8Tb3nzAYNEL2bnTXU2hDui63QEggoIy87pWhR79gH7glTn8UrGJ7u5vAZVJY4rzv1/Nxs9s/Ara70QK52Iqb6UgIs4Bz6o1PeJHAzUB7clrceA2BH0im3SgAB21JJsotrYDv0nov+y7qcbrNvxqLf1/ytGZ8amnid2XLQFo/zRXRzZzYpBFAmkgziOeiw5TjDTef7eKON1x/8rp/84OlHICOGv4Ky2vP0rEdfPTfa23IWAhs4V886x9Oqshv8mQjDXJInFFs2nc+1XsR0aiBfcDLrRCOhQFm35ZBHlmkUES7I6O+hwy0VqIwDfg= 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 | 5 +++++ 5 files changed, 38 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..37f7734cb10f 100644 --- a/virt/kvm/Kconfig +++ b/virt/kvm/Kconfig @@ -124,3 +124,8 @@ 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 + depends on !KVM_GENERIC_MEMORY_ATTRIBUTES + bool