From patchwork Tue Feb 18 17:24:52 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Fuad Tabba X-Patchwork-Id: 13980312 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 95BCDC021AD for ; Tue, 18 Feb 2025 17:25:11 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 2AB59280164; Tue, 18 Feb 2025 12:25:11 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 234B028015D; Tue, 18 Feb 2025 12:25:11 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 01208280164; Tue, 18 Feb 2025 12:25:10 -0500 (EST) 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 D12EF28015D for ; Tue, 18 Feb 2025 12:25:10 -0500 (EST) Received: from smtpin09.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay05.hostedemail.com (Postfix) with ESMTP id 55E1E47C9F for ; Tue, 18 Feb 2025 17:25:10 +0000 (UTC) X-FDA: 83133741180.09.056BAE7 Received: from mail-wr1-f73.google.com (mail-wr1-f73.google.com [209.85.221.73]) by imf08.hostedemail.com (Postfix) with ESMTP id 6E6F9160010 for ; Tue, 18 Feb 2025 17:25:08 +0000 (UTC) Authentication-Results: imf08.hostedemail.com; dkim=pass header.d=google.com header.s=20230601 header.b="wt/cNGH/"; spf=pass (imf08.hostedemail.com: domain of 3csK0ZwUKCA88pqqpv33v0t.r310x29C-11zAprz.36v@flex--tabba.bounces.google.com designates 209.85.221.73 as permitted sender) smtp.mailfrom=3csK0ZwUKCA88pqqpv33v0t.r310x29C-11zAprz.36v@flex--tabba.bounces.google.com; dmarc=pass (policy=reject) header.from=google.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1739899508; 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=AjftRHL78GvMAxQBgln24N5MOtatVF4iZ/akwpMzsOQ=; b=dtyjsMkB8v1zeypD9MMdqfuogQNaEpBokXdG415aJyTSGp8c7Skz+vV13uRF2xcs4/J9QA HEopzfLJLagx78Kiq5S3m6SaLr15PucNwdkA2zPHQyXa88hJuBsGQTiWFUUe8t6fjirIFc CwlhSz4yjEZwg/VRmSFT6ICUuLboQvA= ARC-Authentication-Results: i=1; imf08.hostedemail.com; dkim=pass header.d=google.com header.s=20230601 header.b="wt/cNGH/"; spf=pass (imf08.hostedemail.com: domain of 3csK0ZwUKCA88pqqpv33v0t.r310x29C-11zAprz.36v@flex--tabba.bounces.google.com designates 209.85.221.73 as permitted sender) smtp.mailfrom=3csK0ZwUKCA88pqqpv33v0t.r310x29C-11zAprz.36v@flex--tabba.bounces.google.com; dmarc=pass (policy=reject) header.from=google.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1739899508; a=rsa-sha256; cv=none; b=cylCTE48BqFWSDw8PhKhKvj4ZK/VcoNxQG+Arr56PMs5jCchZEhue1P27sfXKFHaLzgTlv JkVmQSCijVqx+4mlOVZpWN5eD4Eb8/YRblBimq5lTITZ5I3m9DrE97gmVLm/Eec0up2zCs 9DayjLo+MWL+435mJzT9k0imsjPQvWQ= Received: by mail-wr1-f73.google.com with SMTP id ffacd0b85a97d-38f29b4d4adso2652467f8f.3 for ; Tue, 18 Feb 2025 09:25:08 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1739899507; x=1740504307; 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=AjftRHL78GvMAxQBgln24N5MOtatVF4iZ/akwpMzsOQ=; b=wt/cNGH//buwQpuB3wkNESfdXoBdejGETX/ez6gec9wax/wapS6moJRkCfE9a+tz3N 20DvEmUWu5WOWsQn8XOu9nJQgSrYgE1QjTA1O5eCWeTBymZcmgDYZGPJC2b4HFiNGybA FgjsjWpBg6yHegUag9hD8PwKy57kVrx75tZoL3h5hqdKNIkwYkVvIGJuDsvTkPAFprjW Nwn4rGKcsLLPGGvvTB3seVv4+jTT5VhYofQJRRIEUGG2zxP/vjU5h7CwMfCp1hC0non3 7T41hREs3aF9Npk896/WCwJ3MD1ssDD50VNBbvbn0vk3Ojv6AEXha1R5q3S1bVaOiu/M BLmg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1739899507; x=1740504307; 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=AjftRHL78GvMAxQBgln24N5MOtatVF4iZ/akwpMzsOQ=; b=lspnecrSQpqYygbByPPT+HM/Jfn3j0ogAXFkCEn2UVgUL7O0igW1SwSABvJvlMrGSJ DPDVV309Ycqbyl3TxhaAJY7tDwyZq4Mw5spUOMYk93mIPEBaloqwqG1Q+QMbo3gmYb9K BU+dqgEJyjTmtHUIofklgRzrVQHGBEdRSHbuCW26TN+gYTf4xXdeWK/6isKkkjEKoaQi w88leyKy58aV3RaQyRpvIWc0EEuV8lG0FhCLCNFI4v69VRt3KHz83nl3YrX4IKd5iRjg PEFgMj+5S8ZFpGS36EHWHC2afT3AGIUJP6Z02aLShLr1SwU5w04VKokm6Mtbbk1h8CIb 7CRQ== X-Forwarded-Encrypted: i=1; AJvYcCV3pKHKa49cGKungSCx4C3ruCrog9nahjRqM90Ron5M3DIcU0uCk3xA5BBSQ86dV5gZcUlO7xBoIw==@kvack.org X-Gm-Message-State: AOJu0YyxGKFQNzGJ+xgAV8V2dbCaZdwDju9GvkzOYc6EOYh9h3c0vKgD exBUCkyKIbO1K4vF9xX1Mz/MijuaoEFMVatzX29BqwB6rwFStGtzgnoyJ60XtZrQN8NVmsa5Qw= = X-Google-Smtp-Source: AGHT+IGtq1vI9mi82FBNTYUNeT9g08nt9Gn+a8vjX9kYrGKRZeaCmPiZJOk8GXgumjV4Sq5SnZyiJoW2cQ== X-Received: from wmbg4.prod.google.com ([2002:a05:600c:a404:b0:439:9601:298d]) (user=tabba job=prod-delivery.src-stubby-dispatcher) by 2002:a5d:5850:0:b0:38e:90f3:475a with SMTP id ffacd0b85a97d-38f33f55023mr14469841f8f.51.1739899506921; Tue, 18 Feb 2025 09:25:06 -0800 (PST) Date: Tue, 18 Feb 2025 17:24:52 +0000 In-Reply-To: <20250218172500.807733-1-tabba@google.com> Mime-Version: 1.0 References: <20250218172500.807733-1-tabba@google.com> X-Mailer: git-send-email 2.48.1.601.g30ceb7b040-goog Message-ID: <20250218172500.807733-3-tabba@google.com> Subject: [PATCH v4 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, tabba@google.com X-Rspam-User: X-Rspamd-Server: rspam09 X-Rspamd-Queue-Id: 6E6F9160010 X-Stat-Signature: 6mx6jn5rwxqka5aa1fxdoo5jaux5z4ex X-HE-Tag: 1739899508-431214 X-HE-Meta: U2FsdGVkX1/7BALCYuGjRqoUc+UEYXQ+GTPgIvRWnqbdZtFnl0lliSBf8iTJatsJVLGJnQX30VAGfMnarX7swVmYmvkUd9aSfca1JlxLQeLHGzW/sztdIVqWBlrQBgNflIf1JTgP0+j8OjPcfi1S1tchatACe+HrycLnI7fnBqUbh/1HWnqtQK6r9sNyWfof7ymJaudx4yf5ye7P74YpWw/LJDS1DqfCjbHTywiNoZLEJ7rtBb0Ej+ObbGHU3F9Ue67lTX2VomGmAMVHLS0bctRGSc1wIvFq4sTLUPzR895/jaOa+eejcHMmvcmFNX11kurP2vFJFCPBBTxpr5qvta5GtuBPkkjgtaD3mvTF2KFMOqNxUfs/vS3+YqdSQV+/D8Y2g67EY/0hcoMmEBWGlkKwo9pxkTh+FeS0TXYc2rOnU5LqHUpMVTYAAzi+4pqE5yn6B1+daqcV6hQ13XNgF1iZCaFOUS1oA+R/2X3oaO+k2VMhcVQU549XDtbJ7XnFOtspn015MSGwRhpQlLBtMINYqCXbO1/gYEqyitryBSlRnA6DGZd623OWMgy2cVPcdutcYMzaRjCaGF7Jqw0lmQRJtO7rYQeESPvLdCEml4+SpEVEM1nDzG+5bW85Hrgb+mNaa+vE7t9hlrwfHWnNq+5vOFGtECbn+gYNDQyWNVFjM5jewx8wrmi0ZSBDoGOaCRZyhSwor31Yb6Roff0ueoijoucMRFKUL384zfX3lCHOU2vKe61pF1w/iTaGTe6AoWhLZY3d9LuUN3eRkOJsmNGSQD3ZiZ88lPJoVxQxKWV2e4ASy6kvrr1x6yf35sia2Gp+7FJ+uf2GEeU5VLS4eBiR8St7PRCCSt7jARopSF575hqBFzDjfDy40E9heBTzCqhYMzlTUudj6WFx966SV/QOctvuNArmissjMJXDjNdG+5qVHxz8T7PnfqWQDdW9d0LI//Lryee1ne1Rcpj zTJ4J0L9 Mz2XSGD9A1Q1eN99uNuyESo7OrqnJfPq4C1EI1HX9IHUnqQUXr1lR69lKWYV/tupMB9BrCHBm+akLcRlUkwQU901ig46uqOAikrP4YBgRccLVOVkvPH3Zf8p13qY4y0dbrjsnVBpYVmCUOTmVsAnVVZH0+DFs2fngGp7jSztkmTZAbDGkfAqysCrtkoDy2xbiW8pAx3r1XIC0pu6LK0B7P0lgE9Bagq7IO3M4zH3TtFeVPrm7PvWU7z3qm0ij441ruepWPoI/rV/q/N4XqgDUrwZ4yuBrB3QzhLfrNhiBoUYbrGeI0V/sSKYheSxkfy3VkSmPpwjkj/eGX2k4WPXU6alRyOsiqS8uyynHXdkj513AjOrbj1z08cPAY/+Bk2cwNNEGNsIch99B/CK7+oZvhd3ioWQwPTWTRUgjN+IxsqHMtS9PytYo/tMG67CUuNaOMhzA6PQqhh6H0FI7RrSAfydWay0nfXDytmbOi/Yd1R8qkSX61zWs8iSCt7J09kEo01+If0DZU7+e5VNzxPW+6vLIbjvmm4NE3/nzeNl6Rk1nw8m4v/AKzsi/FgCtRwXPmBEl32MaLB76jYRRNP65ANrmdozKpI1hDMLs1T6/LYwp1OII1dWL1MIrrRkloNtTguvYdVANEEsjwLtlzb0ZcMMNUSGaoDgeEz/LeJwD+I45FalksUTiXo5bQA== 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 | 17 +++++++++++++++++ mm/debug.c | 1 + mm/swap.c | 9 +++++++++ virt/kvm/Kconfig | 5 +++++ virt/kvm/guest_memfd.c | 7 +++++++ 6 files changed, 43 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..734afda268ab 100644 --- a/include/linux/page-flags.h +++ b/include/linux/page-flags.h @@ -933,6 +933,17 @@ enum pagetype { PGTY_slab = 0xf5, PGTY_zsmalloc = 0xf6, PGTY_unaccepted = 0xf7, + /* + * 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. + */ + PGTY_guestmem = 0xf8, PGTY_mapcount_underflow = 0xff }; @@ -1082,6 +1093,12 @@ FOLIO_TYPE_OPS(hugetlb, hugetlb) FOLIO_TEST_FLAG_FALSE(hugetlb) #endif +#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 diff --git a/virt/kvm/guest_memfd.c b/virt/kvm/guest_memfd.c index b2aa6bf24d3a..c6f6792bec2a 100644 --- a/virt/kvm/guest_memfd.c +++ b/virt/kvm/guest_memfd.c @@ -312,6 +312,13 @@ static pgoff_t kvm_gmem_get_index(struct kvm_memory_slot *slot, gfn_t gfn) return gfn - slot->base_gfn + slot->gmem.pgoff; } +#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."); +} +#endif /* CONFIG_KVM_GMEM_SHARED_MEM */ + static struct file_operations kvm_gmem_fops = { .open = generic_file_open, .release = kvm_gmem_release,