From patchwork Tue Feb 11 12:11:18 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Fuad Tabba X-Patchwork-Id: 13969534 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 95792C0219D for ; Tue, 11 Feb 2025 12:11:38 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id EBE3B280003; Tue, 11 Feb 2025 07:11:37 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id E478B280001; Tue, 11 Feb 2025 07:11:37 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id C988C280003; Tue, 11 Feb 2025 07:11:37 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0012.hostedemail.com [216.40.44.12]) by kanga.kvack.org (Postfix) with ESMTP id ACB38280001 for ; Tue, 11 Feb 2025 07:11:37 -0500 (EST) Received: from smtpin21.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay04.hostedemail.com (Postfix) with ESMTP id 38F921A19E3 for ; Tue, 11 Feb 2025 12:11:37 +0000 (UTC) X-FDA: 83107549434.21.259CBF1 Received: from mail-wm1-f73.google.com (mail-wm1-f73.google.com [209.85.128.73]) by imf05.hostedemail.com (Postfix) with ESMTP id 62424100007 for ; Tue, 11 Feb 2025 12:11:35 +0000 (UTC) Authentication-Results: imf05.hostedemail.com; dkim=pass header.d=google.com header.s=20230601 header.b=3wlygTqf; spf=pass (imf05.hostedemail.com: domain of 3dj6rZwUKCOMYFGGFLTTLQJ.HTRQNSZc-RRPaFHP.TWL@flex--tabba.bounces.google.com designates 209.85.128.73 as permitted sender) smtp.mailfrom=3dj6rZwUKCOMYFGGFLTTLQJ.HTRQNSZc-RRPaFHP.TWL@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=1739275895; 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=sWMrByBHh6bCcS+Ah6m7GoQirIP0Jem/nT3gsSQXFpI=; b=jSU/moi+p2ah9tUxtlAPJJschdjH6r9XOYi0R59NEMckDgS7yNQuKCh5AuLCFc4kY5Pnwy Cs9nKMjtxAxc8egtJQ7olNMuCc+t7+5Bigg9T69FIXyKHQLTgiNfgy9tKeBH25K6kKHOBU YRtpZissEM3NduRr0LMkSgtGcPoxL/Y= ARC-Authentication-Results: i=1; imf05.hostedemail.com; dkim=pass header.d=google.com header.s=20230601 header.b=3wlygTqf; spf=pass (imf05.hostedemail.com: domain of 3dj6rZwUKCOMYFGGFLTTLQJ.HTRQNSZc-RRPaFHP.TWL@flex--tabba.bounces.google.com designates 209.85.128.73 as permitted sender) smtp.mailfrom=3dj6rZwUKCOMYFGGFLTTLQJ.HTRQNSZc-RRPaFHP.TWL@flex--tabba.bounces.google.com; dmarc=pass (policy=reject) header.from=google.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1739275895; a=rsa-sha256; cv=none; b=FsMQyoTzGP/OjMx4oCLzuHkaLZXzzfd7fASQsASWk4Pn/yax7rir8Cy30zzZ+pqX2WMvm4 2VyTVU9DG+ATvf+Jm7TCz/A5Ma60lAK2S4g0Zjqi9VHKD6LT4tmpdJVUMx4+3OB+/AGUB1 hoUekPHmHOKTKn1pu0nh0JJZkgKph5s= Received: by mail-wm1-f73.google.com with SMTP id 5b1f17b1804b1-4392fc6bceaso16982345e9.2 for ; Tue, 11 Feb 2025 04:11:35 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1739275894; x=1739880694; 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=sWMrByBHh6bCcS+Ah6m7GoQirIP0Jem/nT3gsSQXFpI=; b=3wlygTqfXtQSpaokHiJOGOAU8QGSE5cJx2Kd7qrbIXvaaAE1Uguaw44rp3IA0mWubM 7hhpNx5tkyH4CmsiPIeEogVdiU22L5TMF5rMu1u4Hg3TiYzQtucSXOX/QiVOhNz2TrhH EBVAllM3NjntB/qozVvYV2CJkm4FG5DXQAWqVKd8h0LxCNy4LlOUZCZSbXjA7SyGy8Cc XkjnGjZUBU5SNCuCeMt+S6Dz5JEIcADdbur9le8v9PONDTq8PqzYUyKTcXLPTfOTTErg cdU1ufBBObC+bYX0T9rgcuj3Al313YssQjLi0R4Kdkwwt8vQ69ned75PU3biR8Waial7 YDUw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1739275894; x=1739880694; 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=sWMrByBHh6bCcS+Ah6m7GoQirIP0Jem/nT3gsSQXFpI=; b=qD2uTIn3HHv4UiddyruyPn2rHkCHYTt0aQZZbfesJx0NSVm7XNXpM5yFEnvjtMB2/1 lA6/esCuBEaxpocnZPUpq+e01F62zXhJ8pLFBUGZC63FvtuE9P82BhV8IjAB+CiGZpEd Oit0u5dVgtO74kGxJH0fymP+01E549jSus9HQEQUgwazXCh6PsDbA/v1NUct7RSQx8Ap 0XC3knywI5PRcl8fmjuGEjlU7kFYvmxCEYkOFoggMJdooUhElHwZeBT42s+mWVyRO8dI aJiV/FdOHxr6vkOSUw41DoQDPRnj0uLypDAxzULrJgVeNZ0Iz38UIhTwoS+IOHqr4zPF eFUA== X-Forwarded-Encrypted: i=1; AJvYcCUU1mHtpe6W8hCnCPCOpxybHvTARnk6F89uNJT6ebeMZY5iXxD/IuBE8nZAOUPzSGaT9xf+OIF4NQ==@kvack.org X-Gm-Message-State: AOJu0YymVE2MMvCQ3NEjgKjxC472Q0hbOTIk2EBzi0inAlWQRuGWGn5U MkREmG43fmNSyem9zzqSDBAqteAmUKKV++hZ+bWQiz38ZnbF7Llk3we/eBjw1f8I76XzSaSlSg= = X-Google-Smtp-Source: AGHT+IE8Ghyq44OOrdMI7rTy32U9k2qC1vm1QBwY+iABDYDzlSXr3Wt1H56p+D7BVdWhTRPrbKtMom5fBA== X-Received: from wmgg10.prod.google.com ([2002:a05:600d:a:b0:439:432f:cc11]) (user=tabba job=prod-delivery.src-stubby-dispatcher) by 2002:a05:600c:ccf:b0:439:56f3:d40f with SMTP id 5b1f17b1804b1-43956f3d5c3mr1028375e9.21.1739275894075; Tue, 11 Feb 2025 04:11:34 -0800 (PST) Date: Tue, 11 Feb 2025 12:11:18 +0000 In-Reply-To: <20250211121128.703390-1-tabba@google.com> Mime-Version: 1.0 References: <20250211121128.703390-1-tabba@google.com> X-Mailer: git-send-email 2.48.1.502.g6dc24dfdaf-goog Message-ID: <20250211121128.703390-3-tabba@google.com> Subject: [PATCH v3 02/11] 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, yu.c.zhang@linux.intel.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-Rspamd-Server: rspam04 X-Rspamd-Queue-Id: 62424100007 X-Stat-Signature: rpgsamu3ohtziz8zfxo6m1te4w9pfxnc X-Rspam-User: X-HE-Tag: 1739275895-573537 X-HE-Meta: U2FsdGVkX1/35VdSx1kgWsbyRVUPFK7G7C69ycedKl0kohlONsG3l397kQzh4Iy9cfN2g+T30rUCgZHNgoUy9TgM7Ti5zfGpWs+h0PhYUSf1UCUDtWdTbOBFUWAd6xhTFMCKX2Ea5g7kkcUSbsgaHcLEsipxuILXdYFJSZSnf/wimh9V9BhN10UQXw1FtdybgmW0yTlONHfP6/fZyiBXur/HhlRgGhQFHXtP4sU2vzDsVnF+jfoqRS2Uq0imuVulRi5NsmdqoVna07G17zFgWMWmqTRi6Uv1m4+ggKSDxVRVdrQ9NYwZ40phomWQHzlAASRwaV4Z4ZsupOjR67X+rf8NMYF/JjG/zx3b6dr9IkFWYgiD3oyH/SKd1BkajoFx2fBdYvmNcnFcS3MZ8lT+57cgpQ5jMHN8gpUUbt4VGRMbygDjTpC8WScewsqbQ1+FoA10ZC67K19e6NNEJWGoYMpxjY1GzTkT3jFiAcT1Plw1/wRF7E8tKVqHH0emFgksKgAJJpnJnl3qEJ/vgeIlS72xxU4tc4r8HjPIDg2sDFTaJyLggR5OA2eWu3PIf9x1T92Kqm0+ANPHF2kVZx6FPQvn3QtHyeM8j61dk9wcSka+L4xw0z73em4jNLV7kmnWjZ7iAj/Mt14/T1uQeiJLhVDDBq8ckDk+hnIzfCC6wcoF/HCJIsvYPHTtrtPCM2mUz8QxEkfs+kC5eCzgKoAXz98mtk8zMd9DEnfBejBwrFObxQExL7hHpQeOX3Hs/WE4+Nwv7Kdhl6eDXZkQIt9PupeR21KIYro+rjK32H/HdLg+wSZuunUXvf/b6AEcJ0EE59PARNWFDiWiX6Xenk6m9mJANzhO8cYWWY0aJ5p6pNgipPwtI6qFhv/uzi51pdcKsmDCDX59pCntAKK0ukHqiGvQweFbCc+RZe7yTAqY7Rn8uhx85XJUBDY1gZuJJ2vPW4P+oFTictL6uoeg4fl 7azCTwSA 4WGIQ9p0Zp9UejTnNarFDSq7B/xLzDTcki0gx7Ajvc6h6nEDpCpuuAgcaJ+zmAzcKRV+D5+IDqd/sf0bsitJUDvjWyJOeL0auG6z/WwdKnjvP/fChmFrPzdW3zIU58F0smyD+Jy4gSrrLYqBa6vITcm6NFprgWMWFjAFiEifSvMPhR0XeDjx+PfYEwDMPnFvbILpkq7vhHkCXeNWQrBR0BeV05fB78tp8Mt8ihtR++qWF4ejZlTQanaj0BMcI8RugDK8zA6uEKP3i8Xb7RdKu+wb7Fsdq25jrbKn58Gl6se0dt5qR3K7bcBcj/3U2gIzQRztiU0GbUzIX+HP/9IBojlx+Geao0C9cr5nuhzIWIvEs1gLAuorRF0zKNeyPDK+auCxJqT1DmFQOmMemfu69zU0Hq6m2DMAqJ3tG/Szk6p4Gp/ygZSdDDoPVhgEI2imCYiNxscTmgIUe5GecmPHH29Sde4jA7XHp9RLfJ32F1XC6707ZZaWVs7DEyrK8RIlKdRDGvjoR/wdaZm7y3nITYmTNZew34StyluPgpPaXMPcDozWK2Mmd9X1ZPhopKYA1y1N2EjAhhHuydKlAVJw6t7RjnOY/3Xt/HlC3dV+3sW4o5lBZ/Rejz3Eb2/FrkQ6B7gojZc0w36SajeKtLC9GYOK1FWdw4v0+tF7y4/PWYqsihyBAtnLEnuoJbw== 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 next patch. 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. Signed-off-by: Fuad Tabba Acked-by: Vlastimil Babka Acked-by: David Hildenbrand --- include/linux/kvm_host.h | 9 +++++++++ include/linux/page-flags.h | 17 +++++++++++++++++ mm/debug.c | 1 + mm/swap.c | 9 +++++++++ virt/kvm/guest_memfd.c | 7 +++++++ 5 files changed, 43 insertions(+) diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index f34f4cfaa513..8b5f28f6efff 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h @@ -2571,4 +2571,13 @@ 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); +#else +static inline void kvm_gmem_handle_folio_put(struct folio *folio) +{ + WARN_ON_ONCE(1); +} +#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/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,