From patchwork Tue Feb 18 17:24:51 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Fuad Tabba X-Patchwork-Id: 13980322 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 7082726FA77 for ; Tue, 18 Feb 2025 17:25:06 +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=1739899509; cv=none; b=FvZX4MbWdVr2Ca6Jr9UrydaKcK/bH/9z4cmmn5ZcmiQwR+OW3vRO0YrtKeW5tRbZtanWJ5+unq30kFWEhrCNJGjIzX99m8pZeI6q9w4PqD+bd8TdakAFXSe0sMeXmfULf0yfyKQnoNtjOe5O4xvISWF7mnZ2ndBwfblJZF6n8Wc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739899509; c=relaxed/simple; bh=43rNizzSVgdeItdPhdTWXMFw0SBkzpnXAqvvl1tjk9g=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=uMl3C8BC4r7GmkSIlx7aptuQhjM1RdCiX9Se5Nm3VyFuVFUlX/4UWMEFTLWDzVH6rwVVrcWDtiGecg1HfzQBi5Uo2wS/CSbMYoeOuEy+iuz7CSBfkdTGe0EBBOcMEsMAb63PgIdeKQI3rfHi/qP74gMkvKjIzWtnGKdcg7mQDJw= 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=gh/Zk4Bl; 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="gh/Zk4Bl" Received: by mail-wm1-f74.google.com with SMTP id 5b1f17b1804b1-43947a0919aso47366475e9.0 for ; Tue, 18 Feb 2025 09:25:06 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1739899505; x=1740504305; 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=uH+fBcfhHBnIgnx24Za2RqEfoW93YGim4l7wHxezgLs=; b=gh/Zk4Bla1GzFHkYWJJyKSVBd9Z7NKOPGstHeZ+cUsLftDBLrBT3HSFW7T5GxViEFf 0N9b5F0q4hHKFXvIPtAxkGMv/mV7uHpAJJ2A8qvpexEXnvr9dbc97fHYHZc74kvw0YYN WGpifiqP3u9OACMp0bIG7lDI+n71/X4XZ4qvEHQF8MazIzl+9eJKPVZZbEvtP3PsmA+/ snphWv8qF6ssD11C4XZujuGnkdZmX+JLOCmr1cxnTUUCXnPa7NqOb2hKJO72gMvdrtfp E7wVc+sESFbrmVU3T7VoCjtxC2tg3KDck1BIU8NmgNH31oj9IZQT/u0B3kj3M0EpHgyi HfPQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1739899505; x=1740504305; 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=uH+fBcfhHBnIgnx24Za2RqEfoW93YGim4l7wHxezgLs=; b=aLsc29ZzFhnH0O/TmJLwoJxl5KkEYua8YoX/AiUeUS9WaKKvISqAkTGsmALmIT6oaY G2U7A5/94lS01FpEMYoJS93QprHYZ00Z3qLphydITlfbM+Ope5UkLOTxW29yejC1evGa +0D0fM1I0/om11CvLcYpU38uzd2wPWFEcwOrGVIl1ZB7KxZWkwNMJeNRYHVD2VAEFlro /uqm2+i6hcaCS94znNpSB6fWNEDpJu40j0L+qvWHnxmjEoRVPo3yScsJa6DwoyB+ezxm /qZ8M7pQgv5CuhAoeDoKlSs1TAa5lIrKBeFvhPDpimNLCS35ucXuv4w6mHetPxErZVer G91A== X-Forwarded-Encrypted: i=1; AJvYcCUjJ66Ly6raaj3ACrhIwmV6Q1KUru3BMjhF+29hYTvNRmUCuC5jUucK7ygToaEY4VyKa54ChUwbak0Zntc3@vger.kernel.org X-Gm-Message-State: AOJu0YzAljxT5U3cps0T1mkSHzigp7EQhiKIEu1Qls3u0LbaWDljHjQU 5sO4S6U6/iGBqX5vrRk5iDgGq8zHDC3pZOeRG241/rh2a+9jsYKvN1uYCp5frSwC2l4NpEdD8A= = X-Google-Smtp-Source: AGHT+IEO+Q4R/pkJYt43fJfT5ZiB8RQT6Y+1MuFVz/324xaxqgmgHccN+PjmLq2lzd6582it0nkgtuGjWw== X-Received: from wmsd12.prod.google.com ([2002:a05:600c:3acc:b0:439:9541:1cf5]) (user=tabba job=prod-delivery.src-stubby-dispatcher) by 2002:a5d:6547:0:b0:38f:2073:14a7 with SMTP id ffacd0b85a97d-38f33f56437mr10419463f8f.47.1739899504782; Tue, 18 Feb 2025 09:25:04 -0800 (PST) Date: Tue, 18 Feb 2025 17:24:51 +0000 In-Reply-To: <20250218172500.807733-1-tabba@google.com> Precedence: bulk X-Mailing-List: linux-arm-msm@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250218172500.807733-1-tabba@google.com> X-Mailer: git-send-email 2.48.1.601.g30ceb7b040-goog Message-ID: <20250218172500.807733-2-tabba@google.com> Subject: [PATCH v4 01/10] 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, 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 Signed-off-by: Fuad Tabba Acked-by: David Hildenbrand --- 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 Tue Feb 18 17:24:52 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Fuad Tabba X-Patchwork-Id: 13980323 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 8DD3E26FDB0 for ; Tue, 18 Feb 2025 17:25:08 +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=1739899510; cv=none; b=VHEVLuJq4JS1rRaQRoNIFOsd8GZuCBfRnu3akDBXhioT2T6YlAxI1gd+7HcxQxH09wFT0dUrYATlXn0FYbj+ojGmu/C1MIJ6TvWa8BgqIzgoaVpzoy21w1Im9SfoaohpKucuznZkI58sYu7Em0lw+Pc2VosiovkN8CgFTn4ZTyw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739899510; c=relaxed/simple; bh=u9WeaqoYpfHKmRmmzcElNWGZqz/3dlVhJ0TSKGp8j+4=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=ALtNs9PB4Cy3VwwtA4Tbt1W/EcAVwLxV9Xq6f9poyhtcDI0N1Jni0GtQE+NciuBbJbuzrVwwvq0aFQ+IntCV33adsfaLo24oEIk+6tG9v58+JvIdL3opHtw0qf1wtqUtrJNqoNcqg8gy7sTwaSFmIGIAqmHJphI3eDbDmFiN4YQ= 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=M81hSJK+; 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="M81hSJK+" Received: by mail-wr1-f73.google.com with SMTP id ffacd0b85a97d-38f36fcf4b3so2183319f8f.1 for ; Tue, 18 Feb 2025 09:25:08 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1739899507; x=1740504307; darn=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=AjftRHL78GvMAxQBgln24N5MOtatVF4iZ/akwpMzsOQ=; b=M81hSJK+Q3sdWgxFFg7/KDKl7c5FavjxZTmh5qYf8B3CBiY73MRawH8fGp487TjXiR ASlSwI2wJSJa/YylPBTq2oELgdnn0dfOI3YcoadzrpV3WCObIzmlsFJEQxvw0oVa6s6Y GVuxxMlNHTG/cm0TG/JSq1Ot59eLXtCVZrA8/Jn1BO9+HmXpZgGBxniJYUwiNmvhM+TN tvHVu5RXE3dnXdsFWrsY3JikmYUlQtCMuNfkJtizyktq6gmcNmEv4uMXJTtwSjPjYDtB ZEJr/pIl3/ismJAVzhqHJ/QRbW/uamTVhIGCVDBogyzxvQ2voLYBNWYzgYEO2QEDLME2 hF1g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1739899507; x=1740504307; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=AjftRHL78GvMAxQBgln24N5MOtatVF4iZ/akwpMzsOQ=; b=CvE0C+YvPvvf/lkGPGLF/cC3BAu4vmXoN9jGYyEPBQaBRQA4fX2n8eC5ddvwb127lv 9Xbczd/Ek8CI0s5VeK7WzbyUE82lQQOn7nKzEFZlTiz3a6ooWShwFJQiiooYivU9RyYU DVk0Ey+9Mo1jV/BVeBN5N8EzRlneeyk81wUdnqDhprymcTm46k8kW0e03II+6RjMnklg W8miXEgc0YGGQLZIz4J6DyO/1t2Ji9r/OYzXwHL1sxTmqdGYiXO5EFZ3+4+KP3ATt+40 to5b6mK2d8Fp8ALxRjFJBfFNeBYhYUIWDa8xyRP+7wspYOgY9NWs7pw3xC9MrpQ+Q303 MEQw== X-Forwarded-Encrypted: i=1; AJvYcCXJTLZzLgbogtpL4jSRPWJL3BlLy/2XYf+y2HWk7F0PkwMPbzgYkclq13vrGHA9szO/g0+PH9YAs4x6fzSd@vger.kernel.org X-Gm-Message-State: AOJu0YzzGuI608OdPeUcjqV6CaUpHBMjedTBVd2WmXKJZosVu3ZXk+K5 i+xZvwn88dnMCYBucy9tbzoDYatjW4woFhrYqZvNJpXKBrN6C2ESxbSPbOeUukpZhXHcRvx6sA= = X-Google-Smtp-Source: AGHT+IGtq1vI9mi82FBNTYUNeT9g08nt9Gn+a8vjX9kYrGKRZeaCmPiZJOk8GXgumjV4Sq5SnZyiJoW2cQ== X-Received: from wmbg4.prod.google.com ([2002:a05:600c:a404:b0:439:9601:298d]) (user=tabba job=prod-delivery.src-stubby-dispatcher) by 2002:a5d:5850:0:b0:38e:90f3:475a with SMTP id ffacd0b85a97d-38f33f55023mr14469841f8f.51.1739899506921; Tue, 18 Feb 2025 09:25:06 -0800 (PST) Date: Tue, 18 Feb 2025 17:24:52 +0000 In-Reply-To: <20250218172500.807733-1-tabba@google.com> Precedence: bulk X-Mailing-List: linux-arm-msm@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250218172500.807733-1-tabba@google.com> X-Mailer: git-send-email 2.48.1.601.g30ceb7b040-goog Message-ID: <20250218172500.807733-3-tabba@google.com> Subject: [PATCH v4 02/10] KVM: guest_memfd: Handle final folio_put() of guest_memfd pages From: Fuad Tabba To: kvm@vger.kernel.org, linux-arm-msm@vger.kernel.org, linux-mm@kvack.org Cc: pbonzini@redhat.com, chenhuacai@kernel.org, mpe@ellerman.id.au, anup@brainfault.org, paul.walmsley@sifive.com, palmer@dabbelt.com, aou@eecs.berkeley.edu, seanjc@google.com, viro@zeniv.linux.org.uk, brauner@kernel.org, willy@infradead.org, akpm@linux-foundation.org, xiaoyao.li@intel.com, yilun.xu@intel.com, chao.p.peng@linux.intel.com, jarkko@kernel.org, amoorthy@google.com, dmatlack@google.com, isaku.yamahata@intel.com, mic@digikod.net, vbabka@suse.cz, vannapurve@google.com, ackerleytng@google.com, mail@maciej.szmigiero.name, david@redhat.com, michael.roth@amd.com, wei.w.wang@intel.com, liam.merwick@oracle.com, isaku.yamahata@gmail.com, kirill.shutemov@linux.intel.com, suzuki.poulose@arm.com, steven.price@arm.com, quic_eberman@quicinc.com, quic_mnalajal@quicinc.com, quic_tsoni@quicinc.com, quic_svaddagi@quicinc.com, quic_cvanscha@quicinc.com, quic_pderrin@quicinc.com, quic_pheragu@quicinc.com, catalin.marinas@arm.com, james.morse@arm.com, yuzenghui@huawei.com, oliver.upton@linux.dev, maz@kernel.org, will@kernel.org, qperret@google.com, keirf@google.com, roypat@amazon.co.uk, shuah@kernel.org, hch@infradead.org, jgg@nvidia.com, rientjes@google.com, jhubbard@nvidia.com, fvdl@google.com, hughd@google.com, jthoughton@google.com, tabba@google.com Before transitioning a guest_memfd folio to unshared, thereby disallowing access by the host and allowing the hypervisor to transition its view of the guest page as private, we need to be sure that the host doesn't have any references to the folio. This patch introduces a new type for guest_memfd folios, which isn't activated in this series but is here as a placeholder and to facilitate the code in the subsequent patch series. This will be used in the future to register a callback that informs the guest_memfd subsystem when the last reference is dropped, therefore knowing that the host doesn't have any remaining references. This patch also introduces the configuration option, KVM_GMEM_SHARED_MEM, which toggles support for mapping guest_memfd shared memory at the host. Signed-off-by: Fuad Tabba Acked-by: Vlastimil Babka Acked-by: David Hildenbrand --- include/linux/kvm_host.h | 4 ++++ include/linux/page-flags.h | 17 +++++++++++++++++ mm/debug.c | 1 + mm/swap.c | 9 +++++++++ virt/kvm/Kconfig | 5 +++++ virt/kvm/guest_memfd.c | 7 +++++++ 6 files changed, 43 insertions(+) diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index f34f4cfaa513..3ad0719bfc4f 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h @@ -2571,4 +2571,8 @@ long kvm_arch_vcpu_pre_fault_memory(struct kvm_vcpu *vcpu, struct kvm_pre_fault_memory *range); #endif +#ifdef CONFIG_KVM_GMEM_SHARED_MEM +void kvm_gmem_handle_folio_put(struct folio *folio); +#endif + #endif diff --git a/include/linux/page-flags.h b/include/linux/page-flags.h index 6dc2494bd002..734afda268ab 100644 --- a/include/linux/page-flags.h +++ b/include/linux/page-flags.h @@ -933,6 +933,17 @@ enum pagetype { PGTY_slab = 0xf5, PGTY_zsmalloc = 0xf6, PGTY_unaccepted = 0xf7, + /* + * guestmem folios are used to back VM memory as managed by guest_memfd. + * Once the last reference is put, instead of freeing these folios back + * to the page allocator, they are returned to guest_memfd. + * + * For now, guestmem will only be set on these folios as long as they + * cannot be mapped to user space ("private state"), with the plan of + * always setting that type once typed folios can be mapped to user + * space cleanly. + */ + PGTY_guestmem = 0xf8, PGTY_mapcount_underflow = 0xff }; @@ -1082,6 +1093,12 @@ FOLIO_TYPE_OPS(hugetlb, hugetlb) FOLIO_TEST_FLAG_FALSE(hugetlb) #endif +#ifdef CONFIG_KVM_GMEM_SHARED_MEM +FOLIO_TYPE_OPS(guestmem, guestmem) +#else +FOLIO_TEST_FLAG_FALSE(guestmem) +#endif + PAGE_TYPE_OPS(Zsmalloc, zsmalloc, zsmalloc) /* diff --git a/mm/debug.c b/mm/debug.c index 8d2acf432385..08bc42c6cba8 100644 --- a/mm/debug.c +++ b/mm/debug.c @@ -56,6 +56,7 @@ static const char *page_type_names[] = { DEF_PAGETYPE_NAME(table), DEF_PAGETYPE_NAME(buddy), DEF_PAGETYPE_NAME(unaccepted), + DEF_PAGETYPE_NAME(guestmem), }; static const char *page_type_name(unsigned int page_type) diff --git a/mm/swap.c b/mm/swap.c index 47bc1bb919cc..241880a46358 100644 --- a/mm/swap.c +++ b/mm/swap.c @@ -38,6 +38,10 @@ #include #include +#ifdef CONFIG_KVM_GMEM_SHARED_MEM +#include +#endif + #include "internal.h" #define CREATE_TRACE_POINTS @@ -101,6 +105,11 @@ static void free_typed_folio(struct folio *folio) case PGTY_hugetlb: free_huge_folio(folio); return; +#endif +#ifdef CONFIG_KVM_GMEM_SHARED_MEM + case PGTY_guestmem: + kvm_gmem_handle_folio_put(folio); + return; #endif default: WARN_ON_ONCE(1); diff --git a/virt/kvm/Kconfig b/virt/kvm/Kconfig index 54e959e7d68f..37f7734cb10f 100644 --- a/virt/kvm/Kconfig +++ b/virt/kvm/Kconfig @@ -124,3 +124,8 @@ config HAVE_KVM_ARCH_GMEM_PREPARE config HAVE_KVM_ARCH_GMEM_INVALIDATE bool depends on KVM_PRIVATE_MEM + +config KVM_GMEM_SHARED_MEM + select KVM_PRIVATE_MEM + depends on !KVM_GENERIC_MEMORY_ATTRIBUTES + bool diff --git a/virt/kvm/guest_memfd.c b/virt/kvm/guest_memfd.c index b2aa6bf24d3a..c6f6792bec2a 100644 --- a/virt/kvm/guest_memfd.c +++ b/virt/kvm/guest_memfd.c @@ -312,6 +312,13 @@ static pgoff_t kvm_gmem_get_index(struct kvm_memory_slot *slot, gfn_t gfn) return gfn - slot->base_gfn + slot->gmem.pgoff; } +#ifdef CONFIG_KVM_GMEM_SHARED_MEM +void kvm_gmem_handle_folio_put(struct folio *folio) +{ + WARN_ONCE(1, "A placeholder that shouldn't trigger. Work in progress."); +} +#endif /* CONFIG_KVM_GMEM_SHARED_MEM */ + static struct file_operations kvm_gmem_fops = { .open = generic_file_open, .release = kvm_gmem_release, From patchwork Tue Feb 18 17:24:53 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Fuad Tabba X-Patchwork-Id: 13980324 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 95190270EAD for ; Tue, 18 Feb 2025 17:25:10 +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=1739899512; cv=none; b=QUkZmC4bUcidPaTA3hVOjLrl7UEwESSwVpypyUH6cmtLk3lHWY8NFZxF0GP6SOn0n4hEHQFSH38IaMgp/yQ71HXeK+xtDDyBqGx+VPVEEyV7dB7s/4iGyo6UnKoOGmGJQmM1GGYOw6tViSUkO7Ef9ZpjAHqm7XYBcox4Hqvycq0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739899512; c=relaxed/simple; bh=Rooflcwn4NQXPC31lj8XKxiQLIgB+Yi/Z7igLXusc1Q=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=co3pce2KqfcMIsN/HcIwVN3flXvpUUSKAg2g/fOcwME0sGqvDm1ZXwYDyV+lEHev1KN5VRXWaljrTV/SBepJOptZgYoKIdIlGpB7YEXoDwG1eK9SkzknmfXPhFo8Hsp/Cb0wUNz9FrzkFOK6sOVRmYNFhq6SYK7UxMXIuygpQHg= 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=hSHBp3GO; 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="hSHBp3GO" Received: by mail-wm1-f74.google.com with SMTP id 5b1f17b1804b1-43935e09897so47917555e9.1 for ; Tue, 18 Feb 2025 09:25:10 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1739899509; x=1740504309; 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=Ja1dbSYeEbtOj/Lq4H8XOfvxJc8Pm73z8vQggxiiAfA=; b=hSHBp3GO/5o+oWZ3FOmjSysseV601biv1VILibsVqxiyWzlrDJVddHfCoDZL6ZO+Md MqEi0Cgs7wrPzwaQUo31a4L01ZuEHzy23NrFred8ViXD8Hsuuk/tCVZmNsR1t+mNYehv 0z6BgzR5zAtVP4XsVGrItD6T1yoyobnnHVHWqTNiSQbOjqGtRt/o6GZD6Yu5mYTGsJef /aaOUbWWIB7IPG8DhiVC/efGnt9PT/HktO1tTDgVQ4AwSdHYoe9funjzP9lH9MgahgyC uZ9F3+6rxbYa/bMGf9/w0YUeEhQw03qnvd/OvvgljMELErXBN2dgrCTGFX8VQSwMcVYa GT4Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1739899509; x=1740504309; 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=Ja1dbSYeEbtOj/Lq4H8XOfvxJc8Pm73z8vQggxiiAfA=; b=FuZ30xIdR9nOle7te3LcUqu31kzYxCMf9XT10Ss+gnfTLZMEH9bW6PmcRAlOyrqNey 95e9F0+IuMi0F9nAJys0uQggXJpR22k1kDZxoaBqyXfzSdIXBe9teUjmY9dfRTQCb08C sx8JJQnY7IQoNw1Gh+eDbYaHFPGqr/sOK9glgiXOdo0KLJ3r7RlpvxgODELJ7cIy8ULp tDKUwrmgmd/5WUvYhdo9WXF2/LlNlTEhbpwMWOBWgQDgguEG3Xywwxn38k2UPzHO9J35 G5AIfgdbcHbyMKSAqT/Bv+A7QnuNYZTSW6RSLjxxTQQ/ffo7sq01yIInKFqu9lzty5vy AT4Q== X-Forwarded-Encrypted: i=1; AJvYcCWBMr5kEX3FrNSnfXOXpVXH09Y+3Y6oYFs4Xd0NvCmEuUIx1TweMKxaXOHO0BJalB7noSEG1LBoPqKPR8Bt@vger.kernel.org X-Gm-Message-State: AOJu0YyosFODpu4nHpMD37crFE19xyGyNH6aQdwQP11P628wxWDWjOjX g9OT+4FLR0FrySGI4Fwcq0JoDV+DpyPSbVCZlX4iujSGWzsGBzPA7mpIcrscL1KrTo6ZdV44rg= = X-Google-Smtp-Source: AGHT+IEk7whKV8qDP3YJYflDIlm8Cb6VQQ/o4v2sTpWwI0tdVBtFPk7h94MV+FENYUw5CL+bP9BAxRH9cQ== X-Received: from wmqe5.prod.google.com ([2002:a05:600c:4e45:b0:439:8333:1efb]) (user=tabba job=prod-delivery.src-stubby-dispatcher) by 2002:a05:600c:1d1e:b0:439:6118:c188 with SMTP id 5b1f17b1804b1-43999dd1dc6mr3930085e9.19.1739899508877; Tue, 18 Feb 2025 09:25:08 -0800 (PST) Date: Tue, 18 Feb 2025 17:24:53 +0000 In-Reply-To: <20250218172500.807733-1-tabba@google.com> Precedence: bulk X-Mailing-List: linux-arm-msm@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250218172500.807733-1-tabba@google.com> X-Mailer: git-send-email 2.48.1.601.g30ceb7b040-goog Message-ID: <20250218172500.807733-4-tabba@google.com> Subject: [PATCH v4 03/10] 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, 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. This behavior is also gated by the configuration option KVM_GMEM_SHARED_MEM. Signed-off-by: Fuad Tabba --- include/linux/kvm_host.h | 11 +++++ virt/kvm/guest_memfd.c | 103 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 114 insertions(+) diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index 3ad0719bfc4f..f9e8b10a4b09 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/virt/kvm/guest_memfd.c b/virt/kvm/guest_memfd.c index c6f6792bec2a..30b47ff0e6d2 100644 --- a/virt/kvm/guest_memfd.c +++ b/virt/kvm/guest_memfd.c @@ -317,9 +317,112 @@ void kvm_gmem_handle_folio_put(struct folio *folio) { WARN_ONCE(1, "A placeholder that shouldn't trigger. Work in progress."); } + +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, From patchwork Tue Feb 18 17:24:54 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Fuad Tabba X-Patchwork-Id: 13980325 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 AFA4C270ECC for ; Tue, 18 Feb 2025 17:25:12 +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=1739899515; cv=none; b=Nr3k4/s9mVfx/w4A5ORLb5w3Df5hTWKS+qhbBcmqE+gwClWS0ES+LMGc4Blu5bK/miSLxHOnUpoFqvDX4k+2Ncp50gKBrEUEtL9yYR/1ZHbvelm1J5UcOGioALKAUNjqkNpFxbgXJhKYC5b28zQZs2vTAqBKbcpodDj/mke31yk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739899515; c=relaxed/simple; bh=3ODvDdD/WM55UKWf+HAM2o9bsLV2oxTsA5di8myj3xk=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=SNVg/mLuekdhSzSbImCic3VmJNKD8wwnTmPpcSJvMnxKUBHxUKb+U3L1wUriFXKYVpz/F1v2NugTivLJJE37Y4HpctRRyul/krbkih5UeJKtoDppBfh1wb//f+Jq6SyJMGv7viS6RKEbBtVgPvcQjZWhnD3yTawj5fRRBLRHRuQ= 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=MdXWdj4+; 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="MdXWdj4+" Received: by mail-wm1-f74.google.com with SMTP id 5b1f17b1804b1-43935bcec74so30154865e9.3 for ; Tue, 18 Feb 2025 09:25:12 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1739899511; x=1740504311; 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=eTW5My6K2OM+Dzwm+PfBz15qR/KnyXT0mlOIBk4Z2/A=; b=MdXWdj4+zOwRmNiIE/H9YcfqVCC8Fu8DdaMmJNwslKuUdOzcM8fPE/bSxEHA9+v8jN DifjfVhpQ8OyKY1fxOjHme0CsbIZT5VJ/JhxvBMJ0ROFlE72klMXu6WEjBTtS6xvvB/G 7ewLOu33btX068oeaWu7M+R6wN0qPPZDtx4ehooUuGEMCE3uzvtWbaX73tgYpE2LJG1X VMNN5efD/SbU1c3+hFK7le/QVkbn5bsRBF3eiJsjYsZbhR12On8e72HutDiPtE/svWwk YaO2Z+U8Ww6GEdhiuf3EM4de01YmnZpbsGcaCSxeOJYkEXzO7q/TTmKuHzFMKEY85w6d xa3A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1739899511; x=1740504311; 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=eTW5My6K2OM+Dzwm+PfBz15qR/KnyXT0mlOIBk4Z2/A=; b=fEMpdk8mBOuzfRxVfrWwwSn36eTIlhqecOBLzKrmjqIJqaLEYEnu5uHFDRG8YxMxU1 zpG8wLh6sF24We5QmAe4iMEKm5f23PH7uSp4C7u7bB/neRA3bGAuNfw5QhnCRHgC7LLa BfcLVlWqHvgHOf90zWDbgDHAQdy3OytZzQum0xLoK/FVhJdwUJxXZFwy6TNfpU69aUqA ZdLolYHK29E+s8+FJi2BOyXV+VpTZ3XqseEYNDU0ewNih98+MiG+PAMNKBUSJ8ehFVLS 11T4ZFOWp4SLZ7HTAXXKX3YadW/G3jfYmxRm6yTNQozBbE5xGlhdgkyP7MVLSVaTh7kM cqIg== X-Forwarded-Encrypted: i=1; AJvYcCXXV+1yEw8PT/cA/RXlo2mE8xWNozyxH+0jaKt3Red6J2FbVXXNL8e0eBKjtkulWlAbe41WGyZZpZRMDlPH@vger.kernel.org X-Gm-Message-State: AOJu0YxKb/DLnm+AFAzXGca36/tHxdUnraAL+Ina14enitcQduAfpzHH /W5xNL/sT9AO7ZdhxTBXxM/8TsxFIWFIhUXJwG2QHBJgvNXT8dXcOK+4CvdcVODEuIXnPnXccQ= = X-Google-Smtp-Source: AGHT+IHuQgBmWKLX/iaLAIhwX+Ygl7SCrjQmYq5mlPdxwxv1m1H3cuEySvE1kherBoZWNYm/GzLxu4kvpQ== X-Received: from wmsd12.prod.google.com ([2002:a05:600c:3acc:b0:439:3df1:f296]) (user=tabba job=prod-delivery.src-stubby-dispatcher) by 2002:a05:600c:1550:b0:439:9377:fa17 with SMTP id 5b1f17b1804b1-4399377fb82mr36630915e9.18.1739899510991; Tue, 18 Feb 2025 09:25:10 -0800 (PST) Date: Tue, 18 Feb 2025 17:24:54 +0000 In-Reply-To: <20250218172500.807733-1-tabba@google.com> Precedence: bulk X-Mailing-List: linux-arm-msm@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250218172500.807733-1-tabba@google.com> X-Mailer: git-send-email 2.48.1.601.g30ceb7b040-goog Message-ID: <20250218172500.807733-5-tabba@google.com> Subject: [PATCH v4 04/10] KVM: guest_memfd: Add KVM capability to check if guest_memfd is shared From: Fuad Tabba To: kvm@vger.kernel.org, linux-arm-msm@vger.kernel.org, linux-mm@kvack.org Cc: pbonzini@redhat.com, chenhuacai@kernel.org, mpe@ellerman.id.au, anup@brainfault.org, paul.walmsley@sifive.com, palmer@dabbelt.com, aou@eecs.berkeley.edu, seanjc@google.com, viro@zeniv.linux.org.uk, brauner@kernel.org, willy@infradead.org, akpm@linux-foundation.org, xiaoyao.li@intel.com, yilun.xu@intel.com, chao.p.peng@linux.intel.com, jarkko@kernel.org, amoorthy@google.com, dmatlack@google.com, isaku.yamahata@intel.com, mic@digikod.net, vbabka@suse.cz, vannapurve@google.com, ackerleytng@google.com, mail@maciej.szmigiero.name, david@redhat.com, michael.roth@amd.com, wei.w.wang@intel.com, liam.merwick@oracle.com, isaku.yamahata@gmail.com, kirill.shutemov@linux.intel.com, suzuki.poulose@arm.com, steven.price@arm.com, quic_eberman@quicinc.com, quic_mnalajal@quicinc.com, quic_tsoni@quicinc.com, quic_svaddagi@quicinc.com, quic_cvanscha@quicinc.com, quic_pderrin@quicinc.com, quic_pheragu@quicinc.com, catalin.marinas@arm.com, james.morse@arm.com, yuzenghui@huawei.com, oliver.upton@linux.dev, maz@kernel.org, will@kernel.org, qperret@google.com, keirf@google.com, roypat@amazon.co.uk, shuah@kernel.org, hch@infradead.org, jgg@nvidia.com, rientjes@google.com, jhubbard@nvidia.com, fvdl@google.com, hughd@google.com, jthoughton@google.com, tabba@google.com 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. Signed-off-by: Fuad Tabba --- include/uapi/linux/kvm.h | 1 + virt/kvm/kvm_main.c | 4 ++++ 2 files changed, 5 insertions(+) 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/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 Tue Feb 18 17:24:55 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Fuad Tabba X-Patchwork-Id: 13980326 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 E1C2F26FA5E for ; Tue, 18 Feb 2025 17:25:14 +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=1739899516; cv=none; b=ihTbKtduSVXa+rrtZ6+yzt8FijUrPEt1VXR4v6xFA8Ja/GFQzFCCAHgTqD4NGEXJsFKSW5KV/AURXteReRdRlGyWei7rIfj9SB5K2FxBX/oVlpkvTMYULH1UXJkovcrQcqFi3weMGPkvgYMJnFI1ad0W4gBNMwCj+oxD1chvhtk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739899516; c=relaxed/simple; bh=mNYbzmjpONWEgttJIZvgUptAcnSe94VpmpCixNC/n8U=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=MN3B88rGzV9piqO+Z+CVTe104PQ2tL/ninNNxPPR5RS1SQDGFX3YA2dMv02gq4iVmgav1gmO1O/Pr9UnrKhKXS9pIQngEyufnZm6QrfOX2n67T6HEDfDFmWnpcDiUvruSj4D2aa9uG4e25hbdUGOE81RWKkP/MAVFHSmj4Yu9LM= 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=Nx/EwAxi; 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="Nx/EwAxi" Received: by mail-wr1-f73.google.com with SMTP id ffacd0b85a97d-38f338525e1so1745463f8f.3 for ; Tue, 18 Feb 2025 09:25:14 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1739899513; x=1740504313; 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=iGoNX/Glm+WMVatJb0FvEqCK9D+bw5+r1sAfGUD7IRg=; b=Nx/EwAxiY2+UQa7+fyGgMNp916DRlxiKZHqf8lF1le50gVKBXRo5dTeqtOytg8By6N Mdku/DjB/TaSqFPePZvmjGqmMyPNCKIzHlMIzJWQe99PSM7ccd7HPwE4KVusatCMe9U4 hKtpX65rJzqXyhUEdg4SIhH5FdKZ4ZE29qttkzR9N/YeanD33tdYwSnqrwRfZrSqJ/Hr NrPsHITesQ3LQxwr/LobqTQPyHJNL8w+Ky2nOvop4Gd+iRDcvr45lvSnwmElcliUbTT+ 6zNi6rLPFqnydWSHL6zshN2B0oCL/57uY6uIJJx8rYea+9CUfy+ZNu/0br7VeMfoxCFO wJqA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1739899513; x=1740504313; 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=iGoNX/Glm+WMVatJb0FvEqCK9D+bw5+r1sAfGUD7IRg=; b=SnHnrbj4w7ZAgrzE7t++/cN2IKkQkue9RsV88t5CO3zSHa0Y6wVkm+XPL/C186IMYX u2nM+4NIcy5978G+kGD1jDqfSjs+/1MNqthdbvW+SHjiFL6gG2P+EBbYXCO92SvXe7MU w1t3V+HMBppoabJvY3Xi0LInovRHb+e3uy8grGnbvJitYpgrAGqdceQVliG2hgq5OnCt jj4fDV9Wyp++uFAK3nam45LEwpfTmXiRCazGRrwEdNqB5MtuqlumCt/MiphmElWoMsWG noWxK7xiqkl9GQ4MnU0dkDSfbEmvJpO/lQHhUcRXMLHmh8iX1DBNfJyZuvJKEEHSFZSS JE6g== X-Forwarded-Encrypted: i=1; AJvYcCXN5DFel673CpqZAwKOmHnjljGQe6SDi2725jBp6umqVWhvOF0V5Dke/Cr0lplQXSKil7s2JrAel24ojvzd@vger.kernel.org X-Gm-Message-State: AOJu0Yza0tipCFXdS2JMWvJaRgEKlP5/wm5tKKjMq034SrRgR0PDBNw6 nDapAMn0yVOqw/D6VJYcLUH4PUaV61Jwp9ljeyMjf2eC2yyv8GueES/XbBaGH62M0CqeK6eK/Q= = X-Google-Smtp-Source: AGHT+IGyVyR6Cc0fgExYmIOuVxu5DOaZXMab5x34lQgOdyuWaPWAIeIyXdXc2E/LoCQ4Y0Nq1mwGNRpbtA== X-Received: from wmbbh16.prod.google.com ([2002:a05:600c:3d10:b0:439:985c:9199]) (user=tabba job=prod-delivery.src-stubby-dispatcher) by 2002:a5d:47c9:0:b0:38f:4493:e274 with SMTP id ffacd0b85a97d-38f4493ffe2mr8630057f8f.54.1739899513086; Tue, 18 Feb 2025 09:25:13 -0800 (PST) Date: Tue, 18 Feb 2025 17:24:55 +0000 In-Reply-To: <20250218172500.807733-1-tabba@google.com> Precedence: bulk X-Mailing-List: linux-arm-msm@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250218172500.807733-1-tabba@google.com> X-Mailer: git-send-email 2.48.1.601.g30ceb7b040-goog Message-ID: <20250218172500.807733-6-tabba@google.com> Subject: [PATCH v4 05/10] 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, 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 f9e8b10a4b09..83f65c910ccb 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 Tue Feb 18 17:24:56 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Fuad Tabba X-Patchwork-Id: 13980327 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 99A43270ED5 for ; Tue, 18 Feb 2025 17:25:16 +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=1739899518; cv=none; b=oZFz3DJb62J2ix2JgixTtLXXLsz2KwrcKe5HGGg9avP7DF/geVPPbjscHY/zKBxLQI/B29EzL1pvYK5XopUZk2y3p4SIIEOCA9vjW8fbNDHtVcuUZXLvGMoCC0gUrnsMW5yCw4Mc4ZDzKcxVYgIcdxZls8oWI8REV3I9658gCM0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739899518; c=relaxed/simple; bh=Z9jHWi3dfgHfjbl+/l8xW29XFbEXC2z1XcUJVwGCDWE=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=XcrLx5/trYuU7bpV3ICGRlGg0eI1uZpwM3eM2X285thfnLF+HAYiwUsRsLTiLKTzEASHRJTMVOUymIV0LGpEc6JNhEwHoHMAoe5vKVeCmSdTD4WcrtEl+6UcF18v5GPO1Eq9lcMFZlRfgdo89zijlFQwrE9hwslgxKjGMLqZ0hQ= 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=Zbxj3k33; 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="Zbxj3k33" Received: by mail-wm1-f74.google.com with SMTP id 5b1f17b1804b1-4399304b329so5552045e9.3 for ; Tue, 18 Feb 2025 09:25:16 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1739899515; x=1740504315; 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=jx4xZjDfMBMXXhEUJXok46KCHPVTD9NLwBhDL+J2lnc=; b=Zbxj3k33ypLir7b2k9eJi0zi331yC90cWdljk2az6l+OJEPJbJ83ey8X+qLUGlWUTK CRV/ThtcdlfRm/VYkyA3rAv5zTIetv9xO7Ym7p4pzim5IfyacmQ52uCtMN45X1czYE01 656a0rikfPaltMKqPY0OPTExjkA1xcslMpFzZJwDlMP19N1MDJpApVKLtR4F8KAcnCaT B9BdYtJ3MupF2cvSCETvjb21Pl9B0971ncuTHwHmp7uKK2M5/Lx2zuNz+BDdreF3Mof4 Stsg21hRjr1DuztkZ1LLVdyPZtfib8Onyo7DGbDNbMYimAk3kmgVPKrjbXVjcMfj6nHy OBow== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1739899515; x=1740504315; 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=jx4xZjDfMBMXXhEUJXok46KCHPVTD9NLwBhDL+J2lnc=; b=VfiGv5GasYurPgiGXAbp5s0v2lTsMz19eYW1A6a3krhG4GEvK3MPs/e4ruc02OP1Q6 yldnimJCgXP5k6iA1a4HZ3yBEPOQm4wvid4MJJc8RZ2GNAIo6JUMdUPgrjVh3EqpMpk7 glZ0MVHGWFXyZAS0tNAY6W5X3ihIaEHxS/REDmYN6sjU/aCSssLEXEhig9LWXIaFYRdh SQt+f79CXWDC4QQ+ipojxEMBGh0Y2nJ16bQvJkebSrS9QbTtMPoBNgf+bTO6L0K5P3OH FVptP1Mdp3LU5JCMXt8GxDUu89k8NVuzG8VrsMiIJJcviLgCuxkbTDdT3aJ3C7pj4zvl NHnw== X-Forwarded-Encrypted: i=1; AJvYcCUgqolV1qVtmF9ZuX0XLqWFSBroVtqQvQ7H6o9dq336zgujDFKuDto1HQz/oAMrzEut5WiK9vORnsIPabUv@vger.kernel.org X-Gm-Message-State: AOJu0YwDfjRv9rpzaYT0WYgmXuhU/rKCELOGTdC0K3L3BnjTgRLvk13K Ajee2mTR2F4LpMfEWCDUSXqKiOwPWO7W4+FEN4LE+vWmJtlGfEb5sRfUJgLYNxdHVfW9QUAWbw= = X-Google-Smtp-Source: AGHT+IFmZffBFgEdtdB4umKgK2ktvciHW+KwlXO0p1rZeaOpM3ZGypPScKK7EME3e2ZtSdCfEZtgUxje0w== X-Received: from wmbfk13.prod.google.com ([2002:a05:600c:ccd:b0:439:841e:b677]) (user=tabba job=prod-delivery.src-stubby-dispatcher) by 2002:a05:600c:1c86:b0:439:8346:505f with SMTP id 5b1f17b1804b1-43999dd21e9mr4817225e9.20.1739899515197; Tue, 18 Feb 2025 09:25:15 -0800 (PST) Date: Tue, 18 Feb 2025 17:24:56 +0000 In-Reply-To: <20250218172500.807733-1-tabba@google.com> Precedence: bulk X-Mailing-List: linux-arm-msm@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250218172500.807733-1-tabba@google.com> X-Mailer: git-send-email 2.48.1.601.g30ceb7b040-goog Message-ID: <20250218172500.807733-7-tabba@google.com> Subject: [PATCH v4 06/10] 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, 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 Tue Feb 18 17:24:57 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Fuad Tabba X-Patchwork-Id: 13980328 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 D7CCB271267 for ; Tue, 18 Feb 2025 17:25:18 +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=1739899521; cv=none; b=ou77cRnVlpiaL+F2rWcKj22T8ewb9zSDkoExWot2SP03UFcKEuPgjekFOogLPc1lhh93B0YKKXT5OdGxr5UJX4xBiewtOf/MUPbhGuIqxMAOdsaoW98pcpkXsl5ViNzfA+rrIrQR5fnTwx/qvLf4dsW0O1QQRBFmo7gVZhWMG2s= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739899521; c=relaxed/simple; bh=n4puc9fJmKfWIWCeHx3xFeFZ8ulIS+XxAcYR41Q1stA=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=lme3YOTIVJM2WHAU0J75DFjoxrZMBqFV85M0Xaiab+74CjiisnokvXiIl8UrXT0JWPMnIekwdk/kZbLeWzE9P6b3pZUilF/IN65J4Q4VHbTdPaHUm68qwpAKQUhefwEH10M2nbtU+7Tmc0jJO/hVq4Af2b6Kepj1VMynQ+DElIM= 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=MMH2ePXo; 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="MMH2ePXo" Received: by mail-wm1-f73.google.com with SMTP id 5b1f17b1804b1-439870ceef3so11373195e9.1 for ; Tue, 18 Feb 2025 09:25:18 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1739899517; x=1740504317; 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=0+1jJ542FIUn0Rr8Fjhsk4rNdZzsZ79ixZS3qAefs1s=; b=MMH2ePXopB/ZpJoutVslgjGQbvkC+D11JL6MF+hknYRXPUnU3+Zo/uIFnT7NT9ij0s wLkV4q3OtbfiqvSHG8CBqUsp0lFZHfbb80ULSD7cn8JKRgIF5jbENnw9VV39CE0KQI01 0fQ21NdsGZWNqBIhx7wL80s1dG25m8B3gbK589217y7YNaWGqlr8sklXwYKn5R2bPfzd uYv1ZRekt9nOq8jnLR5nk5Tas+UJ+/WtGiFdr2X3Z5jWDAhKZWdyUUlY89Om4Y5PtUZA k2JFfq+NbqiePaA+IKOt1tK1VXk/IaxD23GSJog1MbJIASowkWTH6tFpEsEBQ2twJ1/l 72Vg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1739899517; x=1740504317; 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=0+1jJ542FIUn0Rr8Fjhsk4rNdZzsZ79ixZS3qAefs1s=; b=MAA7VVugaAV6tc6ON7VZk3gnu9m4cHAIqXe/v1D6sLWXD/z/BbMGx2AtJW8ndtXcCx MuwO4eTzE4J848v5XfqWJV/R4K/imfkVJ6ge3wsDuAUPBN28Hk/mCSmA9wT++RyNge3V khgBwBtfzEv6/Uc0C6bZvoZnJgLiFBFyM8O+0rVduwPaFkyv+Hz6CGH42b2iEzWlmdoZ xLTHAvkHQmsLEkdfOARjJc/bfgtl5ldo8MwHYdoY8dalzjaogxCdo/zCbDrBlMWE7/SE LgmWNYRvHK7p/mN/GF9OPNtIRepflT4GeYXI6R1SMb0aniisA9XLCkHJdFyl0L++m/CU BfeA== X-Forwarded-Encrypted: i=1; AJvYcCXnAb9XAjgmiZEB1ydUe55Ipdh+69DkXXm5ZCWz6BZNMEC028oVZfwqDJO9DvpfaN0JOny8gvZfRCrSAz/U@vger.kernel.org X-Gm-Message-State: AOJu0YwzzIaMoBTp1I/2zsHwRTIVVtUguVKjINZ/sDI7ZQA4ALuc0fCp A87c6jC2ez6DXQvtXLgqLS3NHmETPJGqM3tKSUBwzoD+0sO+efZSAP4+lT52GJ7ZCxoxp4yl3A= = X-Google-Smtp-Source: AGHT+IEomX75wSUKcjYlPTL8ccxKDoIA0hN0/nqjvlvYP7OWhi/yQq6R2XsnyWNa2w6ZlekuJlp64UeMTg== X-Received: from wmbfl27.prod.google.com ([2002:a05:600c:b9b:b0:439:848f:2fc7]) (user=tabba job=prod-delivery.src-stubby-dispatcher) by 2002:a05:600c:4ecc:b0:439:685e:d4c8 with SMTP id 5b1f17b1804b1-43999daff2bmr5080855e9.15.1739899517280; Tue, 18 Feb 2025 09:25:17 -0800 (PST) Date: Tue, 18 Feb 2025 17:24:57 +0000 In-Reply-To: <20250218172500.807733-1-tabba@google.com> Precedence: bulk X-Mailing-List: linux-arm-msm@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250218172500.807733-1-tabba@google.com> X-Mailer: git-send-email 2.48.1.601.g30ceb7b040-goog Message-ID: <20250218172500.807733-8-tabba@google.com> Subject: [PATCH v4 07/10] 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, 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, add a check to ensure that the assumption that logging_active is guaranteed to never be true for VM_PFNMAP memslot is true. Signed-off-by: Fuad Tabba --- arch/arm64/kvm/mmu.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/arch/arm64/kvm/mmu.c b/arch/arm64/kvm/mmu.c index 1f55b0c7b11d..b6c0acb2311c 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; @@ -1525,12 +1526,13 @@ static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa, * logging_active is guaranteed to never be true for VM_PFNMAP * memslots. */ - if (logging_active || is_protected_kvm_enabled()) { - force_pte = true; + if (WARN_ON_ONCE(logging_active && (vma->vm_flags & VM_PFNMAP))) + return -EFAULT; + + 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 Tue Feb 18 17:24:58 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Fuad Tabba X-Patchwork-Id: 13980329 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 55FC226FDAE for ; Tue, 18 Feb 2025 17:25:21 +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=1739899523; cv=none; b=YWBfaaG7CtjTEqqad/jAgTNNTY0htqQAMqxM2egF7DJVqcCSHBk2is4cz0x4cfhjlEx9JPGd45ORqOs+HQ5CE6YuodnUYLj+xgcWIGnOR1bfRlmIHVkvc9lMjZmDY/8nAdAEjNfLVIqCc6dQERzN1EWQcTTq9+3KWIqrCbAZlOI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739899523; c=relaxed/simple; bh=vjNDiEppelyiWheebkhHJLm/orXv9jQNCXAkwaziMCM=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=eL8reYJChogVBEpksFbeQDaCwMgxMe4uJIytlNJU0OC9F8SoYnI36iQTZWbxUZKDfzCsAHlz9BoGlxd7TURhyE3GBVFn8qVYsaspf8F4ocnn3upEn015CkucudrBU2JimfgkUewwtK1QHByLX2smYE1B5hr6Y/prRzj71wlm/b4= 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=d3raJjNI; 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="d3raJjNI" Received: by mail-wm1-f73.google.com with SMTP id 5b1f17b1804b1-4394040fea1so32941425e9.0 for ; Tue, 18 Feb 2025 09:25:21 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1739899519; x=1740504319; 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=HrCJ0PSXwDLqByOCYPiXAh/mnjwdtGMIXzVkGX+CyBE=; b=d3raJjNIa3bKIVqWUrRBR4NnkixnedGtwlO8i1WnM1DFkExc4Ce+gOW+khKkcftJg9 CLnFyGJybEE+6CeSeY7VkaWams4KOYueypg7aoEjaqdJBvdAO4G4DKzhPqJII46BdlM2 MBiZln1HsDNQUyGT/XDX8JBhx2DgijiAfH8hxgxftdiOzUz7CAFEpDlYlbZPSZRaF2F7 xIc0tf2aJwbMSwODSKNaTVl512MFDCogvQBGLVKNz8C3FdiM3OeoYRpkoUx85qIsR6Mu Ea/5FpKnjuVkbY9hFeWmTbmQVZBM+vrn9xRjwLJTinaw54rF93KIWXCKKlKoY5pIjV4L ukPA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1739899519; x=1740504319; 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=HrCJ0PSXwDLqByOCYPiXAh/mnjwdtGMIXzVkGX+CyBE=; b=hu8RCK/lVMnIXJst7XOQkGR+N9SyYsOyYap71uiYL2mL9YWeFcznqDmHCKYdmKS2E7 zeq8zedNiUvJQgBHI4mu6KFQr6O4z45ZFPChyRQMmKgPSwvYC2zz2FKDjfct9DM49rl0 VXSg1Yvdt10xWk5X0Q3tOzUReA1i/vJfO2WUc0q1EnlWhcxT/ky849LXJv4TLv6XAs1q 0GlyVE4Zn6zzCpilWDf4UI45mAUfkZiAOaTnM8qnRhvmokTpoqXi17qCi4/Yk3ahvx9A uf9XfoC7VChXcCjBGiicjINLXaSsOehzcffvojl1nfnhc+z7r4l9DE6RF6zNpilYLbjd l8QA== X-Forwarded-Encrypted: i=1; AJvYcCWs+nZ/WnKOfBU5sIYogtIn/S5HEUjOZ7XilBnNksXUwbEic1s4LpE1IuuusmShc87O2n1lbg0GAEXY+TEu@vger.kernel.org X-Gm-Message-State: AOJu0YzS+ny4Xw66BlAb5TFU6ofzPDNwMaGHVE+O1O+Ky85dY+GAY+hQ L1IyzM2Vc/OhNQs5NOyRzLt5qw3XYbHLnhAYWZf/pZJfOCs3OdGCPl2SP4YDjpPDeIaHcOPKNg= = X-Google-Smtp-Source: AGHT+IHieSA46B89OLR6pUBT7ll3MiaqOwCjVEt9P6dGxiZsBq8L2OW4aSqegjPPhJC2FlnFwn7sH4wmkA== X-Received: from wmbep11.prod.google.com ([2002:a05:600c:840b:b0:436:fdb2:fa5]) (user=tabba job=prod-delivery.src-stubby-dispatcher) by 2002:a05:600c:6d4a:b0:439:5d00:e78f with SMTP id 5b1f17b1804b1-43999b7ec7emr6088405e9.11.1739899519655; Tue, 18 Feb 2025 09:25:19 -0800 (PST) Date: Tue, 18 Feb 2025 17:24:58 +0000 In-Reply-To: <20250218172500.807733-1-tabba@google.com> Precedence: bulk X-Mailing-List: linux-arm-msm@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250218172500.807733-1-tabba@google.com> X-Mailer: git-send-email 2.48.1.601.g30ceb7b040-goog Message-ID: <20250218172500.807733-9-tabba@google.com> Subject: [PATCH v4 08/10] 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, 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 | 79 ++++++++++++++++++++++++++-------------- include/linux/kvm_host.h | 5 +++ virt/kvm/kvm_main.c | 5 --- 3 files changed, 57 insertions(+), 32 deletions(-) diff --git a/arch/arm64/kvm/mmu.c b/arch/arm64/kvm/mmu.c index b6c0acb2311c..d57a70f19aac 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,24 +1535,30 @@ 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; + } - /* - * logging_active is guaranteed to never be true for VM_PFNMAP - * memslots. - */ - if (WARN_ON_ONCE(logging_active && (vma->vm_flags & VM_PFNMAP))) - return -EFAULT; + /* + * logging_active is guaranteed to never be true for VM_PFNMAP + * memslots. + */ + if (WARN_ON_ONCE(logging_active && (vma->vm_flags & VM_PFNMAP))) + return -EFAULT; + + vfio_allow_any_uc = vma->vm_flags & VM_ALLOW_ANY_UNCACHED; + mte_allowed = kvm_vma_mte_allowed(vma); + } if (force_pte) vma_shift = PAGE_SHIFT; @@ -1597,18 +1628,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(). @@ -1616,8 +1642,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 83f65c910ccb..04f998476bf9 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 Tue Feb 18 17:24:59 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Fuad Tabba X-Patchwork-Id: 13980330 Received: from mail-wr1-f74.google.com (mail-wr1-f74.google.com [209.85.221.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 5B38027128F for ; Tue, 18 Feb 2025 17:25:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.74 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739899525; cv=none; b=skk1oI5bu1f0FMpUikIagLQOphZtZ8cipr4o3ABK9dK0z5B76BXQOEhPRdXOjS9qRkP6QlX08OPUn3fDLE0oo1Hnc8qRj0W8/L59oPR8IJXJYmCXzxbLqGiCGlC16an0tvyeXPJmm1Aa7AexJjJarbIMT8jyKg5F3/98CqCAxLY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739899525; c=relaxed/simple; bh=viT/G3g01XzsliX7PUjK0In8rA61R/Ue6+JxkGk2b+0=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=H/Jqmqb8CF0rdW6aGktOepvXm1+IXiZVihmMz1Xi6ZrlHJuQCdDQEp0geEueRMQDSziJKzH/aD7CCYnFx8ap0A5ypJQVA0pF8x90N58wJxDNqrdrX8NcNXhb5HA1At3M+0OKhOLHwysAJ42t+fyLurViIO9/CDxpjnR0QhsDCD0= 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=EfNAl6om; arc=none smtp.client-ip=209.85.221.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="EfNAl6om" Received: by mail-wr1-f74.google.com with SMTP id ffacd0b85a97d-38f2f438fb6so4836667f8f.1 for ; Tue, 18 Feb 2025 09:25:23 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1739899522; x=1740504322; 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=DDENpaoS5GaJB9ptDxeQYRENejUKqLMRn7e7USx5uGM=; b=EfNAl6omQTpnCjWBnz81+f5fuP5l5W3ofxat9ztOaa8kd1SsM0wJd7Rxct+dpgp7Ph BmQWR2qxxAlJPoISAM6I2bVh+L170pOhdeN35IWqvEkuC9qvYOG9t+yFRkFWnmWO3xw3 +yPgcRv4T83f+02VL7hrT7admCbkUxHHOFXX46M8RInEC+Am4AniuVIoEraSFdFje/px PmdrHzQgQQS+/eT3BW0RWTQym3qPO5C2ClDXazDUmmsRJwljb4Lmo4s+c1vHZ23+oM+O 2TMIMBw4RBSVGNLck1ST+IL1nTVjfNbQEaIVJZ7wgkZ0/iXBlBkg0SwrRVr0hdNHm1GC TU6w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1739899522; x=1740504322; 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=DDENpaoS5GaJB9ptDxeQYRENejUKqLMRn7e7USx5uGM=; b=m5V6E4s1P3iXWNf2jbo1tih5qWJXpEBGftzOQvVO2BAN23HODWMs6nUBYEqaulQEzi F6HEjFO30Rz6BqbNU6hLIzS08BaJHM58ZE5KCI0Cvn7dygWLuECWybSMXQKAUbEgQJjD XpCrPYYxfEUq/G/EA72gga+xGmVILVF6DSc8Ahh6zBfuz7xUkHoK3+JT3blUe0hFzLe5 lTK+L+AkWJ9fXqZX4z55Ea71a/+HuuuGvuwSexWiGxA4ZAclVjSZZEbtjHQA1WzBmUf9 HrvrRR3RZknpU7qVXTN1LNd5jpmWGDB1JpL2o2t6T3ilXZPZ4P0lUcccRkUpkwVnK4QL jG6A== X-Forwarded-Encrypted: i=1; AJvYcCWZsB28Jcak/WCvh1ai/poK+dw3i1Jgh4Ugjuv4ZqCBuip3SlWh3jZzO+oGM6ORbtwORnBZK1XxgMNXKnNO@vger.kernel.org X-Gm-Message-State: AOJu0Yx3Jy58sAXWNYVvcj5SI3B2Y8QaS+geoLJseB49X/j1hJRCIgXu c8Fb/qBlgsutQ9oO6g2ifDjVpXeAR9mVUks5GUIrWfv3PGSuaPJgzUjW27GOOIsxZBdYQgOtOg= = X-Google-Smtp-Source: AGHT+IELudRwURLH4qpHIjMR5d1+/EyuvFQNnfb9f8/dkmRcuMFNx9He10X0M9rgLys8f9ePWvRLzu+maQ== X-Received: from wmbg18.prod.google.com ([2002:a05:600c:a412:b0:439:9438:468b]) (user=tabba job=prod-delivery.src-stubby-dispatcher) by 2002:a5d:584d:0:b0:38d:dfb8:3679 with SMTP id ffacd0b85a97d-38f33f292e9mr12240320f8f.17.1739899521705; Tue, 18 Feb 2025 09:25:21 -0800 (PST) Date: Tue, 18 Feb 2025 17:24:59 +0000 In-Reply-To: <20250218172500.807733-1-tabba@google.com> Precedence: bulk X-Mailing-List: linux-arm-msm@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250218172500.807733-1-tabba@google.com> X-Mailer: git-send-email 2.48.1.601.g30ceb7b040-goog Message-ID: <20250218172500.807733-10-tabba@google.com> Subject: [PATCH v4 09/10] 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, 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 3a7ec98ef123..e722a9982647 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 Tue Feb 18 17:25:00 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Fuad Tabba X-Patchwork-Id: 13980331 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 85912271295 for ; Tue, 18 Feb 2025 17:25:25 +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=1739899527; cv=none; b=jxdu2abXAf30g5jylcGOYrFuFkCaZrxSIhP8YvMdQm2u/CjAzQ9wSkM/oe+oODb7Cob5U1cLVnInj+QK7erAndNTpe/fz/lXn0mQj5V3mSCSVcfc6FXsEOgIBNNRK9cixU9vujeIosh2szQu+jsIdmIrjEz9af5T005xXDSQcaU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739899527; c=relaxed/simple; bh=So/ODguRobsiMOmS+iLPdjxlB9A2T4w8hVf2uniuTyc=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=A0AVtmpW0x35PmH2b/xNGYU5VTnSIfu6TJVJrN3HQInZxs3bCk60+/ThpsT4bcS1nZ2bUMOEQ2gKmrWCdY1L8r3u9tSe/S9EA/yMlUjqNY3vTpV6xqzrMejvAwaqrpqkBt2tfhkfBA3Fnpey1HaZ+/sOFMr8A2FPrxkPMRP8ryg= 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=CP2sbgKy; 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="CP2sbgKy" Received: by mail-wm1-f73.google.com with SMTP id 5b1f17b1804b1-4393e89e910so30603645e9.0 for ; Tue, 18 Feb 2025 09:25:25 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1739899524; x=1740504324; 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=9GhkdiTtGRQx7HkZyWp1aLkTAfBUArmMth/ZSf0dJkM=; b=CP2sbgKyFhP+4HtQ7rECtNpRfbNJwWGkfXL58KxkU+QCQC7IrhNb848+rCRZU6K8tY b8LODWVx+cjxn0CeIvzE9Y07q8d7qOH/6PhtkDu/a5UGVrvC23k46Hi8eLymgNUF07tD XKl0oOAmfBN8IXe6/m0ri67eVEr1OI8vLOjYKqsAEXuW03Y7yTvU2HS/TxBXOdFtLHAl xyYM8W6UmJQPJI16g3e3/CaBxvRTMGncZCICWnXuYVM0vL3nvPyRwUNoCiFeo1KthRbQ h3tciq8r4+T2B1XpW5p2bEuCIi23qJFQjHRNIbuNPZVOVgtH37Xf2WCFvAQqLAXgrtHV 5gEw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1739899524; x=1740504324; 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=9GhkdiTtGRQx7HkZyWp1aLkTAfBUArmMth/ZSf0dJkM=; b=D8+GB8cDJiwFpoHsKfVN5WcSVt0slol4agnraVcRRt2J1F4XiLOq8vMPlHawno8lnI QaS4M/9eHc3qVAqQrNySbwHTUYX8dCoPBs0Gx98rR5V5U1KYyxxgHPxiD+oGGfkzOVCb km2gyFFYyWO33Ds4GREUTtKMjNMZ2HWKmrZjSZY4u53PSVits8AJMZLvoLdzIyB1uu1g hhLQTAj4nuL6/FXsaqStMYYOHTenPglhJQrbiYnVVem09YDip/MvqEqn/M4Gk+K8lh1k JFlv3N1rGQ2Abd3IaB5NhGYC6d81s6hhQdS3HLNtHRyIpwbmcfkMN1PM1V130oVtUHds 08LQ== X-Forwarded-Encrypted: i=1; AJvYcCXLRy3pt+2PT0vxH8RbsmkVmgLK4S+8cRaI+V2n5Tp25Ox95weZDWlRwds0UPufByDd75el4Ipr0mGmND4c@vger.kernel.org X-Gm-Message-State: AOJu0YwDeoJrA34M8T7dHlh1NdLcob+7eYPY7KyqiwTefPnBreDP7bSx 6+8TdXm7ss126ePdA2vi5A7YINlmBynSBmpGLqGhdAcW/WwStAC2cQfZR3YjkZ7OE7SLDKQ/Zw= = X-Google-Smtp-Source: AGHT+IEV4feF4d+8DAbHzGAlutoYlJf9k+yhRtIv1D+yKbeY7XS93jwvPa8IZZ9GBcPiztNTCq3yl8l6ig== X-Received: from wmbec10.prod.google.com ([2002:a05:600c:610a:b0:439:9379:38c7]) (user=tabba job=prod-delivery.src-stubby-dispatcher) by 2002:a05:600c:1c83:b0:439:9828:c44b with SMTP id 5b1f17b1804b1-4399828c601mr19285985e9.14.1739899523888; Tue, 18 Feb 2025 09:25:23 -0800 (PST) Date: Tue, 18 Feb 2025 17:25:00 +0000 In-Reply-To: <20250218172500.807733-1-tabba@google.com> Precedence: bulk X-Mailing-List: linux-arm-msm@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250218172500.807733-1-tabba@google.com> X-Mailer: git-send-email 2.48.1.601.g30ceb7b040-goog Message-ID: <20250218172500.807733-11-tabba@google.com> Subject: [PATCH v4 10/10] 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, 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; }