From patchwork Mon Mar 3 17:10:05 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Fuad Tabba X-Patchwork-Id: 13999239 Received: from mail-wr1-f73.google.com (mail-wr1-f73.google.com [209.85.221.73]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7A23B1531C8 for ; Mon, 3 Mar 2025 17:10:19 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.73 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741021821; cv=none; b=MSKHsF7jq9rumQVqOgQrbu7yw0ImIrgTeEG27CJu4j/xMZaaoTu9hu5R2ROgCha01TpjLoNaUmnr14RoI3K7KU9UCNxQYpr7JKo+Vwtbd/if59xtwaLgMLlafx3qpwmdw+tclhxRwt01kX42bWjCg+xB4Ynp4HjUWy1c4v3vPO0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741021821; c=relaxed/simple; bh=OGMLw7hSKMeyt/pbr/nhF59bzM4sycNSU55EOTupIo0=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=Pnfv5IOWSCj+C8xBVJxM0rlaTAs30WwbHFw4O0Cn0un9TZsLp7dk1JWT20ULD0EC+9Irxhuc2OaV/k2cDEOYH/ZosOOJ7vQXJyVoTumwlFMdmvuJs15v36PAGKx0rH+ndo87grTIutcsj6lOHa+nbmtRWzj80NaHMyvKAjWFqtI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--tabba.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=wBdp8pcT; arc=none smtp.client-ip=209.85.221.73 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--tabba.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="wBdp8pcT" Received: by mail-wr1-f73.google.com with SMTP id ffacd0b85a97d-390f7db84faso1812119f8f.2 for ; Mon, 03 Mar 2025 09:10:19 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1741021818; x=1741626618; darn=vger.kernel.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=w5p1u51hDu4RIdVFXU2+a7I5FQFTXTH5HXvwkoJ+/VY=; b=wBdp8pcTQsbkSw0R3yXqTYPyUneuv4MOUCAMjIwb8WhKnKWNjpqDO8beaZ5dNokBrg 7nJ2f+oTpzR+d5SfyS5CuMfuUY7HTfU0/SAyRnfIEANpimjJ6Jdna+z2uOu1Aq7XhLR9 rvWFTdwfA4Rre/AxIKJRoIs2LW+xfYMLtZwIyerR9qK4C+QYHqS+9hBmJmhCPUPmpYEj uzWcc5TgK8Ds4um8RhPEuszJt4XDVbS0gva5/+vS6gwZuLrVqu0DPErx29us1O2TI9rP bD9BvaO9LHCJgdUfilsBZ3URRpf+aEmKZADnSsJ00EiRK/sNLIZqpenY+8RN0I1ktrqT 5B1Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741021818; x=1741626618; 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=w5p1u51hDu4RIdVFXU2+a7I5FQFTXTH5HXvwkoJ+/VY=; b=QnjNzC/fUJXAgZxl43kYot7jexRxuVX95NlsOcQPo3rHowKDBPkVqNJ4VOc8jq+eGy u9fl9j8ryRkt1xrsKN/7lRIdGnRUmyxxvWryhqpMfNtuMaIHow3btRQbrs0kWrtSreom tFA9d/PaPO7FxO/sOeLpQ11DasT65ugKOSd1rCw0uT4s6/Fv1tlvcqGBKfTT/k4YbUYr W1enjHsZXwjOFrXHBl7DxIhXzrsQZssZFvAeGep8wh7y0Lgg4OB6DYy8w1roqqXXfb4J Z2QtYb0DNLU3XNUyWgSe+peY/MWdJQisqB8mBp7TKHPIoaWT9GZe6Siws7hPXNyZVLCv wvAw== X-Gm-Message-State: AOJu0YxQunmMGz+X3GzCjhK4159DowZnrTTGUP6P5uR3Xh/icmYnUSXJ 2hdGDb4EhZ7KuKKTgoF6517lEtZnLJ4jbzajjHFXSuvDgbkdCoqRDPvvvhopkMRcRGFWSWrMH0J Zmjk+LMYVlKAxz/qBg8W/XU+KUlk/hRkAzkpgLWaXftS3KhtnT7v18gT+izrxvHHBCbqBh3qq/q YTkdPwiW7EzILbJoAtGGWZAu4= X-Google-Smtp-Source: AGHT+IHrIQRTSbIxQusEzSVfIPDJzKXN0UjZRRQHhWJRv/ncbjwRbNznaVOzH4GMAzYPY56lQvuMR1QBGw== X-Received: from wre13.prod.google.com ([2002:a05:6000:4b0d:b0:390:e0e3:e8cd]) (user=tabba job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6000:186d:b0:391:13ef:1b35 with SMTP id ffacd0b85a97d-39113ef1da9mr1259620f8f.29.1741021817721; Mon, 03 Mar 2025 09:10:17 -0800 (PST) Date: Mon, 3 Mar 2025 17:10:05 +0000 In-Reply-To: <20250303171013.3548775-1-tabba@google.com> Precedence: bulk X-Mailing-List: kvm@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: 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-2-tabba@google.com> Subject: [PATCH v5 1/9] mm: Consolidate freeing of typed folios on final folio_put() 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 Some folio types, such as hugetlb, handle freeing their own folios. Moreover, guest_memfd will require being notified once a folio's reference count reaches 0 to facilitate shared to private folio conversion, without the folio actually being freed at that point. As a first step towards that, this patch consolidates freeing folios that have a type. The first user is hugetlb folios. Later in this patch series, guest_memfd will become the second user of this. Suggested-by: David Hildenbrand Acked-by: Vlastimil Babka Acked-by: David Hildenbrand Signed-off-by: Fuad Tabba --- include/linux/page-flags.h | 15 +++++++++++++++ mm/swap.c | 23 ++++++++++++++++++----- 2 files changed, 33 insertions(+), 5 deletions(-) diff --git a/include/linux/page-flags.h b/include/linux/page-flags.h index 36d283552f80..6dc2494bd002 100644 --- a/include/linux/page-flags.h +++ b/include/linux/page-flags.h @@ -953,6 +953,21 @@ static inline bool page_has_type(const struct page *page) return page_mapcount_is_type(data_race(page->page_type)); } +static inline int page_get_type(const struct page *page) +{ + return page->page_type >> 24; +} + +static inline bool folio_has_type(const struct folio *folio) +{ + return page_has_type(&folio->page); +} + +static inline int folio_get_type(const struct folio *folio) +{ + return page_get_type(&folio->page); +} + #define FOLIO_TYPE_OPS(lname, fname) \ static __always_inline bool folio_test_##fname(const struct folio *folio) \ { \ diff --git a/mm/swap.c b/mm/swap.c index fc8281ef4241..47bc1bb919cc 100644 --- a/mm/swap.c +++ b/mm/swap.c @@ -94,6 +94,19 @@ static void page_cache_release(struct folio *folio) unlock_page_lruvec_irqrestore(lruvec, flags); } +static void free_typed_folio(struct folio *folio) +{ + switch (folio_get_type(folio)) { +#ifdef CONFIG_HUGETLBFS + case PGTY_hugetlb: + free_huge_folio(folio); + return; +#endif + default: + WARN_ON_ONCE(1); + } +} + void __folio_put(struct folio *folio) { if (unlikely(folio_is_zone_device(folio))) { @@ -101,8 +114,8 @@ void __folio_put(struct folio *folio) return; } - if (folio_test_hugetlb(folio)) { - free_huge_folio(folio); + if (unlikely(folio_has_type(folio))) { + free_typed_folio(folio); return; } @@ -966,13 +979,13 @@ void folios_put_refs(struct folio_batch *folios, unsigned int *refs) if (!folio_ref_sub_and_test(folio, nr_refs)) continue; - /* hugetlb has its own memcg */ - if (folio_test_hugetlb(folio)) { + if (unlikely(folio_has_type(folio))) { + /* typed folios have their own memcg, if any */ if (lruvec) { unlock_page_lruvec_irqrestore(lruvec, flags); lruvec = NULL; } - free_huge_folio(folio); + free_typed_folio(folio); continue; } folio_unqueue_deferred_split(folio); 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: 13999240 Received: from mail-wm1-f74.google.com (mail-wm1-f74.google.com [209.85.128.74]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BCB1E22E410 for ; Mon, 3 Mar 2025 17:10:21 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.74 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741021823; cv=none; b=G3+2yUiTDVrclwhLSDY+BuqMzK6mmOoMzT6CJqQL9tdJIJTwpr7vZcQLR+jA8S3eUAnAm9BVHrT5eN64WOCfNOS0bgGOADUtg0Ck7os1XZBeFZIobVEYWZDehuj/pkKCdYDATn/ZnQwmQHhQwcw5WnQwDHcUZQTJiPA3pE0CvlQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741021823; c=relaxed/simple; bh=28EFBKCZw3l6FNCPthRE40BpPOj+wO1/hWE45k0kfu8=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=O3hy+/H7XOBepUOF6DjZozbuiBaFU7DXeHZOfLulwBsxN4pces1f4e4OrVDjxHpaul3QGzS6jLs6aVRLBSekswhVS7f6J7kji9uce2jFPHhj6GmM2FauaeGFTFaEANBrlAda38OgPo9AGMrnDvzl5LbEUPMGS9rEcOzFgTEDPBo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--tabba.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=bbFNaiSa; arc=none smtp.client-ip=209.85.128.74 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--tabba.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="bbFNaiSa" Received: by mail-wm1-f74.google.com with SMTP id 5b1f17b1804b1-4399a5afc95so18161475e9.3 for ; Mon, 03 Mar 2025 09:10:21 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1741021820; x=1741626620; darn=vger.kernel.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=bbFNaiSa8ywRmzNGwqIWi/7Arl3e/avvW9QTmCIl+OD0rvzqAGDrKmJ9a65esS574R 7UZ64Ew3Ks1B9wqomF4x/mJxm55k8ZK03cGa1HWoSCu6hc07v6y3vq6RzJFSb91WBDeD dDRShz1dptcMECBEglHCH0kyMK5lIkxzS8D84QteMm0p5wD4qb4SjI5dv9L133mLACeK 57Lz+7TEsbul1CLex0Z4ilbD6HhKtWZsPIQlqNxZ91fKl3WYTxpSRr23peCNiHm93jlt B/VzyPkfGPw1joUHYpdzsvxJjRqjNRNXOYNgdhdtrbpA4nbvKNFGu3VPKVmsZSzR2IzO 5ONw== 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=GnMpa0I9JbdW3zS5p/m0vmTdZThkBSjmkxGXXffCXlRCK6Mu23Zq0Qn53FtgjL+JX8 tTTBv0jmCiSIEXSoKnp4vYP39grE5EtSVnqvZ9e/TRaxSEJZg2G+sLBvO9ri4HUvLRdj K85+GsPiPYqC/11oY9/0I2OMLjCJ3Jt5lMBNSNC/vqCkLA5Zsjlxl2Mw5pn3udayma0h H1SbNJg615MZsSr25QfLzAEF/7K7nDqjn0GZQ4ZMr4InVHzyAyHotdCAFxdct1re2G6I xti8pxiW5fOfk3juT0BmPaEsKxM5XpEYGCTlK06a86iGxfUJugFuJk0vsxnKMyc10Tot c5Kg== X-Gm-Message-State: AOJu0Yzyp+lTwQm7fwDEfDEKaEBbobuP2NABUoR9k+g1rXYMipUGZimi y1S//3jg6oLJRn4MfiJ0Zq71eDDSmsYGAzT1AtxHlV+rCLCIx1Hq2iHQAYmejQMTMvmelTLU5LN A/eCZjozgjxumDvPEswcKG/HOq8p7FU39XwjSGGIGeUuoKJbnysgSCDm7C3I6/4WKQs/7V5mVTP nPd2E+k9itY07aMA/KVvHjQJg= 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> Precedence: bulk X-Mailing-List: kvm@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: 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 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 From patchwork Mon Mar 3 17:10:07 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Fuad Tabba X-Patchwork-Id: 13999241 Received: from mail-wr1-f73.google.com (mail-wr1-f73.google.com [209.85.221.73]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D7A8424CEF4 for ; Mon, 3 Mar 2025 17:10:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.73 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741021825; cv=none; b=P3aD5SmqEKjx3jhwxzTg0EZoIlrU8OvcBN4AdU1VuRRmJjHLmop+cUy60xt6WNPyHYwC8dHirwqFOQxl1JXVHcNIFostU6fBAiQ9yQDIB1B/zgjs+dz5wps3ruj/OqTe4lQwPsBZFgi3dMJglust4NNQIqH5nR3dbcZrzt8pqKY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741021825; c=relaxed/simple; bh=5q3op/vr/0aA73x90j/SW+hw8Vc/Uz7wBgQMLMPuxSk=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=QQJDjfIJ+s0qJsPOLjxkHrPB5gOoQkIuBKOvNDj/F07igpekqSTsyy8yJXCdEeAl4iWnBu1VIWq9QMF6DhHIrq6d/F6I6QnYCMc8y3pfGwW5FJ/W+o/tRKuZXrkV4BdAAZlovSVzytKPXIDbIUY2uLoSfZ1J27OWqhNlxAbmkoE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--tabba.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=RdYlOTPR; arc=none smtp.client-ip=209.85.221.73 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--tabba.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="RdYlOTPR" Received: by mail-wr1-f73.google.com with SMTP id ffacd0b85a97d-390f11e6fdbso1380485f8f.0 for ; Mon, 03 Mar 2025 09:10:23 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1741021822; x=1741626622; darn=vger.kernel.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=iEl5LoBVGArZ0Hko7f7NcM1d/VPAiCytVB+FzStXmAM=; b=RdYlOTPRfrgeZME3BJZFJJWwJlHtD8li/HPNM/WYlSrnEWzDx7UIMKNvyK6UQK9zeY 2DmOYj7W1FYJXG+woijRyyHpPEfknWpU2Y2mZ/b3dtVuQY/CdRVh66+IitjJlwifVvc2 ZSOjphiu0YvK/XatPiyl7jqEg8zjMDX3N7MrUX3J9B2y/ine7CwsUfzczd8QmE52hf5B K4880r1V6VeGo9AMQTwWGjKpCFJMRv/YZKT5HxF0PuyKW47Iu/7wM4rC+VPFwpXg+yV9 YoRFs4jU/t0xJrT0FXJXEMCIrmhD5CoRs5Rjg8tGXo5tC0dLaGtKV+ptv7eDH6a0hteL OCxQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741021822; x=1741626622; 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=iEl5LoBVGArZ0Hko7f7NcM1d/VPAiCytVB+FzStXmAM=; b=J0IqecPaBxdLySCDRsZzsrZ14lhzMbA6YXSqVz6rR77Zki7x3vlkqXorgQoeV7Go9G WZ1/WVpyuT2j4AplEBL5PXj1mzhChn08OvJKusSH+Z3ui9+JZirkzwFAqU27SYFmkK4V p2road5qcb74efzt2/GDZ7NnS+JecGdIMCSAL8ye23YAmJ12d/Lqim8o6Xjy5SAAXJcN bsSBnwqV817Mfg5+e6IzX0JnLKIWTIJ0rwwangse/+krDzK5SSawFvdo4EzO9UNbNqd4 GLOyfpOdibjd39P7ygzDx9NFirN84kkwv9WB7v1/NLKANFR2wHEGU4mJwgQWgpWOOjZF RLAA== X-Gm-Message-State: AOJu0YyYSaHsv4wqIMFq8q6TKGXcjWaew2YanC3WI6HIOSbVLmIAi6Jw jZSNG1VVoWegXI5hD6k//EjKl7uQzStKxv+B4zRt8TYp97uQugYbj1nBQMdxrXjsiBTFGu5kpSz MYLGEjKzf3aE3gMifTcGfaB5hRa+adGCt5R4zun4BIuZn0O0De6Z8ywiyVM2dK9/kRs4eG4sQtn K5OZIpWJlT2B/UOVGLMTi5QQ0= X-Google-Smtp-Source: AGHT+IHgoYpjT7qfoJb2A88YneKFoylvHGn17OMTHx97hw2eQNXCP3h043pd8jbo3m8XgXFe11agjUZICw== X-Received: from wmgg5.prod.google.com ([2002:a05:600d:5:b0:43b:c99a:4af8]) (user=tabba job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6000:1ac9:b0:391:13ef:1b1b with SMTP id ffacd0b85a97d-39113ef1e57mr1340632f8f.30.1741021821960; Mon, 03 Mar 2025 09:10:21 -0800 (PST) Date: Mon, 3 Mar 2025 17:10:07 +0000 In-Reply-To: <20250303171013.3548775-1-tabba@google.com> Precedence: bulk X-Mailing-List: kvm@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: 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-4-tabba@google.com> Subject: [PATCH v5 3/9] KVM: guest_memfd: Allow host to map 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 Add support for mmap() and fault() for guest_memfd backed memory in the host for VMs that support in-place conversion between shared and private. To that end, this patch adds the ability to check whether the VM type supports in-place conversion, and only allows mapping its memory if that's the case. Also add the KVM capability KVM_CAP_GMEM_SHARED_MEM, which indicates that the VM supports shared memory in guest_memfd, or that the host can create VMs that support shared memory. Supporting shared memory implies that memory can be mapped when shared with the host. This is controlled by the KVM_GMEM_SHARED_MEM configuration option. Signed-off-by: Fuad Tabba --- include/linux/kvm_host.h | 11 ++++ include/uapi/linux/kvm.h | 1 + virt/kvm/guest_memfd.c | 105 +++++++++++++++++++++++++++++++++++++++ virt/kvm/kvm_main.c | 4 ++ 4 files changed, 121 insertions(+) diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index 7788e3625f6d..2d025b8ee20e 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h @@ -728,6 +728,17 @@ static inline bool kvm_arch_has_private_mem(struct kvm *kvm) } #endif +/* + * Arch code must define kvm_arch_gmem_supports_shared_mem if support for + * private memory is enabled and it supports in-place shared/private conversion. + */ +#if !defined(kvm_arch_gmem_supports_shared_mem) && !IS_ENABLED(CONFIG_KVM_PRIVATE_MEM) +static inline bool kvm_arch_gmem_supports_shared_mem(struct kvm *kvm) +{ + return false; +} +#endif + #ifndef kvm_arch_has_readonly_mem static inline bool kvm_arch_has_readonly_mem(struct kvm *kvm) { diff --git a/include/uapi/linux/kvm.h b/include/uapi/linux/kvm.h index 45e6d8fca9b9..117937a895da 100644 --- a/include/uapi/linux/kvm.h +++ b/include/uapi/linux/kvm.h @@ -929,6 +929,7 @@ struct kvm_enable_cap { #define KVM_CAP_PRE_FAULT_MEMORY 236 #define KVM_CAP_X86_APIC_BUS_CYCLES_NS 237 #define KVM_CAP_X86_GUEST_MODE 238 +#define KVM_CAP_GMEM_SHARED_MEM 239 struct kvm_irq_routing_irqchip { __u32 irqchip; diff --git a/virt/kvm/guest_memfd.c b/virt/kvm/guest_memfd.c index b2aa6bf24d3a..4291956b51ae 100644 --- a/virt/kvm/guest_memfd.c +++ b/virt/kvm/guest_memfd.c @@ -312,7 +312,112 @@ 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 +static bool kvm_gmem_offset_is_shared(struct file *file, pgoff_t index) +{ + struct kvm_gmem *gmem = file->private_data; + + /* For now, VMs that support shared memory share all their memory. */ + return kvm_arch_gmem_supports_shared_mem(gmem->kvm); +} + +static vm_fault_t kvm_gmem_fault(struct vm_fault *vmf) +{ + struct inode *inode = file_inode(vmf->vma->vm_file); + struct folio *folio; + vm_fault_t ret = VM_FAULT_LOCKED; + + filemap_invalidate_lock_shared(inode->i_mapping); + + folio = kvm_gmem_get_folio(inode, vmf->pgoff); + if (IS_ERR(folio)) { + switch (PTR_ERR(folio)) { + case -EAGAIN: + ret = VM_FAULT_RETRY; + break; + case -ENOMEM: + ret = VM_FAULT_OOM; + break; + default: + ret = VM_FAULT_SIGBUS; + break; + } + goto out_filemap; + } + + if (folio_test_hwpoison(folio)) { + ret = VM_FAULT_HWPOISON; + goto out_folio; + } + + /* Must be called with folio lock held, i.e., after kvm_gmem_get_folio() */ + if (!kvm_gmem_offset_is_shared(vmf->vma->vm_file, vmf->pgoff)) { + ret = VM_FAULT_SIGBUS; + goto out_folio; + } + + /* + * Only private folios are marked as "guestmem" so far, and we never + * expect private folios at this point. + */ + if (WARN_ON_ONCE(folio_test_guestmem(folio))) { + ret = VM_FAULT_SIGBUS; + goto out_folio; + } + + /* No support for huge pages. */ + if (WARN_ON_ONCE(folio_test_large(folio))) { + ret = VM_FAULT_SIGBUS; + goto out_folio; + } + + if (!folio_test_uptodate(folio)) { + clear_highpage(folio_page(folio, 0)); + kvm_gmem_mark_prepared(folio); + } + + vmf->page = folio_file_page(folio, vmf->pgoff); + +out_folio: + if (ret != VM_FAULT_LOCKED) { + folio_unlock(folio); + folio_put(folio); + } + +out_filemap: + filemap_invalidate_unlock_shared(inode->i_mapping); + + return ret; +} + +static const struct vm_operations_struct kvm_gmem_vm_ops = { + .fault = kvm_gmem_fault, +}; + +static int kvm_gmem_mmap(struct file *file, struct vm_area_struct *vma) +{ + struct kvm_gmem *gmem = file->private_data; + + if (!kvm_arch_gmem_supports_shared_mem(gmem->kvm)) + return -ENODEV; + + if ((vma->vm_flags & (VM_SHARED | VM_MAYSHARE)) != + (VM_SHARED | VM_MAYSHARE)) { + return -EINVAL; + } + + file_accessed(file); + vm_flags_set(vma, VM_DONTDUMP); + vma->vm_ops = &kvm_gmem_vm_ops; + + return 0; +} +#else +#define kvm_gmem_mmap NULL +#endif /* CONFIG_KVM_GMEM_SHARED_MEM */ + static struct file_operations kvm_gmem_fops = { + .mmap = kvm_gmem_mmap, .open = generic_file_open, .release = kvm_gmem_release, .fallocate = kvm_gmem_fallocate, diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index ba0327e2d0d3..38f0f402ea46 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -4830,6 +4830,10 @@ static int kvm_vm_ioctl_check_extension_generic(struct kvm *kvm, long arg) #ifdef CONFIG_KVM_PRIVATE_MEM case KVM_CAP_GUEST_MEMFD: return !kvm || kvm_arch_has_private_mem(kvm); +#endif +#ifdef CONFIG_KVM_GMEM_SHARED_MEM + case KVM_CAP_GMEM_SHARED_MEM: + return !kvm || kvm_arch_gmem_supports_shared_mem(kvm); #endif default: break; From patchwork Mon Mar 3 17:10:08 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Fuad Tabba X-Patchwork-Id: 13999242 Received: from mail-wm1-f74.google.com (mail-wm1-f74.google.com [209.85.128.74]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B3C2D24CEEE for ; Mon, 3 Mar 2025 17:10:25 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.74 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741021827; cv=none; b=AIGFgbIH61qt3f1qeLBpIeAYiXpTN12r8EbQvfZLnkm67p+viWZKOJh0UU/BT5aNFw/pgn45l/s68sjsR2Upqg/RbAhn24IA7XfKRdT7EnEwgpDbq+xw49N9VmZnirB4DlwMBDfrmjhelB/TPKh/3EpSHp6IQONiYlp3eSkxGYI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741021827; c=relaxed/simple; bh=N0sXzR2Z0T8gQ0/uo8e47ns0PZar8CCfouz9iff3wdI=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=HmY2c6vBsrvUNJjBD/o1KGsruYslPeMUd3tBvwvx+dtG6XWfYj/7Z1vvUa9PXTyf0PVUns8oTfODYYlcFnLW4lfoBcnEd5u+FElAftMlN6Qrydfv5khr3uAUzHYS1wAJ1CXJR2nVhntpUogeow/M459YR9t3GmgJkAFexYZyNy8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--tabba.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=ebb0CaRv; arc=none smtp.client-ip=209.85.128.74 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--tabba.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="ebb0CaRv" Received: by mail-wm1-f74.google.com with SMTP id 5b1f17b1804b1-43bbfc1681eso6845715e9.0 for ; Mon, 03 Mar 2025 09:10:25 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1741021824; x=1741626624; darn=vger.kernel.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=4oI5gikAe6u/yzkS2aHXgPYAy14SbTcaxCMtBWbnfZE=; b=ebb0CaRvqmsfe2aFvUrX2s8wlV8TVnzFMLTuieQjTV8asV2vVliP+EOyddfB9EHA37 HciMeDUjnSZUmfQQKVty21lXJ3Peu3PfcsEx49aBvghilSQ+9mCB+cMZZ20gXbtDca0i cI+qvbMGkY8yHfkT6/OVHQfaGcco5RdD9FFdjZdvhCWKEUC21TIoa/dXsAuR8cHjbMkU 1GMUkrf24XE0uyY98FZ4hGnQRgIg+ivrLRCgzhQKNhK8Pcdayd5OPV23sEqJnOiEZpH0 nG63EEGljBppmHhrhg7+H+xb90p69cCQB1LlAG+alMnbmWhwTbQm5tGSXiDp/WGWC0U4 7NMA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741021824; x=1741626624; 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=4oI5gikAe6u/yzkS2aHXgPYAy14SbTcaxCMtBWbnfZE=; b=v6N8X822d7GeXvKQcTx1DdpIIWCoUv7GV0YinLQ9xlOV3xyNMMGmgF1RxwkwK0iTKS 53woNp3NleIfdD3jmvLp8a5xpIcxGR06YuTCQq0Svggn679nEArvAhYhkx2GG0gTk7HK DUn1rMsraici/wHlQkS/3Xc5kvj/9DSpT/Z74ziMikG9H2eGgPtRDbvIkheVeuG7negM QvIdr8Mg8+mK53QUcaFhIkbRgiQlu7OJnO9gbslv877oMnaZNOBwgYBLEEyO6XnD1iAU yvjTdhIzjHYDPgSraLgLA/yJxbxMFrp7RqNBFwJkyZnNXZLzKTZSCtcZ6PNC/x/m3aPW feLg== X-Gm-Message-State: AOJu0YxOjvxbowN1otyggiu6P5OsFKBvUIU36Z/f1z33HFBWMsFF39xA 88w1SUdQzQ8aP6y+b2Xbv7lsGMTN9Dh7rKR7Q109eH0jynfA+QbDOlykjvAqvd6K1ZYn26l2EPJ 6G3lIIBBhO2EhDpaBXb48D+pg0AubloGGKB7/ypuW8bie1BaZSrI+aTW1+lhq0HTrc5if4aEJ65 4Iw3DLb6/hIzFTfbwRfN/znxg= X-Google-Smtp-Source: AGHT+IEpy3ESU/AqUCDzF54FxB9DXrs2FJ78OuUIkcSkZmbkbP/GGc1e3KuLkPNQiVV2tNmdlqnulefRMg== X-Received: from wmcn3-n2.prod.google.com ([2002:a05:600c:c0c3:20b0:439:93e2:dc87]) (user=tabba job=prod-delivery.src-stubby-dispatcher) by 2002:a05:600c:244:b0:43b:c7ad:55f0 with SMTP id 5b1f17b1804b1-43bc7ad56ecmr27090665e9.5.1741021824142; Mon, 03 Mar 2025 09:10:24 -0800 (PST) Date: Mon, 3 Mar 2025 17:10:08 +0000 In-Reply-To: <20250303171013.3548775-1-tabba@google.com> Precedence: bulk X-Mailing-List: kvm@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: 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-5-tabba@google.com> Subject: [PATCH v5 4/9] KVM: guest_memfd: Handle in-place shared memory as guest_memfd backed memory 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 For VMs that allow sharing guest_memfd backed memory in-place, handle that memory the same as "private" guest_memfd memory. This means that faulting that memory in the host or in the guest will go through the guest_memfd subsystem. Note that the word "private" in the name of the function kvm_mem_is_private() doesn't necessarily indicate that the memory isn't shared, but is due to the history and evolution of guest_memfd and the various names it has received. In effect, this function is used to multiplex between the path of a normal page fault and the path of a guest_memfd backed page fault. Signed-off-by: Fuad Tabba --- include/linux/kvm_host.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index 2d025b8ee20e..296f1d284d55 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h @@ -2521,7 +2521,8 @@ static inline bool kvm_mem_is_private(struct kvm *kvm, gfn_t gfn) #else static inline bool kvm_mem_is_private(struct kvm *kvm, gfn_t gfn) { - return false; + return kvm_arch_gmem_supports_shared_mem(kvm) && + kvm_slot_can_be_private(gfn_to_memslot(kvm, gfn)); } #endif /* CONFIG_KVM_GENERIC_MEMORY_ATTRIBUTES */ From patchwork Mon Mar 3 17:10:09 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Fuad Tabba X-Patchwork-Id: 13999243 Received: from mail-wm1-f73.google.com (mail-wm1-f73.google.com [209.85.128.73]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0099524DFF4 for ; Mon, 3 Mar 2025 17:10:27 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.73 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741021829; cv=none; b=JAjRGuXcClVOezBfQzGfoX7FH0ZCplA/q7GE6Y9qfCdEECS0YogKfof6B1gvcuHFcDBQKP9wlcnUXVgIkisa/57+u+8lFaoQYFZIH42Yh72nskneYYvC/6yY4hM/uwd2BnWdaJn4Vi5mjfY9ZzivASogoJurTlVwNDoMZLLQ/+g= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741021829; c=relaxed/simple; bh=DUkn5GbyH5CsPI0C4PwuQxIiwtGgSakNH9hZfIYfgMo=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=H54wRawSXrfR14wCN2xaZGdqu4HtzcR/7dRBDAZOA/sOLtqrIFu38H3OA6KnIWwrRvOGJZvsh6XIsk159L5Q6AVXUxkZN4I/BuKmrSceIc1yeB/NsTTsC8gKb4aHk17x0EpUET5dDc8gjGc+A7i5dPlTj5HBFGsn+tKErBxOEds= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--tabba.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=nX3DUxyR; arc=none smtp.client-ip=209.85.128.73 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--tabba.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="nX3DUxyR" Received: by mail-wm1-f73.google.com with SMTP id 5b1f17b1804b1-43bca561111so1147085e9.3 for ; Mon, 03 Mar 2025 09:10:27 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1741021826; x=1741626626; darn=vger.kernel.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=kBo9cxuckkLxj1P4sgBwDTqSuyzpVc+06bRUFpsmRRk=; b=nX3DUxyRqDrCgDK4MjhAent2+2t0M3XT5ynD2zKc7891zaeMUSLNWmm1sxIGPCZcZI mZdRbC18DZ88V0JxDN3ZpIlbXkQBatZklhDcIprgxoTwFkO0xUx8UJo8EaseJQfVSUhH NT8TiFSZI91ULRBXgLZoFKl32LqxM/DG+DE0CUlF349xp1erKquxA3cFrnPHHG8umSiL XpCBL2ygMnoS1oRN/aq25IE9MHZSdqRurv5Hh/rYzDcAELaQv3RlJhTOhyrCpqZRBGAx 4RLvY0ScfQUzKcKmOoH80wz8/uvW9i2z+2Gk3VX580fpcr5MKhE9Ey0mbK1pYljjnqok Xr8w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741021826; x=1741626626; 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=kBo9cxuckkLxj1P4sgBwDTqSuyzpVc+06bRUFpsmRRk=; b=VuFflI4j53D3VcykZUXZbdDLckNu6dFLNOoGXRjz+V+gn6QrXj9mgdY8UqEToFru4I sVCbZ41FJoOgYx9Gz64it1lqtcQrasrJ7ZcYf2iVGwCbMHr5sQQcenejG39Th4gMQ1+z Qn+KlVIP6DO2cELsIoSIa4iFLa7PGSyodeWHPVEPc6LJdI5Z639LabLqEYBoe4ncH2YR BwRRA5j1ErSmKztDlWiPKPixmlQO2B4B/Da4peuatxl0xyiG28YeptHRMlKyb5Bsq6Pb 8OJpmOe+A3CwdJcqB5jRferpOJpE3Euu/t5Y1qLyRTI9GhgbNO2t5aojV61H9d9lJHUf ZVng== X-Gm-Message-State: AOJu0YznsNbdAoikjVw/VJetghpUZTFqsk1Dl3RgP+MQrVwRhGWajfSX lCKyt6ajdOL0QgW+wQgFLGt1gI3Dl0lq6m9BFGmFb0WQAErR823nKqxgKANpFChMMP43gaXktpE ONDGoxQ7UG1TIrYHId1GNxnl60cPO9xgPgXWjqA/hQaId2DDgf7wvIQjaSn68PxixzhBWbnDSA5 DRTFsZFj5f2ctWzdlpDSHbaJA= X-Google-Smtp-Source: AGHT+IEzzWpqEnLXSXMECYOpjexIXQkN5OcLraeoWVVOWbC+GmYVuhkSVhxjsVgVJQAszWAWjCT5GaMLGQ== X-Received: from wmqa13.prod.google.com ([2002:a05:600c:348d:b0:439:64f9:d801]) (user=tabba job=prod-delivery.src-stubby-dispatcher) by 2002:a05:600c:1f89:b0:439:96b2:e8f with SMTP id 5b1f17b1804b1-43bb4550794mr52549605e9.28.1741021826102; Mon, 03 Mar 2025 09:10:26 -0800 (PST) Date: Mon, 3 Mar 2025 17:10:09 +0000 In-Reply-To: <20250303171013.3548775-1-tabba@google.com> Precedence: bulk X-Mailing-List: kvm@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: 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-6-tabba@google.com> Subject: [PATCH v5 5/9] KVM: x86: Mark KVM_X86_SW_PROTECTED_VM as supporting guest_memfd shared memory 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 The KVM_X86_SW_PROTECTED_VM type is meant for experimentation and does not have any underlying support for protected guests. This makes it a good candidate for testing mapping shared memory. Therefore, when the kconfig option is enabled, mark KVM_X86_SW_PROTECTED_VM as supporting shared memory. This means that this memory is considered by guest_memfd to be shared with the host, with the possibility of in-place conversion between shared and private. This allows the host to map and fault in guest_memfd memory belonging to this VM type. Signed-off-by: Fuad Tabba --- arch/x86/include/asm/kvm_host.h | 5 +++++ arch/x86/kvm/Kconfig | 3 ++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h index 0b7af5902ff7..c6e4925bdc8a 100644 --- a/arch/x86/include/asm/kvm_host.h +++ b/arch/x86/include/asm/kvm_host.h @@ -2245,8 +2245,13 @@ void kvm_configure_mmu(bool enable_tdp, int tdp_forced_root_level, #ifdef CONFIG_KVM_PRIVATE_MEM #define kvm_arch_has_private_mem(kvm) ((kvm)->arch.has_private_mem) + +#define kvm_arch_gmem_supports_shared_mem(kvm) \ + (IS_ENABLED(CONFIG_KVM_GMEM_SHARED_MEM) && \ + ((kvm)->arch.vm_type == KVM_X86_SW_PROTECTED_VM)) #else #define kvm_arch_has_private_mem(kvm) false +#define kvm_arch_gmem_supports_shared_mem(kvm) false #endif #define kvm_arch_has_readonly_mem(kvm) (!(kvm)->arch.has_protected_state) diff --git a/arch/x86/kvm/Kconfig b/arch/x86/kvm/Kconfig index ea2c4f21c1ca..22d1bcdaad58 100644 --- a/arch/x86/kvm/Kconfig +++ b/arch/x86/kvm/Kconfig @@ -45,7 +45,8 @@ config KVM_X86 select HAVE_KVM_PM_NOTIFIER if PM select KVM_GENERIC_HARDWARE_ENABLING select KVM_GENERIC_PRE_FAULT_MEMORY - select KVM_GENERIC_PRIVATE_MEM if KVM_SW_PROTECTED_VM + select KVM_PRIVATE_MEM if KVM_SW_PROTECTED_VM + select KVM_GMEM_SHARED_MEM if KVM_SW_PROTECTED_VM select KVM_WERROR if WERROR config KVM From patchwork Mon Mar 3 17:10:10 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Fuad Tabba X-Patchwork-Id: 13999244 Received: from mail-wm1-f74.google.com (mail-wm1-f74.google.com [209.85.128.74]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id DD05424E4C7 for ; Mon, 3 Mar 2025 17:10:29 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.74 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741021831; cv=none; b=kOXLzkEytBiTkmx4AqQ40cIsh6gftDFHGrQw3tRVHKBZSaYcBjlPFRfgwoBOhLKbr2Bm7NjRSMPqWugHO1WqDyxe9t9OmCtOLt4OpMLUYxdFavKbXpxwG1faZrXYdN8ocRz1Qrg8QoBFHj3J47HbZB+rq/1oQsGBrgtuGFjg//o= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741021831; c=relaxed/simple; bh=1cHCATkOU7kAcjbAu4EXi1pUFvndj0xVj7tS8IfkgcY=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=YzvPbJfMEneFrPYRKcq0Kvl1Xi4q2of9I565l4o8qr+S6VcIDWjeDVVQSsePOawtbZuMPJCnlRootBfobMdQY2b4ub5xVEYT7FzXMzP2KjO8Gbk7lq0J2584Egss79G9JbBBi/p2u0GjUviychd+I1smBe5DHDzi1Nuv/Ij/11Y= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--tabba.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=Z60HpV93; arc=none smtp.client-ip=209.85.128.74 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--tabba.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="Z60HpV93" Received: by mail-wm1-f74.google.com with SMTP id 5b1f17b1804b1-43ba50406fcso27986215e9.3 for ; Mon, 03 Mar 2025 09:10:29 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1741021828; x=1741626628; darn=vger.kernel.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=eGgo65KrsUc27GFmFSac9JDxcDr3yyxu9F6SQNqcVKk=; b=Z60HpV93AI72bzjhXmrcLinDSRBoylc2W/jPfxAdYN0Pi1M6x6e2bzC6WRQbUwpukF tLIvACkbFbbsSnT9U1HRgyaq0N8qA1t6nTXOkER/sFnkeUBmAew8Bi1nTjnG8o6SQZxS A/sfNGOO+g2ywT7GZ8z+Ol48BYzNOlrVhwFWGqVlFLAKkaBWF6WyRt3EBKvNmL2WnW2K qxTgzRaFuQD5R0hzjElknmu/yRCql3/6QvEhVEBKNkULRhfw0256C9nuMuMe0AlNiPdA SQxZBlPFdXoN1dQTlKuPSbi0j2xuDD8FUYCjeG17IfmLoutF/HTyYaSEE7xN6t3JpTOS bDzw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741021828; x=1741626628; 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=eGgo65KrsUc27GFmFSac9JDxcDr3yyxu9F6SQNqcVKk=; b=DdBynbSb5UXz5HD/6pmAvWTo50ZK2iu4DDFppTgo+4tagT5tV2kEbN2sIcFJYW38lS Lv6Ldu0N70h/KyTFbMGtNPCgpDEPJCUqDS6Xp1kgvmwiB+/WdiLxmlYEuPpDdRNz/BMN HC9m1znlB69Bq6LMNvezd+shUw5hl5qjdZ/lNOLMwTMRd9fs7HYcS9IWgYl2MosWsxuy 3Dpd9UP0WWMagvUrccQnj7GqyA5Af9UDjeUrnsCqlEmOURrvToVeroULYA7B9tFN3uRh H36Ce45RO4uVKjpek8WoHSuCH5B+EfY+mWC/0uDQO2mINumx0rdj7pwGOEbcN2pRwy+s rLtw== X-Gm-Message-State: AOJu0YwFhSl0ehS1/h1xkGw5jiB9wDMQYJUOzYtGAAzVBp15PrWH9kXo tawDXc0SNbDh8NQVr/Zsfo+dVSLleGxbG8uKucZruG+/G41Yf+kGt7SbMJsWsJFlnQzA9bz0Z/a FoccKM/Q4oqcaf5nSeWNObnCuxUQ6c9QGgnEwQ8t1OT9mzURIixyR7qO8WZl4Z8fhvTkI016N5+ RcpQmsUpKNsZQNcf8FcJr+0oo= X-Google-Smtp-Source: AGHT+IEzTL2DCjgOiyb3Cw1M14HJjX54cJX0QrxcjGlJF7HY9SJWIHrxMRrLYT+9PiOpxfffVqhEaRBMeg== X-Received: from wmbbd15.prod.google.com ([2002:a05:600c:1f0f:b0:43b:c4f0:4c2f]) (user=tabba job=prod-delivery.src-stubby-dispatcher) by 2002:a05:600c:5122:b0:439:8ef6:5782 with SMTP id 5b1f17b1804b1-43ba6703c4amr121624595e9.10.1741021828083; Mon, 03 Mar 2025 09:10:28 -0800 (PST) Date: Mon, 3 Mar 2025 17:10:10 +0000 In-Reply-To: <20250303171013.3548775-1-tabba@google.com> Precedence: bulk X-Mailing-List: kvm@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: 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-7-tabba@google.com> Subject: [PATCH v5 6/9] KVM: arm64: Refactor user_mem_abort() calculation of force_pte 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 To simplify the code and to make the assumptions clearer, refactor user_mem_abort() by immediately setting force_pte to true if the conditions are met. Also, remove the comment about logging_active being guaranteed to never be true for VM_PFNMAP memslots, since it's not technically correct right now. No functional change intended. Signed-off-by: Fuad Tabba --- arch/arm64/kvm/mmu.c | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/arch/arm64/kvm/mmu.c b/arch/arm64/kvm/mmu.c index 1f55b0c7b11d..887ffa1f5b14 100644 --- a/arch/arm64/kvm/mmu.c +++ b/arch/arm64/kvm/mmu.c @@ -1460,7 +1460,7 @@ static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa, bool fault_is_perm) { int ret = 0; - bool write_fault, writable, force_pte = false; + bool write_fault, writable; bool exec_fault, mte_allowed; bool device = false, vfio_allow_any_uc = false; unsigned long mmu_seq; @@ -1472,6 +1472,7 @@ static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa, gfn_t gfn; kvm_pfn_t pfn; bool logging_active = memslot_is_logging(memslot); + bool force_pte = logging_active || is_protected_kvm_enabled(); long vma_pagesize, fault_granule; enum kvm_pgtable_prot prot = KVM_PGTABLE_PROT_R; struct kvm_pgtable *pgt; @@ -1521,16 +1522,10 @@ static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa, return -EFAULT; } - /* - * logging_active is guaranteed to never be true for VM_PFNMAP - * memslots. - */ - if (logging_active || is_protected_kvm_enabled()) { - force_pte = true; + if (force_pte) vma_shift = PAGE_SHIFT; - } else { + else vma_shift = get_vma_page_shift(vma, hva); - } switch (vma_shift) { #ifndef __PAGETABLE_PMD_FOLDED From patchwork Mon Mar 3 17:10:11 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Fuad Tabba X-Patchwork-Id: 13999245 Received: from mail-wr1-f73.google.com (mail-wr1-f73.google.com [209.85.221.73]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0208F24F59B for ; Mon, 3 Mar 2025 17:10:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.73 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741021833; cv=none; b=L4bKnvUDBo4IhZpFOz0g1kT+QFxBHoaAo8TUCFqQDbg/3SIt5NgS3YVhfPEWSEAYmDaWU8rA4rkoNBxXdrtfJOpp2KHRYQIW4FpyEMtTtmjBhwkh6m5HNJ+A3uXWd8pvF75GanQLVMu1c1GUo0Ufk2hrkvvSJDy/zdMIdZUsvHY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741021833; c=relaxed/simple; bh=RsQwq313gjrcolwwWOK6tAbBz5LwEBOlBhOr6d860Ig=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=ERfs0DroGgY8AIuyBS/aruRap0HDcLAuSJAVDzrjObbceYBuFsYbXSHbQUJzmTs7Y+vN3nXAzqzZJnnpGDbJ0By/ZYToAEpTHdP/l2avJtqtgYYaRFfgHSxWFRv8jwQYPbkxRvLoISr0i5Vic5KButNFpHCEjRHtWRZwG8KmAP8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--tabba.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=Mdb6B8rB; arc=none smtp.client-ip=209.85.221.73 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--tabba.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="Mdb6B8rB" Received: by mail-wr1-f73.google.com with SMTP id ffacd0b85a97d-390f729efacso902240f8f.0 for ; Mon, 03 Mar 2025 09:10:31 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1741021830; x=1741626630; darn=vger.kernel.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=gt/riWGcUGRHcZwRoC2V1jTyAk/j0KNMZMVzsat7B0s=; b=Mdb6B8rBvzysyCoUk6IBIaAhKifD+FVXv70ffyU8cHxSgPuT58LfXdJHejQLaYakDe QC5kJffNMK8vt2MEyhIpRpsAcS4VfXos0mMz61WgHRixzIOmtG0pOQp7vM4tFcVA2Gu9 As+NldCpqyEY96Rv1WE95g2mJ35Qvl+b9/tonveko7+r500s722Cj2v1v2TbN/SVPTOj 2r2ri9lL4HFj4DFZxti2fp/gnlPpzyGtPvWGOOGROhIBPjt1kWRicjhtAKwZukvlPr0U idyRSVqemelYOHZSKJBAxyMGIseIClCOZHRDVnU4hKYntRB055C5Dr39TXpqoSYshBrX sOzg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741021830; x=1741626630; 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=gt/riWGcUGRHcZwRoC2V1jTyAk/j0KNMZMVzsat7B0s=; b=wytVK/1VXBcNMK40HxglVGquIOlQxTgKSRGtvTglaXyRMsXed+s9vIOp9l7ro0gn0/ 28aQVaqoHGo0zeOK2rTR5R60cwOjbbMMA4plzGnl35PGQG6KvkppJvXjpbePJ/f8ISpj r4FEtbIq47zLT/BWxIXINjQNsF3v7tRxskQWffGrpiwI28P9ELY0zM5S/j+ogaB2/see kUVNdCS4K8hbQUoN6mNVlFRzYnNgdfxvC3MOzai04iTDHIB7rcURARHDpihGChPNFeRz ZSlzMrxRET9dUSdXKtU5Jy5J9QzcQn7zF49z/t54wpqQVvWqtf/0OgOd7mH7Hf9AKWuF JcTg== X-Gm-Message-State: AOJu0YzyemVRawa+lw3d6Z0upSquOf5Qq7pzD0wFA55/+qZv4iy7m7rz XwUr28+QGIYLocOYUDPBIjgInV9Qx/qhNM/qShdjMjWjmGkBE2I9ssw9j6IPDZXOlR7rbSar1bi jgmLdfzV3rSBhXd7vOffAzcaICpAAbXOhOxQLPYp2axG52cIShivjZnstOlspUy1ojFIsEiMLub pMupvxF2l+rWc3EEqjSBlK9NM= X-Google-Smtp-Source: AGHT+IHjUvSjd+E6xvwns/9W7bCh3g1PvhkarhqtlRtOoo2/O/7/4oOGG+YV5YIkmlaYkfIS1yNvw3pbbA== X-Received: from wmbfk7.prod.google.com ([2002:a05:600c:cc7:b0:43b:bfff:e091]) (user=tabba job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6000:4023:b0:390:fb2b:62bc with SMTP id ffacd0b85a97d-390fb2b634dmr8086880f8f.23.1741021830280; Mon, 03 Mar 2025 09:10:30 -0800 (PST) Date: Mon, 3 Mar 2025 17:10:11 +0000 In-Reply-To: <20250303171013.3548775-1-tabba@google.com> Precedence: bulk X-Mailing-List: kvm@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: 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-8-tabba@google.com> Subject: [PATCH v5 7/9] KVM: arm64: Handle guest_memfd()-backed guest page faults 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 Add arm64 support for handling guest page faults on guest_memfd backed memslots. For now, the fault granule is restricted to PAGE_SIZE. Signed-off-by: Fuad Tabba --- arch/arm64/kvm/mmu.c | 65 +++++++++++++++++++++++++++------------- include/linux/kvm_host.h | 5 ++++ virt/kvm/kvm_main.c | 5 ---- 3 files changed, 50 insertions(+), 25 deletions(-) diff --git a/arch/arm64/kvm/mmu.c b/arch/arm64/kvm/mmu.c index 887ffa1f5b14..adb0681fc1c6 100644 --- a/arch/arm64/kvm/mmu.c +++ b/arch/arm64/kvm/mmu.c @@ -1454,6 +1454,30 @@ static bool kvm_vma_mte_allowed(struct vm_area_struct *vma) return vma->vm_flags & VM_MTE_ALLOWED; } +static kvm_pfn_t faultin_pfn(struct kvm *kvm, struct kvm_memory_slot *slot, + gfn_t gfn, bool write_fault, bool *writable, + struct page **page, bool is_private) +{ + kvm_pfn_t pfn; + int ret; + + if (!is_private) + return __kvm_faultin_pfn(slot, gfn, write_fault ? FOLL_WRITE : 0, writable, page); + + *writable = false; + + ret = kvm_gmem_get_pfn(kvm, slot, gfn, &pfn, page, NULL); + if (!ret) { + *writable = !memslot_is_readonly(slot); + return pfn; + } + + if (ret == -EHWPOISON) + return KVM_PFN_ERR_HWPOISON; + + return KVM_PFN_ERR_NOSLOT_MASK; +} + static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa, struct kvm_s2_trans *nested, struct kvm_memory_slot *memslot, unsigned long hva, @@ -1461,19 +1485,20 @@ static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa, { int ret = 0; bool write_fault, writable; - bool exec_fault, mte_allowed; + bool exec_fault, mte_allowed = false; bool device = false, vfio_allow_any_uc = false; unsigned long mmu_seq; phys_addr_t ipa = fault_ipa; struct kvm *kvm = vcpu->kvm; - struct vm_area_struct *vma; + struct vm_area_struct *vma = NULL; short vma_shift; void *memcache; - gfn_t gfn; + gfn_t gfn = ipa >> PAGE_SHIFT; kvm_pfn_t pfn; bool logging_active = memslot_is_logging(memslot); - bool force_pte = logging_active || is_protected_kvm_enabled(); - long vma_pagesize, fault_granule; + bool is_gmem = kvm_mem_is_private(kvm, gfn); + bool force_pte = logging_active || is_gmem || is_protected_kvm_enabled(); + long vma_pagesize, fault_granule = PAGE_SIZE; enum kvm_pgtable_prot prot = KVM_PGTABLE_PROT_R; struct kvm_pgtable *pgt; struct page *page; @@ -1510,16 +1535,22 @@ static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa, return ret; } + mmap_read_lock(current->mm); + /* * Let's check if we will get back a huge page backed by hugetlbfs, or * get block mapping for device MMIO region. */ - mmap_read_lock(current->mm); - vma = vma_lookup(current->mm, hva); - if (unlikely(!vma)) { - kvm_err("Failed to find VMA for hva 0x%lx\n", hva); - mmap_read_unlock(current->mm); - return -EFAULT; + if (!is_gmem) { + vma = vma_lookup(current->mm, hva); + if (unlikely(!vma)) { + kvm_err("Failed to find VMA for hva 0x%lx\n", hva); + mmap_read_unlock(current->mm); + return -EFAULT; + } + + vfio_allow_any_uc = vma->vm_flags & VM_ALLOW_ANY_UNCACHED; + mte_allowed = kvm_vma_mte_allowed(vma); } if (force_pte) @@ -1590,18 +1621,13 @@ static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa, ipa &= ~(vma_pagesize - 1); } - gfn = ipa >> PAGE_SHIFT; - mte_allowed = kvm_vma_mte_allowed(vma); - - vfio_allow_any_uc = vma->vm_flags & VM_ALLOW_ANY_UNCACHED; - /* Don't use the VMA after the unlock -- it may have vanished */ vma = NULL; /* * Read mmu_invalidate_seq so that KVM can detect if the results of - * vma_lookup() or __kvm_faultin_pfn() become stale prior to - * acquiring kvm->mmu_lock. + * vma_lookup() or faultin_pfn() become stale prior to acquiring + * kvm->mmu_lock. * * Rely on mmap_read_unlock() for an implicit smp_rmb(), which pairs * with the smp_wmb() in kvm_mmu_invalidate_end(). @@ -1609,8 +1635,7 @@ static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa, mmu_seq = vcpu->kvm->mmu_invalidate_seq; mmap_read_unlock(current->mm); - pfn = __kvm_faultin_pfn(memslot, gfn, write_fault ? FOLL_WRITE : 0, - &writable, &page); + pfn = faultin_pfn(kvm, memslot, gfn, write_fault, &writable, &page, is_gmem); if (pfn == KVM_PFN_ERR_HWPOISON) { kvm_send_hwpoison_signal(hva, vma_shift); return 0; diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index 296f1d284d55..88efbbf04db1 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h @@ -1882,6 +1882,11 @@ static inline int memslot_id(struct kvm *kvm, gfn_t gfn) return gfn_to_memslot(kvm, gfn)->id; } +static inline bool memslot_is_readonly(const struct kvm_memory_slot *slot) +{ + return slot->flags & KVM_MEM_READONLY; +} + static inline gfn_t hva_to_gfn_memslot(unsigned long hva, struct kvm_memory_slot *slot) { diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index 38f0f402ea46..3e40acb9f5c0 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -2624,11 +2624,6 @@ unsigned long kvm_host_page_size(struct kvm_vcpu *vcpu, gfn_t gfn) return size; } -static bool memslot_is_readonly(const struct kvm_memory_slot *slot) -{ - return slot->flags & KVM_MEM_READONLY; -} - static unsigned long __gfn_to_hva_many(const struct kvm_memory_slot *slot, gfn_t gfn, gfn_t *nr_pages, bool write) { From patchwork Mon Mar 3 17:10:12 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Fuad Tabba X-Patchwork-Id: 13999246 Received: from mail-wm1-f74.google.com (mail-wm1-f74.google.com [209.85.128.74]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4B42724FC03 for ; Mon, 3 Mar 2025 17:10:34 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.74 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741021836; cv=none; b=u3+JjIk5GfMO718bnPgtXw/IEF5deTp3tf1wiUyfzf5ifR5POftjTm9vzgH8HdAXpeGmM+tnP/mihjsfCXDew00rc3N1vCM6aKdfEcxh1rwwTeQ46EQhzxXynwrAZKYDppxWn7B9ZJg6/hDgDMHIqn/qA7M7d2OinCFlQH6z1PQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741021836; c=relaxed/simple; bh=UYRA4bHY9NpuOeOv9r+U7mqBEHtesYiSfuqijojqAkA=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=HX0lJD3MYPk0AGAXA+3qrW+1WznBXNmzvTEGQta08j2AOP3UZ6efcWyi9WbiKsiu/X9Cl+z1RrP/xayQUEj4fbEA09pdav8Zq9+NbwvWfxYzL8GDr+vtjUq9Vy6g9YPelfj/LhvGnbkVo1sYumPXefoc25x9Tj+VtcTWN1VPOLU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--tabba.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=pqS6A9aS; arc=none smtp.client-ip=209.85.128.74 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--tabba.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="pqS6A9aS" Received: by mail-wm1-f74.google.com with SMTP id 5b1f17b1804b1-43943bd1409so34245295e9.3 for ; Mon, 03 Mar 2025 09:10:33 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1741021832; x=1741626632; darn=vger.kernel.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=RV6G8AsPpZM1XsfZjeI6zZRAfM93BJc0/BH0p1ZFFrU=; b=pqS6A9aSOfZNQa2YJbEpRQecb5/N/Fg3GafAHOsUXbZLdRq6DKNQly/Wyxi224WBVF NSBoZyDTfTvxoq3CjVYWcx3/uwpISGrzFy8pOwm9pSn7k8sJ6NlMHCfOZG3bJKlql7z4 0lG8YzljpsGJotwrgGZB8kMV3UJr5/fu1DjvL2J1UGGylbWqjOMVSsqeBDrtiyM1hW4O YnDmXbAnlhqy57SUpJhrVA94tw4p6UhGboREm5MyRFPVEPzFCBdekQEpmdvolFCixvNI GN8XF+5epSP+0vtGUCtz3G0nx+c/K7mbwOLB70p4I0asZ7Cx6WvsR2uLUSIDxwcUPl5A +h4g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741021832; x=1741626632; 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=RV6G8AsPpZM1XsfZjeI6zZRAfM93BJc0/BH0p1ZFFrU=; b=CYE9OuN2oC/c8w59pfweL64TIWFX0CaxO41KNEz0YwljBnGXFI99s91julXWhFkUeX N9xq2Nj+JpWDx6d3ooWPHo45v2oqJJs4qnCjco3RLwHds7XCpzf5CyyOwc2uVOJAVm5F 8YdDl97Gm03gTnKQtg0yn5o4uRiapj79ErV4ThFxcc6ltwz6mcsla0+9GSsxRWNgq6KK tp9UzjdP+x06u0VKMrxNiuW9YO0CBXIoN2y9aygfBCcgqUeDg2u24GOc6e7jieFm4S1i q3ueJR6YjPu5axdPmVXhp57Se3Yp4Ko16xuYqTtV6iTmPSaloGe7l0Qh8CfB9vhkGLxk UvGA== X-Gm-Message-State: AOJu0YysFLqAkySx0K1Z113T9cjb5Z9l9W6WjLCPGXFXsLbImCIGCw0R +IhygM/tm8Yu6pwD7UTHa2QAQABxwP9t3NcjLZUDykJCpy0kuKvmtcB5Llm3mBewnxmhsVqoAy1 qvu+m+pE1YQk58Lfsao+3Mgo/welRQPnsUkF6MmkjAeQWlXtMe0RAqjsuoPlT+0L6WTwtoaNmSd vjncqSZ7prMfyHqeysWWPusAk= X-Google-Smtp-Source: AGHT+IEPkwrqgZz9F0LOCGix+An6bf7Do2qKk7ux4Yk25RiEez6hyNid1EwZjrwsbgErCWJs0vQG+9fB+w== X-Received: from wmbep24.prod.google.com ([2002:a05:600c:8418:b0:434:f1d0:7dc9]) (user=tabba job=prod-delivery.src-stubby-dispatcher) by 2002:a05:600c:478a:b0:43b:c7bb:84ee with SMTP id 5b1f17b1804b1-43bc7bb85bfmr22679895e9.2.1741021832556; Mon, 03 Mar 2025 09:10:32 -0800 (PST) Date: Mon, 3 Mar 2025 17:10:12 +0000 In-Reply-To: <20250303171013.3548775-1-tabba@google.com> Precedence: bulk X-Mailing-List: kvm@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: 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-9-tabba@google.com> Subject: [PATCH v5 8/9] KVM: arm64: Enable mapping guest_memfd in arm64 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 Enable mapping guest_memfd in arm64. For now, it applies to all VMs in arm64 that use guest_memfd. In the future, new VM types can restrict this via kvm_arch_gmem_supports_shared_mem(). Signed-off-by: Fuad Tabba --- arch/arm64/include/asm/kvm_host.h | 10 ++++++++++ arch/arm64/kvm/Kconfig | 1 + 2 files changed, 11 insertions(+) diff --git a/arch/arm64/include/asm/kvm_host.h b/arch/arm64/include/asm/kvm_host.h index d919557af5e5..b3b154b81d97 100644 --- a/arch/arm64/include/asm/kvm_host.h +++ b/arch/arm64/include/asm/kvm_host.h @@ -1543,4 +1543,14 @@ void kvm_set_vm_id_reg(struct kvm *kvm, u32 reg, u64 val); #define kvm_has_s1poe(k) \ (kvm_has_feat((k), ID_AA64MMFR3_EL1, S1POE, IMP)) +static inline bool kvm_arch_has_private_mem(struct kvm *kvm) +{ + return IS_ENABLED(CONFIG_KVM_PRIVATE_MEM); +} + +static inline bool kvm_arch_gmem_supports_shared_mem(struct kvm *kvm) +{ + return IS_ENABLED(CONFIG_KVM_GMEM_SHARED_MEM); +} + #endif /* __ARM64_KVM_HOST_H__ */ diff --git a/arch/arm64/kvm/Kconfig b/arch/arm64/kvm/Kconfig index ead632ad01b4..4830d8805bed 100644 --- a/arch/arm64/kvm/Kconfig +++ b/arch/arm64/kvm/Kconfig @@ -38,6 +38,7 @@ menuconfig KVM select HAVE_KVM_VCPU_RUN_PID_CHANGE select SCHED_INFO select GUEST_PERF_EVENTS if PERF_EVENTS + select KVM_GMEM_SHARED_MEM help Support hosting virtualized guest machines. From patchwork Mon Mar 3 17:10:13 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Fuad Tabba X-Patchwork-Id: 13999247 Received: from mail-wr1-f73.google.com (mail-wr1-f73.google.com [209.85.221.73]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 04FF02500DF for ; Mon, 3 Mar 2025 17:10:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.73 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741021838; cv=none; b=WmbGH0rsBfyq0oke4NIw3Wvw4ILy2dbADm012knSTPg5bufRmKF4LA9Y8LvJVeY58aHq3ScICRwrGJ3tRJ3QiPAEi5lPP4su9SpEhCuecm57KhgMox333QcO18iMiI+A5a8ytjwjp/CSmuisFbEhbjfX0MCFmaNLcSdax5oCa2I= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741021838; c=relaxed/simple; bh=hHukxtvv+DhlvOpnT6JJgLuCaUBAiA8jyPZaBpcbwYI=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=RT2DJoeVhUSFhAMBPYjTJlnOpOPuJbJrsfB1dinWuqH/MQwUbOScvmLBxfbSxLD5Gole1tsW+yn//edLp5UCf4DW6c0qCvV364tEwH7DfiMDWbguewrlArn74i4iEroO/sSwi9p95sVp2GLeiTSPlKqVYkQkNyqQlBiWD9w4/Hc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--tabba.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=C213ZEtX; arc=none smtp.client-ip=209.85.221.73 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--tabba.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="C213ZEtX" Received: by mail-wr1-f73.google.com with SMTP id ffacd0b85a97d-390e003c1easo2129374f8f.1 for ; Mon, 03 Mar 2025 09:10:36 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1741021835; x=1741626635; darn=vger.kernel.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=shxzjltmhVCSEs3XLEEf6Hj2khLkpxaqKL228sddyqU=; b=C213ZEtXEyvOT7om2kBYwZvTyG2f2rRjVduaq9UV7JfVr8UTn1RuuPQmfBdmdo8F6D 6a4UD48fVYtI4+AFwK/jjTjWuqGeAuJUJCcmsNujeVl1dD0LwrdXQL/yokT99Sd145l5 C7HRuhWPvAUp7o1Yuv7lF6QQsPJNJkYjPn4LQejBW7bd6U5REVJCrGsIoM6cSeFGNGcZ 0VL/o8TVGXOvrnNe0jdbVElZyBdJw6rYVmKqs10O2tfnRbw4zJ//RWWgHIL1djEudJOh KZzBn0uda4dTrAIWj95uldgnzz2G28kWsSd0LbIahwpkjzrkm7hRVoqU7yUlZwMDh/ZI zQyw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741021835; x=1741626635; 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=shxzjltmhVCSEs3XLEEf6Hj2khLkpxaqKL228sddyqU=; b=VN3BWl0PmxzHFKPYrYSFK2llzU/k46meTUksdoTG2MaRgOrAWQAczoN8469VP4Kgwm 9IRSgxJdcZeHmK3AsO1QvvarXd4V6lll5TIGgFZFP/sypWKa5L/VALyltOhj/JBX2CtT 0H31maVPwMv2NtY1pkWDjS9mKHtJiaerkxQuwbSKFTteZIbJRUKe0Fc15OSnW5h23p6y xpqHdfvt2DAULQdwpV9AnmeU4u3LJYoZU1nmlsdKjLB6tnJj9PHFYr0s/UpzQX1vk4TR dqb426/pwGAjWoSlha+eJEz4S5cGBfzX3USZItT1izLd5kt1WoHRxJ6+9wGpuMiuPIEA MOQw== X-Gm-Message-State: AOJu0Ywfn3k64oRBx6HJ2EUidguDL4UAO1nxwuJXaOUzZAOBv4e459g+ Cod0aZJX9lYZ7l9CPpSuo4KGvkCu8KZL7ja0Ar1XqW71VIwTuiR/DDstKYJJB1ePhCW3xJp+o9n l/uRrmNwR59dV54O/A9i+PZLkf2c0Y2ExCjiowJgvUHBIr2eShvy7Zg5nyfRMEMW3jiwujOBA9x 2DSXCz17zaStON9OEP3pCTQ8U= X-Google-Smtp-Source: AGHT+IFRshHAVxkzqZnB+ggYu/XSK/78X/FWHRdv+7cCRWE1mXA23VnZ9DwQ8SGznRbx9niCQ37rSqzPuA== X-Received: from wmsd10.prod.google.com ([2002:a05:600c:3aca:b0:439:7e67:ca7b]) (user=tabba job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6000:2c7:b0:390:f0ff:2c10 with SMTP id ffacd0b85a97d-390f0ff30camr10550328f8f.19.1741021834976; Mon, 03 Mar 2025 09:10:34 -0800 (PST) Date: Mon, 3 Mar 2025 17:10:13 +0000 In-Reply-To: <20250303171013.3548775-1-tabba@google.com> Precedence: bulk X-Mailing-List: kvm@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: 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-10-tabba@google.com> Subject: [PATCH v5 9/9] KVM: guest_memfd: selftests: guest_memfd mmap() test when mapping is allowed 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 Expand the guest_memfd selftests to include testing mapping guest memory for VM types that support it. Also, build the guest_memfd selftest for aarch64. Signed-off-by: Fuad Tabba --- tools/testing/selftests/kvm/Makefile.kvm | 1 + .../testing/selftests/kvm/guest_memfd_test.c | 75 +++++++++++++++++-- 2 files changed, 70 insertions(+), 6 deletions(-) diff --git a/tools/testing/selftests/kvm/Makefile.kvm b/tools/testing/selftests/kvm/Makefile.kvm index 4277b983cace..c9a3f30e28dd 100644 --- a/tools/testing/selftests/kvm/Makefile.kvm +++ b/tools/testing/selftests/kvm/Makefile.kvm @@ -160,6 +160,7 @@ TEST_GEN_PROGS_arm64 += coalesced_io_test TEST_GEN_PROGS_arm64 += demand_paging_test TEST_GEN_PROGS_arm64 += dirty_log_test TEST_GEN_PROGS_arm64 += dirty_log_perf_test +TEST_GEN_PROGS_arm64 += guest_memfd_test TEST_GEN_PROGS_arm64 += guest_print_test TEST_GEN_PROGS_arm64 += get-reg-list TEST_GEN_PROGS_arm64 += kvm_create_max_vcpus diff --git a/tools/testing/selftests/kvm/guest_memfd_test.c b/tools/testing/selftests/kvm/guest_memfd_test.c index ce687f8d248f..38c501e49e0e 100644 --- a/tools/testing/selftests/kvm/guest_memfd_test.c +++ b/tools/testing/selftests/kvm/guest_memfd_test.c @@ -34,12 +34,48 @@ static void test_file_read_write(int fd) "pwrite on a guest_mem fd should fail"); } -static void test_mmap(int fd, size_t page_size) +static void test_mmap_allowed(int fd, size_t total_size) { + size_t page_size = getpagesize(); + const char val = 0xaa; + char *mem; + int ret; + int i; + + mem = mmap(NULL, total_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); + TEST_ASSERT(mem != MAP_FAILED, "mmaping() guest memory should pass."); + + memset(mem, val, total_size); + for (i = 0; i < total_size; i++) + TEST_ASSERT_EQ(mem[i], val); + + ret = fallocate(fd, FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE, 0, + page_size); + TEST_ASSERT(!ret, "fallocate the first page should succeed"); + + for (i = 0; i < page_size; i++) + TEST_ASSERT_EQ(mem[i], 0x00); + for (; i < total_size; i++) + TEST_ASSERT_EQ(mem[i], val); + + memset(mem, val, total_size); + for (i = 0; i < total_size; i++) + TEST_ASSERT_EQ(mem[i], val); + + ret = munmap(mem, total_size); + TEST_ASSERT(!ret, "munmap should succeed"); +} + +static void test_mmap_denied(int fd, size_t total_size) +{ + size_t page_size = getpagesize(); char *mem; mem = mmap(NULL, page_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); TEST_ASSERT_EQ(mem, MAP_FAILED); + + mem = mmap(NULL, total_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); + TEST_ASSERT_EQ(mem, MAP_FAILED); } static void test_file_size(int fd, size_t page_size, size_t total_size) @@ -170,19 +206,27 @@ static void test_create_guest_memfd_multiple(struct kvm_vm *vm) close(fd1); } -int main(int argc, char *argv[]) +unsigned long get_shared_type(void) { - size_t page_size; +#ifdef __x86_64__ + return KVM_X86_SW_PROTECTED_VM; +#endif + return 0; +} + +void test_vm_type(unsigned long type, bool is_shared) +{ + struct kvm_vm *vm; size_t total_size; + size_t page_size; int fd; - struct kvm_vm *vm; TEST_REQUIRE(kvm_has_cap(KVM_CAP_GUEST_MEMFD)); page_size = getpagesize(); total_size = page_size * 4; - vm = vm_create_barebones(); + vm = vm_create_barebones_type(type); test_create_guest_memfd_invalid(vm); test_create_guest_memfd_multiple(vm); @@ -190,10 +234,29 @@ int main(int argc, char *argv[]) fd = vm_create_guest_memfd(vm, total_size, 0); test_file_read_write(fd); - test_mmap(fd, page_size); + + if (is_shared) + test_mmap_allowed(fd, total_size); + else + test_mmap_denied(fd, total_size); + test_file_size(fd, page_size, total_size); test_fallocate(fd, page_size, total_size); test_invalid_punch_hole(fd, page_size, total_size); close(fd); + kvm_vm_release(vm); +} + +int main(int argc, char *argv[]) +{ +#ifndef __aarch64__ + /* For now, arm64 only supports shared guest memory. */ + test_vm_type(VM_TYPE_DEFAULT, false); +#endif + + if (kvm_has_cap(KVM_CAP_GMEM_SHARED_MEM)) + test_vm_type(get_shared_type(), true); + + return 0; }