From patchwork Tue Feb 11 12:11:17 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Fuad Tabba X-Patchwork-Id: 13970143 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 D832121CFE6 for ; Tue, 11 Feb 2025 12:11:33 +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=1739275895; cv=none; b=h1autAYN3zKVa3Q1BJOpYdZrd1yGq+H7aBaEl9Nj1snCa2dKHwJ9nBHecNqeswoA7cS8S0jMe/SxHpdHjpPB1WTpnybMWTbpNb2bf3f/31gL1DJb6PG/8wJqG8rHUdPMVuvL3Lr+AwFpTWbMdxGbRHM4gR7ecWSOBGfUUR8MuxQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739275895; c=relaxed/simple; bh=bdQ2+JsekwSNsQJcwdpbPIshgmTpGmjqg9MUbSATwio=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=OUhgN0Gh23HF49c7Fbbaj3sAhSkk9t+8lVtug3aeq0bdarIDJ/FNV5/BtgvDPx6pnwzxv97eYL0VPST4b4xGcdexuOgNiVWFYgTklkvs3n+L1t2YRaRTPpr8nr4LlbkaWJSpsSOfcVcm0Bdb4mTsI2Og4iDFqUrLTfVj+eRIkSA= 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=bYNY547d; 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="bYNY547d" Received: by mail-wm1-f74.google.com with SMTP id 5b1f17b1804b1-4393b6763a3so13730685e9.2 for ; Tue, 11 Feb 2025 04:11:33 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1739275892; x=1739880692; 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=jVWwkw4l/C0CQ72V45uYNbZ5qQP6QRpYAD9vOGg0YN8=; b=bYNY547dtEqXHHKR+V+G9HnAGZmtwc+UZTMUmmt2TzVK4KliLQhl9g7HQYZb3yQTfi fNm4ASFxur1lwuoNuQvt4y2Brmjsn1LoD4tgxB0jt3MdaJAZu3ImYiftngOpqSWMtXIJ JtTCfZDdNCBl8IIcxFOC+a+kKYfXrL8OGjtI+GLaUIn1SaX7BNBThGSHa3RH0CtByV+L emmADGDhx8vtjIjm/erdkC2Nn5/hBbWoCeQ5mdsanA9szEMciSHK414FlMlISDCb3Qdy Dy1AqDMUuAAQfyFgen93dGYG8hcuI3+z2usWjvC0SHslYL4d90Cx4+KtnvX5cC3VXyw6 q9Hw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1739275892; x=1739880692; 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=jVWwkw4l/C0CQ72V45uYNbZ5qQP6QRpYAD9vOGg0YN8=; b=cR0pLrR9XViSCBHSUx3m6Fx2Ph9cUQC1nE1fOAxbf4lU2u2mXvM3EK3O1AJ9WN7MqT F4Sjn0l8XBOsLcQmMX+LEhmwPYujrpWg4r4NaU9e3g4QTsbjB2KDsclQOVHZhQC9/yLo HnqnOZWwbEQVeTLfrG9FZt4OF3Z7xUglJQgF12b1PS9FqLycrYoHCw+Wfgk4rJHI8zy5 NbGrmr4rPphERmhxqNQsRy3eYs78CpF1BDFGbniA4ztqfh800AfY0IVoI44TUUEnxKWi G/99ccJevCCCGtT10fvdc7UE1k97IquYNobHWvsoiXvH44mUCgOKI7ytCMoHm9TcL7oW 6jVA== X-Gm-Message-State: AOJu0YxGyyuXFVNeE7Xr9NguF7jKyX7H3/87ePItQskfMXDo2/ppLYRY nhbiv54l9f2xBCUgMU98ZeilvF8p55mIQJGXFEbUPfYSKVchcjGoJ/4LdU0YZbbiyC5w2VfHRi9 S9dbnsnpUmEVhKDujSJdpTkVrbTDQVrMoRNI8l4SP0Ky48bzCqywdFNKEUMwfeLsdOuHYGZmWCR FsKwMzdgQHHHs/6Q21Oo50mIQ= X-Google-Smtp-Source: AGHT+IG10/vN0gzRGJ08Wn/qWLjVjCNkXjXTKTCGAHZrBJMQnayK6w5tSeoK7viwOkkpLU5EQQeSBy5Iyw== X-Received: from wmbhc10.prod.google.com ([2002:a05:600c:870a:b0:439:4cf6:9186]) (user=tabba job=prod-delivery.src-stubby-dispatcher) by 2002:a05:600c:4589:b0:434:f609:1af7 with SMTP id 5b1f17b1804b1-4394c808849mr36671125e9.4.1739275892079; Tue, 11 Feb 2025 04:11:32 -0800 (PST) Date: Tue, 11 Feb 2025 12:11:17 +0000 In-Reply-To: <20250211121128.703390-1-tabba@google.com> Precedence: bulk X-Mailing-List: kvm@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250211121128.703390-1-tabba@google.com> X-Mailer: git-send-email 2.48.1.502.g6dc24dfdaf-goog Message-ID: <20250211121128.703390-2-tabba@google.com> Subject: [PATCH v3 01/11] 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, yu.c.zhang@linux.intel.com, isaku.yamahata@intel.com, mic@digikod.net, vbabka@suse.cz, vannapurve@google.com, ackerleytng@google.com, mail@maciej.szmigiero.name, david@redhat.com, michael.roth@amd.com, wei.w.wang@intel.com, liam.merwick@oracle.com, isaku.yamahata@gmail.com, kirill.shutemov@linux.intel.com, suzuki.poulose@arm.com, steven.price@arm.com, quic_eberman@quicinc.com, quic_mnalajal@quicinc.com, quic_tsoni@quicinc.com, quic_svaddagi@quicinc.com, quic_cvanscha@quicinc.com, quic_pderrin@quicinc.com, quic_pheragu@quicinc.com, catalin.marinas@arm.com, james.morse@arm.com, yuzenghui@huawei.com, oliver.upton@linux.dev, maz@kernel.org, will@kernel.org, qperret@google.com, keirf@google.com, roypat@amazon.co.uk, shuah@kernel.org, hch@infradead.org, jgg@nvidia.com, rientjes@google.com, jhubbard@nvidia.com, fvdl@google.com, hughd@google.com, jthoughton@google.com, tabba@google.com 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 Signed-off-by: Fuad Tabba Acked-by: Vlastimil Babka 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 11 12:11:18 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Fuad Tabba X-Patchwork-Id: 13970144 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 B6BC221E094 for ; Tue, 11 Feb 2025 12:11:35 +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=1739275898; cv=none; b=cvUNYsAFeOhZxXypRdM24xG8yVxKqSclOaCKB6ta3RrsHlFln5+zqV8p0C0IgQ+FjmMz/4YNwwWzXSm3HilqpA54snhJunhLkqWajGIdL+ACI6ufTG7jdaiR3GG73cz/SJjRIt0+JBd4gFuQYxCtsw9AEf0hERdLyGDpNqVyuIo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739275898; c=relaxed/simple; bh=DjLAQsoXdnPl6GrE+/GdZCahvPNjPTRXwCDe2y5OqLM=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=CCtXbofcyG9+4l1TlRNi8AerzxGpRrSRQn99bKyFlgwQvXXsInnp8dYZwznCRaR/N4RNdUZwMpbW7Bie5pC3r1LLToOrqXroUNYXDcr7ZgIJABpMYsqrc3nIJLFM1OqCi+q4jMG0XGMcdPY440hiUFkY0uOQC6Q77YCw2DwDiFY= 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=R3QDRiSI; 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="R3QDRiSI" Received: by mail-wm1-f73.google.com with SMTP id 5b1f17b1804b1-4393e89e910so13393655e9.0 for ; Tue, 11 Feb 2025 04:11:35 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1739275894; x=1739880694; darn=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=sWMrByBHh6bCcS+Ah6m7GoQirIP0Jem/nT3gsSQXFpI=; b=R3QDRiSIQRlhy2Tp9S0t4jmSLmVCcEXaTaeYftpPN5PFtcpuFrDn1TljeqpZWchmba kln1J+33DsBKa+guDyAuOUdU5LQSyQV6HfWQNgbtPO/VQHDMCaOWKUUl2CViBZwA21Q8 cCmaOGjuAWl/ctV7iIGXhGVzEGtWV0eShd1YIvZjIIi0oBajOw48Iu3hkkgpva4JmCWt HVMRm4k+AdAyyPtH3Hm4YMDmn2U7hreDrTZMWRR2rM4py2pxlo4IydmzW3ovv5NvE2Fa NU8dxe9Ud7rGZmvL4nwPZ8PF+eg5GMesNyUgvmLDSAILlQN1qvKShTfTysSaNPv+5ipj ngfQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1739275894; x=1739880694; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=sWMrByBHh6bCcS+Ah6m7GoQirIP0Jem/nT3gsSQXFpI=; b=dR1LUCOK3snenYC46znQKBw8ij8R2g2DetHuzMWu9ZRD/0yykkqCTUcF2xegOWP86W UwRIdlbME0x/g8aNxnyAp5/ugTYtcAK88gInQbh16hrwxzYS3BIcr/FEY1CC4/SWEIeS VQulcRS6SAIt9y9UK0gT+MRTZA95kO2UBjd7+s63VvO1OOWVixNW2rvSnIFvAP5IrK6u +1NQbwI/XddMqHmcdfSt+/EEeeikSMQoYWeK92dCVAs+9kh/GjMnX58JIw5u+WKMUrgF ZPHEyQ1qBi6Swv4asp0hsmea5YJZDOisiwPS6cuuTaq7s89Y0rijYwHXVMVYgsdqSnll 48Gw== X-Gm-Message-State: AOJu0YytakWVwokp7QbYCt1Gkn/9JF3x3/EsfrIqcvbzJ7S45iAPScsH tBypS4Ve1eG14ardEhw89L6fAO/ft4OGmPaFuYKhTwHpI+w7m4ihLWXcmXmapnU83geqmpDDS3J tUJ2AjucWE7bz88iZYELpOoB+r8RjQ0MMAXpDMBZKxOGxIAr4poQAeplnVDXYACNZ20+p8eUlCD BGUyl5DNJwycUAoJwIevy7Wzs= X-Google-Smtp-Source: AGHT+IE8Ghyq44OOrdMI7rTy32U9k2qC1vm1QBwY+iABDYDzlSXr3Wt1H56p+D7BVdWhTRPrbKtMom5fBA== X-Received: from wmgg10.prod.google.com ([2002:a05:600d:a:b0:439:432f:cc11]) (user=tabba job=prod-delivery.src-stubby-dispatcher) by 2002:a05:600c:ccf:b0:439:56f3:d40f with SMTP id 5b1f17b1804b1-43956f3d5c3mr1028375e9.21.1739275894075; Tue, 11 Feb 2025 04:11:34 -0800 (PST) Date: Tue, 11 Feb 2025 12:11:18 +0000 In-Reply-To: <20250211121128.703390-1-tabba@google.com> Precedence: bulk X-Mailing-List: kvm@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250211121128.703390-1-tabba@google.com> X-Mailer: git-send-email 2.48.1.502.g6dc24dfdaf-goog Message-ID: <20250211121128.703390-3-tabba@google.com> Subject: [PATCH v3 02/11] KVM: guest_memfd: Handle final folio_put() of guest_memfd pages From: Fuad Tabba To: kvm@vger.kernel.org, linux-arm-msm@vger.kernel.org, linux-mm@kvack.org Cc: pbonzini@redhat.com, chenhuacai@kernel.org, mpe@ellerman.id.au, anup@brainfault.org, paul.walmsley@sifive.com, palmer@dabbelt.com, aou@eecs.berkeley.edu, seanjc@google.com, viro@zeniv.linux.org.uk, brauner@kernel.org, willy@infradead.org, akpm@linux-foundation.org, xiaoyao.li@intel.com, yilun.xu@intel.com, chao.p.peng@linux.intel.com, jarkko@kernel.org, amoorthy@google.com, dmatlack@google.com, yu.c.zhang@linux.intel.com, isaku.yamahata@intel.com, mic@digikod.net, vbabka@suse.cz, vannapurve@google.com, ackerleytng@google.com, mail@maciej.szmigiero.name, david@redhat.com, michael.roth@amd.com, wei.w.wang@intel.com, liam.merwick@oracle.com, isaku.yamahata@gmail.com, kirill.shutemov@linux.intel.com, suzuki.poulose@arm.com, steven.price@arm.com, quic_eberman@quicinc.com, quic_mnalajal@quicinc.com, quic_tsoni@quicinc.com, quic_svaddagi@quicinc.com, quic_cvanscha@quicinc.com, quic_pderrin@quicinc.com, quic_pheragu@quicinc.com, catalin.marinas@arm.com, james.morse@arm.com, yuzenghui@huawei.com, oliver.upton@linux.dev, maz@kernel.org, will@kernel.org, qperret@google.com, keirf@google.com, roypat@amazon.co.uk, shuah@kernel.org, hch@infradead.org, jgg@nvidia.com, rientjes@google.com, jhubbard@nvidia.com, fvdl@google.com, hughd@google.com, jthoughton@google.com, tabba@google.com Before transitioning a guest_memfd folio to unshared, thereby disallowing access by the host and allowing the hypervisor to transition its view of the guest page as private, we need to be sure that the host doesn't have any references to the folio. This patch introduces a new type for guest_memfd folios, which isn't activated in this series but is here as a placeholder and to facilitate the code in the next patch. This will be used in the future to register a callback that informs the guest_memfd subsystem when the last reference is dropped, therefore knowing that the host doesn't have any remaining references. Signed-off-by: Fuad Tabba Acked-by: Vlastimil Babka Acked-by: David Hildenbrand --- include/linux/kvm_host.h | 9 +++++++++ include/linux/page-flags.h | 17 +++++++++++++++++ mm/debug.c | 1 + mm/swap.c | 9 +++++++++ virt/kvm/guest_memfd.c | 7 +++++++ 5 files changed, 43 insertions(+) diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index f34f4cfaa513..8b5f28f6efff 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h @@ -2571,4 +2571,13 @@ long kvm_arch_vcpu_pre_fault_memory(struct kvm_vcpu *vcpu, struct kvm_pre_fault_memory *range); #endif +#ifdef CONFIG_KVM_GMEM_SHARED_MEM +void kvm_gmem_handle_folio_put(struct folio *folio); +#else +static inline void kvm_gmem_handle_folio_put(struct folio *folio) +{ + WARN_ON_ONCE(1); +} +#endif + #endif diff --git a/include/linux/page-flags.h b/include/linux/page-flags.h index 6dc2494bd002..734afda268ab 100644 --- a/include/linux/page-flags.h +++ b/include/linux/page-flags.h @@ -933,6 +933,17 @@ enum pagetype { PGTY_slab = 0xf5, PGTY_zsmalloc = 0xf6, PGTY_unaccepted = 0xf7, + /* + * guestmem folios are used to back VM memory as managed by guest_memfd. + * Once the last reference is put, instead of freeing these folios back + * to the page allocator, they are returned to guest_memfd. + * + * For now, guestmem will only be set on these folios as long as they + * cannot be mapped to user space ("private state"), with the plan of + * always setting that type once typed folios can be mapped to user + * space cleanly. + */ + PGTY_guestmem = 0xf8, PGTY_mapcount_underflow = 0xff }; @@ -1082,6 +1093,12 @@ FOLIO_TYPE_OPS(hugetlb, hugetlb) FOLIO_TEST_FLAG_FALSE(hugetlb) #endif +#ifdef CONFIG_KVM_GMEM_SHARED_MEM +FOLIO_TYPE_OPS(guestmem, guestmem) +#else +FOLIO_TEST_FLAG_FALSE(guestmem) +#endif + PAGE_TYPE_OPS(Zsmalloc, zsmalloc, zsmalloc) /* diff --git a/mm/debug.c b/mm/debug.c index 8d2acf432385..08bc42c6cba8 100644 --- a/mm/debug.c +++ b/mm/debug.c @@ -56,6 +56,7 @@ static const char *page_type_names[] = { DEF_PAGETYPE_NAME(table), DEF_PAGETYPE_NAME(buddy), DEF_PAGETYPE_NAME(unaccepted), + DEF_PAGETYPE_NAME(guestmem), }; static const char *page_type_name(unsigned int page_type) diff --git a/mm/swap.c b/mm/swap.c index 47bc1bb919cc..241880a46358 100644 --- a/mm/swap.c +++ b/mm/swap.c @@ -38,6 +38,10 @@ #include #include +#ifdef CONFIG_KVM_GMEM_SHARED_MEM +#include +#endif + #include "internal.h" #define CREATE_TRACE_POINTS @@ -101,6 +105,11 @@ static void free_typed_folio(struct folio *folio) case PGTY_hugetlb: free_huge_folio(folio); return; +#endif +#ifdef CONFIG_KVM_GMEM_SHARED_MEM + case PGTY_guestmem: + kvm_gmem_handle_folio_put(folio); + return; #endif default: WARN_ON_ONCE(1); diff --git a/virt/kvm/guest_memfd.c b/virt/kvm/guest_memfd.c index b2aa6bf24d3a..c6f6792bec2a 100644 --- a/virt/kvm/guest_memfd.c +++ b/virt/kvm/guest_memfd.c @@ -312,6 +312,13 @@ static pgoff_t kvm_gmem_get_index(struct kvm_memory_slot *slot, gfn_t gfn) return gfn - slot->base_gfn + slot->gmem.pgoff; } +#ifdef CONFIG_KVM_GMEM_SHARED_MEM +void kvm_gmem_handle_folio_put(struct folio *folio) +{ + WARN_ONCE(1, "A placeholder that shouldn't trigger. Work in progress."); +} +#endif /* CONFIG_KVM_GMEM_SHARED_MEM */ + static struct file_operations kvm_gmem_fops = { .open = generic_file_open, .release = kvm_gmem_release, From patchwork Tue Feb 11 12:11:19 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Fuad Tabba X-Patchwork-Id: 13970145 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 B785122069B for ; Tue, 11 Feb 2025 12:11:37 +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=1739275900; cv=none; b=BAbgAhh2RcIZ2hPKs6RdPnZqPGxiC/HfvsQGGr/R2pwYWB9yPwmWTbFRGOZQoI3D9NW/pK/gSbujxIQqgb3FIdKrU0nRgb+588+W2ICcK5ZkTHUnZL4oFo0K+sT5CSha/F+2rtP6UsPWoUc7VvXLllwWb47DTPw7Ecckss47JcQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739275900; c=relaxed/simple; bh=/jq9wIAl0mpZ1a+FL0vch5bwDNTa3/JN51KjdveFuAA=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=koBdwUX4e0YQ2PMJiVkpvod0G7he0Qu3bD1loxQycGJ/EVDb7pcqdYbnzWhaehy/+WsQY+B/qqEUol/1LzBGOQuSYUw8MqvaY5zW//aUFMIsGU8bIVe+3eBZG/pGPESVAsiln5zbiA3NdVUs+62pVFjgE+cmo0bqWQ6svT91GAI= 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=r2KswsQg; 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="r2KswsQg" Received: by mail-wm1-f74.google.com with SMTP id 5b1f17b1804b1-43945f32e2dso14929535e9.2 for ; Tue, 11 Feb 2025 04:11:37 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1739275896; x=1739880696; 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=kAdYjo7w1XuCwrHZHSlpYdtLm3u9gqqV2MfDowlzC6o=; b=r2KswsQgfhQ1APHK6Z8rVNmRmf02OZJE5AnOpbXdHZyuNVIeMuTXGp/UuPvk+sMpS1 fQtRP4jd2mOzes/Nrj0qydnrYaA39Zi51Osmblww2FQbTorOlHx85Oc4GuU+Gk3JeN4u nEhh5K4dmxRKqi7/6+u/S4EvXGdpb3UW2JupqzB13sbU2fcqFl3ekhnTFIO1wBXC9m27 n+5i1nWjiPxSQc2w9Nz6xg15tG+q2GgVfNbjMJRVY7ip8npK5cjLg7WtcNIf47H7My4G PCOKkRtO1p4rYFmZwCyq5mVLCvX6Ee8AmQrZQbQWMocUwpZPWMlZDm/wBVxf0UGCH6Dv 3oMA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1739275896; x=1739880696; 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=kAdYjo7w1XuCwrHZHSlpYdtLm3u9gqqV2MfDowlzC6o=; b=gAuY3/Eq5Hg9Oe4TK9YQcKKbBeBZjvow8H9yQmKGcOw9itk7NLvbavNjf+R36geb2e 8hWUUyKSvXnKbzqJPL6rM507wV9dlSw7wQEhX1SUo2CPvwGW+knOYH/FV/+dcq1ZI/kf xokTHxRP6FACJxLxJ8viaM1BW9tIUFKQIVuo97WK9QEiaFIYlV3r5F6SeqYgjDXdJVrY Z/+UdXYLSYGkgjtWCCu2QukK/YV8KFRff1zM/aIU7cP3OUE/k+db0dyP0Dda+NIKnpME ez7dbAKAd7JeMQca7G7sJTcDGJifH0l5OI4v51Bw/jFw1lVzTUa+oZyBcNNif0l7ZzoX a1pg== X-Gm-Message-State: AOJu0YyAi33sRhGtjFdrt28o9s403RICLfHcdG2bCXjru0OW927GSxeE UjW7Ea8djihicmjS6KW50OpuS34kiGDoG86ltJ0fKnDVhea7okET5ITLlxnKY5C1iVZ3LTymmJ8 qkeeTio1ca1T74SwNB8IT2oGP0zVa3ipfoMKJth+Lx7mASNHSYQzJSgzU8HUalqv2G5f1wUIM2S uPEnbUhJA7QopxmOIdmZ8jODo= X-Google-Smtp-Source: AGHT+IGhAIxPnSIYxIYDciFwkjwU21RN+iHch2esUCoX8117xYYfDRohfxX77fPgyaVseOuJnCqxQyk9YA== X-Received: from wmpz19.prod.google.com ([2002:a05:600c:a13:b0:439:468e:a94b]) (user=tabba job=prod-delivery.src-stubby-dispatcher) by 2002:a05:600c:1da7:b0:439:34e2:455f with SMTP id 5b1f17b1804b1-43934e24665mr117723345e9.12.1739275896121; Tue, 11 Feb 2025 04:11:36 -0800 (PST) Date: Tue, 11 Feb 2025 12:11:19 +0000 In-Reply-To: <20250211121128.703390-1-tabba@google.com> Precedence: bulk X-Mailing-List: kvm@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250211121128.703390-1-tabba@google.com> X-Mailer: git-send-email 2.48.1.502.g6dc24dfdaf-goog Message-ID: <20250211121128.703390-4-tabba@google.com> Subject: [PATCH v3 03/11] 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, yu.c.zhang@linux.intel.com, isaku.yamahata@intel.com, mic@digikod.net, vbabka@suse.cz, vannapurve@google.com, ackerleytng@google.com, mail@maciej.szmigiero.name, david@redhat.com, michael.roth@amd.com, wei.w.wang@intel.com, liam.merwick@oracle.com, isaku.yamahata@gmail.com, kirill.shutemov@linux.intel.com, suzuki.poulose@arm.com, steven.price@arm.com, quic_eberman@quicinc.com, quic_mnalajal@quicinc.com, quic_tsoni@quicinc.com, quic_svaddagi@quicinc.com, quic_cvanscha@quicinc.com, quic_pderrin@quicinc.com, quic_pheragu@quicinc.com, catalin.marinas@arm.com, james.morse@arm.com, yuzenghui@huawei.com, oliver.upton@linux.dev, maz@kernel.org, will@kernel.org, qperret@google.com, keirf@google.com, roypat@amazon.co.uk, shuah@kernel.org, hch@infradead.org, jgg@nvidia.com, rientjes@google.com, jhubbard@nvidia.com, fvdl@google.com, hughd@google.com, jthoughton@google.com, tabba@google.com 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 (shared memory). To that end, this patch adds the ability to check whether the VM type has that support, and only allows mapping its memory if that's the case. Additionally, this behavior is gated with a new configuration option, CONFIG_KVM_GMEM_SHARED_MEM. Signed-off-by: Fuad Tabba --- This patch series will allow shared memory support for software VMs in x86. It will also introduce a similar VM type for arm64 and allow shared memory support for that. In the future, pKVM will also support shared memory. --- include/linux/kvm_host.h | 11 +++++ virt/kvm/Kconfig | 4 ++ virt/kvm/guest_memfd.c | 93 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 108 insertions(+) diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index 8b5f28f6efff..438aa3df3175 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/Kconfig b/virt/kvm/Kconfig index 54e959e7d68f..4e759e8020c5 100644 --- a/virt/kvm/Kconfig +++ b/virt/kvm/Kconfig @@ -124,3 +124,7 @@ 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 + bool diff --git a/virt/kvm/guest_memfd.c b/virt/kvm/guest_memfd.c index c6f6792bec2a..85467a3ef8ea 100644 --- a/virt/kvm/guest_memfd.c +++ b/virt/kvm/guest_memfd.c @@ -317,9 +317,102 @@ 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)) { + ret = VM_FAULT_SIGBUS; + 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 11 12:11:20 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Fuad Tabba X-Patchwork-Id: 13970146 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 C0DFF221DAE for ; Tue, 11 Feb 2025 12:11:39 +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=1739275901; cv=none; b=rgogI2UR7X/d6PU2RSfPapHkQYHV8L7Vo3B3wsJMHIwAcfQP7LQ1FlxGbIZNnbr/dAHEASi+9PSdfZz1/LI+NsOVkG6FlE5njSRpnRcu+BL1ep/RJzlXim1p70/mK3lNaIh6AxoGH7PxxaUZKnOAKQ2uPQxPfdRmaefAQPgzl08= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739275901; c=relaxed/simple; bh=wJDNPUbPulY91yymWFntWwTBzvEsNR4qKkxfhIjiVic=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=Mem5aI2Vt5rdlyt2b/+i0X5yJvZJUst0whdNz/PEdAkIt6hjVhxbbYKCiJCLW87iyL35v+YbG1CmdCJBEiBtNT5sRH+lEN9OcoQquUDZkmaQEHiEZG+AobtFRnsSq21YQeERZdoWlm1ie6LYijj+ZJgL9MpIRDZXWd8Wm0esIOA= 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=Eh/om10r; 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="Eh/om10r" Received: by mail-wm1-f74.google.com with SMTP id 5b1f17b1804b1-43935bcec0aso22508605e9.3 for ; Tue, 11 Feb 2025 04:11:39 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1739275898; x=1739880698; 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=VoOoWnCPGl4HcCb1I6zbkoc8AjEeP+ezJ3rNmGf66Z0=; b=Eh/om10rNOyPf1rZj5bOSADDW6rp513VI8ghX/5Lh/CyYC3eAb0mrBrDGzwVoyNms1 mcTIB2/mcctIix85Sc6P40zxRqhpwThnEvCUBcFLda7pfvqHk6N2fyenKyJ2Vjraaa7C uBILh73D40yhtDO2721bDpNgXdmxXqVrAmrmhIno7qadJta2H3YfQkTT211VEnn36Kcd WXDrrTzWdajZOveq7bdagToOyddOPn+mFWn79ZuAbADFpgeefu9kEW49kkrA82wvs7lY xe/S6OVQL04TkRPc2la01be+6pmGm3cRkGsy8OfwhPKwIAsRhmljeUpU1wzgObaJVPUH lexA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1739275898; x=1739880698; 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=VoOoWnCPGl4HcCb1I6zbkoc8AjEeP+ezJ3rNmGf66Z0=; b=SE6/Jfu0+VHm/LyaG9UDITIE5GDkSnKsc7x72SZ7oTOhbJ4wwAr1AEa1T/tAF+KM4J 7AjPyGZuGvTwF8XZ874rcDKfXGrjKLyzzLBGkzpeyDc3VkgARH3kQZd97g4m+/RZIGbj IsAi2qDlaOUOz15pjO5d4kXP6TaXsgofTkQY39QCFHpphtt7s0w7j6H7OY6mhvgW6JIT vT4UVxKe2jAXkBtzsZB+WyEPZGJQ1g+Wfnn37Kca5UQMcSZZ9psYjmCy/NSHOHaL0PDE 11ldY5WfdTcsnrgcMW0Ncwrxys+2XtLj6NIcSOYToaNm3cd1kY/vYXldf5MNsVXjP//J N6rA== X-Gm-Message-State: AOJu0YwZMxJeWvVS63hysfv/2sUnwzYB3GZUnqsEanUU4Cw6axjll1hc tG5QcXhvbOWHMqydVezHh1W7ArPd/S3Y62P8QoeNyQa9JmLVwl8R6tS5UEhjO9L4rW8MYlAfO0x OL3GFNjinE60zyS87nqGpI3wfgP/Zf2O3vYeLIVrYbNQeVZaJkI0ez4mKoJag/pza5PK3K9kAEl T/Mk+OVzTSw2/tSH0Zah7CVzs= X-Google-Smtp-Source: AGHT+IH0eOMmKp8sDSfZvGefzukx2BbOVxp2ECFy0DQe4p4PevxPpr9NYmFYN4kr9FPJEdUBhdy96NX0RQ== X-Received: from wmbfm6.prod.google.com ([2002:a05:600c:c06:b0:439:40af:60e9]) (user=tabba job=prod-delivery.src-stubby-dispatcher) by 2002:a05:600c:1c03:b0:439:4df5:5d41 with SMTP id 5b1f17b1804b1-4394df55f1emr27500045e9.11.1739275898177; Tue, 11 Feb 2025 04:11:38 -0800 (PST) Date: Tue, 11 Feb 2025 12:11:20 +0000 In-Reply-To: <20250211121128.703390-1-tabba@google.com> Precedence: bulk X-Mailing-List: kvm@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250211121128.703390-1-tabba@google.com> X-Mailer: git-send-email 2.48.1.502.g6dc24dfdaf-goog Message-ID: <20250211121128.703390-5-tabba@google.com> Subject: [PATCH v3 04/11] 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, yu.c.zhang@linux.intel.com, isaku.yamahata@intel.com, mic@digikod.net, vbabka@suse.cz, vannapurve@google.com, ackerleytng@google.com, mail@maciej.szmigiero.name, david@redhat.com, michael.roth@amd.com, wei.w.wang@intel.com, liam.merwick@oracle.com, isaku.yamahata@gmail.com, kirill.shutemov@linux.intel.com, suzuki.poulose@arm.com, steven.price@arm.com, quic_eberman@quicinc.com, quic_mnalajal@quicinc.com, quic_tsoni@quicinc.com, quic_svaddagi@quicinc.com, quic_cvanscha@quicinc.com, quic_pderrin@quicinc.com, quic_pheragu@quicinc.com, catalin.marinas@arm.com, james.morse@arm.com, yuzenghui@huawei.com, oliver.upton@linux.dev, maz@kernel.org, will@kernel.org, qperret@google.com, keirf@google.com, roypat@amazon.co.uk, shuah@kernel.org, hch@infradead.org, jgg@nvidia.com, rientjes@google.com, jhubbard@nvidia.com, fvdl@google.com, hughd@google.com, jthoughton@google.com, tabba@google.com 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 11 12:11:21 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Fuad Tabba X-Patchwork-Id: 13970147 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 1BA1722331E for ; Tue, 11 Feb 2025 12:11:41 +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=1739275903; cv=none; b=h685x3VBliIg3QOQeanHR7jWnYrf3S9SHgbyBel6wpzcKRhwzApEwVqSJ2/x8+h2outaWpsLD77TVK0e7TB8P/OsLSkGsPPC+TZq48JJQ6QS4DLlawr0KDTe4dt0hIbe0FRnMzX/lEgu2SIFxn+a98AtKS90bvndm+21bRxSYsA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739275903; c=relaxed/simple; bh=OIfyRRSYHI5yO/1M7fAZ42sOnWraacKOBpqYBOZUDC8=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=oqTsTLJZlwjEJfUO0pJDtsH1/B9kJkXLezTDeDlyR5aNAIJDOCLBjbfZGZvZEFHBUZaVwpg1mHVJwQyAHkH5LmDrTO0JZj0LVzcYwfCcX9ZLzm8Qx9CuL+eDUiE7t7d1qq36yhQVTEAY7Lw8Z0X/DarSaA0aSNScQkMMy58ZMyA= 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=SDAtHrIS; 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="SDAtHrIS" Received: by mail-wr1-f73.google.com with SMTP id ffacd0b85a97d-38dc56ef418so2049157f8f.1 for ; Tue, 11 Feb 2025 04:11:41 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1739275900; x=1739880700; 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=q4c2azch4XGSzLhm4hVjhhxsYncTOG8CAgSFUNg+Wf8=; b=SDAtHrISjMtmogqUtprIwKvUl25be6+/ydnCT7hxXvsoFSzgUE1Ev69Z3UTe5l7zYY QMAxFxNqsa2HHkm1GJJ89rZBxhvIhDtpOQvze5lDi/6PVkn5ppUO0UpvpxtuYcjKZ6Ib ps5aW/arx6JKnn/cb7hJ4lZxw10/eHEDpG7qlz2RUe9uDypo3XocYiLYE2WYYn24WqJr kFWABWy4ji0ZWboZ9jEt9SX33IYBdZQ1uF02RymdGTm1egN6DDXUnDFTgBCTv5rg/D+Q QCzR6o4E0nfAOSwl2AKAuHeiBlBHCuU+MOgbtCoxn/MEnK6olCd8pYmI/iga0wbdvzSu apFA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1739275900; x=1739880700; 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=q4c2azch4XGSzLhm4hVjhhxsYncTOG8CAgSFUNg+Wf8=; b=vV4Emgib5flNqCZkWaZe8fIXWqQvjEQH+dTT/1gpMWwcv3KE4yEGz0Uk+XOcS6kTVB /O78t07vSq5xHD8AE+Jz37lQ7ashpd/6Zsp01+tdg2Xl/HPeJmFFGAe5t9vDP8SzK3tp 8IE+F1YRyfehP0v78FaJSaooOiMJNs96fwvf+IUNc2p5tzX4zHnxUw6K4wt2NVrJ03W0 JfJfZzu8+2oa3C0BJije9KHXcNdeIjcEgLcSH+m5bZn45o3DEaguXpGIwg0WYx8kcq+7 1uSbya8qpx99qMgRoaoNUKsFkSVPUiECyUGP35Oum1CNMWoRy6ELx7lxTkLKe9TaQRoP ntNQ== X-Gm-Message-State: AOJu0YwnKoQ/K64/z3PLxG5To7TpINmr5G7THsghUl17UE+i6qJDaZBU Es+D+PuAStGe8s86rW3RwokF7lu5gTHMtDdl0IwUx8ORK0tNBMtTOLoU4FqlDghjzXSyrOy2rgN 89EzLIawsNbiY/5f38BqyB8SFbE7CnpDJZdMF9c9w/bMWaijLlL4dO44mL/7UBMCnd8/Y7SZ8C8 Ycrphqrou3UdYZL7H3ZtOn4y0= X-Google-Smtp-Source: AGHT+IEZVlgZ7l4TTAOh1SBqdQFPpEAEB3+x5+ryB71coKgbya9elk4Zr5rIWpnyM79ic86FoQOK0Ptk8A== X-Received: from wmbet8.prod.google.com ([2002:a05:600c:8188:b0:439:5539:d861]) (user=tabba job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6000:1448:b0:38a:88bc:aea4 with SMTP id ffacd0b85a97d-38dc9233a6dmr12990245f8f.30.1739275900187; Tue, 11 Feb 2025 04:11:40 -0800 (PST) Date: Tue, 11 Feb 2025 12:11:21 +0000 In-Reply-To: <20250211121128.703390-1-tabba@google.com> Precedence: bulk X-Mailing-List: kvm@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250211121128.703390-1-tabba@google.com> X-Mailer: git-send-email 2.48.1.502.g6dc24dfdaf-goog Message-ID: <20250211121128.703390-6-tabba@google.com> Subject: [PATCH v3 05/11] 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, yu.c.zhang@linux.intel.com, isaku.yamahata@intel.com, mic@digikod.net, vbabka@suse.cz, vannapurve@google.com, ackerleytng@google.com, mail@maciej.szmigiero.name, david@redhat.com, michael.roth@amd.com, wei.w.wang@intel.com, liam.merwick@oracle.com, isaku.yamahata@gmail.com, kirill.shutemov@linux.intel.com, suzuki.poulose@arm.com, steven.price@arm.com, quic_eberman@quicinc.com, quic_mnalajal@quicinc.com, quic_tsoni@quicinc.com, quic_svaddagi@quicinc.com, quic_cvanscha@quicinc.com, quic_pderrin@quicinc.com, quic_pheragu@quicinc.com, catalin.marinas@arm.com, james.morse@arm.com, yuzenghui@huawei.com, oliver.upton@linux.dev, maz@kernel.org, will@kernel.org, qperret@google.com, keirf@google.com, roypat@amazon.co.uk, shuah@kernel.org, hch@infradead.org, jgg@nvidia.com, rientjes@google.com, jhubbard@nvidia.com, fvdl@google.com, hughd@google.com, jthoughton@google.com, tabba@google.com 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 438aa3df3175..39fd6e35c723 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 11 12:11:22 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Fuad Tabba X-Patchwork-Id: 13970148 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 D81EE22FF2D for ; Tue, 11 Feb 2025 12:11:43 +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=1739275905; cv=none; b=D5fWzXYpVLb7rdKoXcKfsuh60PAibfxh3lIlcn83d3+bLihPu/Anb1GJV96XST8OQTiRqr6vADuFkZip2dgMfrSDbEjyChYGKUDDV4Br92xBInPPp2Va+wFVb70lOr2ZIkHuxFBjH0pnyCvxWXjaR0Fiqo8+LTz3ekKxhMWlXcg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739275905; c=relaxed/simple; bh=k+3OFnLM2NMDoQpYe/i6ltXhsVyBeC0rDOk8mBxA1Zg=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=ctjnTArSGzSoRj6BASPZDYGJtKprxLPoFxQmGy2mT/c+7ZoQIr44aoi7cAuL2Q2QB526E0wU/8StCTcj5CLxHs4pcdlG4Y6hci5psauB/USfQ3iNMU91saFiGaeOMEWlifeO3k6ajWjEvUDWOBezWkNxxaEq073aXWSSyUu1q+k= 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=XvyQYwLD; 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="XvyQYwLD" Received: by mail-wr1-f74.google.com with SMTP id ffacd0b85a97d-38dd533dae6so1033227f8f.2 for ; Tue, 11 Feb 2025 04:11:43 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1739275902; x=1739880702; 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=KX7W4swHrFK90elybvizfO8dqWilJCD1C4Wf1fKXSTM=; b=XvyQYwLDJsIXlkD9w/7HUfDfZ5Tnc3pCitKZl1Fl4aYWQ3B7NuxAhP0eiLnkDjM2ml 5tHHxxyTXP/3F0Bn7+reWFyRtPGKtVLAao3Nv9AYX6HpEzKNXea22kkaCU6QXc08Kc5z WHNLvSBUHFtVkZL3TE4gEWPkWAaQgfMb6GXnHLbMqeSK132QyN5AEw+OGSIrsEgZr5uk l3Yzde+udHeJSzVM5Yg6xunGsjkX+9LwdcRzaw/Kxr/5NDdHGzflwJwPvo2V5d6smLaU ogsAg5NgYVrTNaXf9zgkqqKRUgB11BJOZY9EPhrHRhv81X4Qx9qFdiqn6AGoLIk7lFBY EieA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1739275902; x=1739880702; 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=KX7W4swHrFK90elybvizfO8dqWilJCD1C4Wf1fKXSTM=; b=uu+FQ90G15tiBy9KS9Yz+jzm492ncCXN7gpKUIgeRiChMRQ32kqR8qe6zf22lHm7IG NE/DN60Ti6BljTX16qk3OeeFWuo1h1IwbptZ4nStVKVXdYOJ0dcq3j072LtpYfKOcgOo pezyDAhgacAXg9dtaOSnPbrOU8FaIy1+tdVF6xnFFehdJevGH7gYawj4NcGzuzuhFU1y olokMfJJDr+RX3ev+T5cpxOgzo2n0JtPWtH9ypP5YUzMzG/YnH1Xe9GqoF+9SHNbTEhR l91PfKc8y6VtbHp/sv8dnO5Yq1yMSjUMMBpK3yaeCLOsR9yjVIJkBUJwr6dZkNwfXJ9P ouiw== X-Gm-Message-State: AOJu0YyW4zvnJ78++Bj08E8brAEARv15t+aNyzkcY/iD+YwJKoN1m+4g X4gYyI5N5toU3eX5ak0ms8Qv14Xzp0/8cFqUmLC3QjT9TF1kY5ESIv0HZPataJ3PrMylS3EBg4M En2fiafE3ACYSK3bOPPVGinyzr8czEqCuzojknMa8krWI1OHJmutYehu0MyAcg7seACjTfc/rg9 ayqkguF3y6CA4XTryLtZzuDXA= X-Google-Smtp-Source: AGHT+IHXKJom7Ftu5yovrPwrI10XpRYiY2qBWkBSoqtXJLa6Rrj1843rKF5OjouXY03AyaMgB0W+/vXsEg== X-Received: from wmqe4.prod.google.com ([2002:a05:600c:4e44:b0:439:3284:878b]) (user=tabba job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6000:1887:b0:38d:e430:8ec7 with SMTP id ffacd0b85a97d-38de4309088mr3236903f8f.15.1739275902164; Tue, 11 Feb 2025 04:11:42 -0800 (PST) Date: Tue, 11 Feb 2025 12:11:22 +0000 In-Reply-To: <20250211121128.703390-1-tabba@google.com> Precedence: bulk X-Mailing-List: kvm@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250211121128.703390-1-tabba@google.com> X-Mailer: git-send-email 2.48.1.502.g6dc24dfdaf-goog Message-ID: <20250211121128.703390-7-tabba@google.com> Subject: [PATCH v3 06/11] 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, yu.c.zhang@linux.intel.com, isaku.yamahata@intel.com, mic@digikod.net, vbabka@suse.cz, vannapurve@google.com, ackerleytng@google.com, mail@maciej.szmigiero.name, david@redhat.com, michael.roth@amd.com, wei.w.wang@intel.com, liam.merwick@oracle.com, isaku.yamahata@gmail.com, kirill.shutemov@linux.intel.com, suzuki.poulose@arm.com, steven.price@arm.com, quic_eberman@quicinc.com, quic_mnalajal@quicinc.com, quic_tsoni@quicinc.com, quic_svaddagi@quicinc.com, quic_cvanscha@quicinc.com, quic_pderrin@quicinc.com, quic_pheragu@quicinc.com, catalin.marinas@arm.com, james.morse@arm.com, yuzenghui@huawei.com, oliver.upton@linux.dev, maz@kernel.org, will@kernel.org, qperret@google.com, keirf@google.com, roypat@amazon.co.uk, shuah@kernel.org, hch@infradead.org, jgg@nvidia.com, rientjes@google.com, jhubbard@nvidia.com, fvdl@google.com, hughd@google.com, jthoughton@google.com, tabba@google.com 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 b15cde0a9b5c..1fb6cacbbeef 100644 --- a/arch/x86/include/asm/kvm_host.h +++ b/arch/x86/include/asm/kvm_host.h @@ -2244,8 +2244,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 11 12:11:23 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Fuad Tabba X-Patchwork-Id: 13970149 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 29DE224CEFD for ; Tue, 11 Feb 2025 12:11:45 +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=1739275908; cv=none; b=Nn5PPJYrYUi1iIRDL12uKsYTp+BiPaXePHgYxlVQQT5mx4uhPdJaUDiQgBOE83GgpP66jYuy/uV0xQo2uF8qI3vBxfxdDtAOjiW3mfZEu0n26jSZtoIbo5NwmN6yp0ta+XNumP58OsNOsQBX3bd7KMOLUI5LP9CSTYINUuK3evw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739275908; c=relaxed/simple; bh=ED7U0BdTR5CtvG0NjK1D1AJXYzcMplXlqTJIxPfY44c=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=SYdCrHbzEm3xKd603J0TLyD2cz0oKWT43nYG5naHloZDcLq8qNr8Vw8Dnfy/OiN+csNj9611udyO98V14CTJZ7tY0K29Q1j/7SaEhXTtHAQaru5a5kVb8vxapYoEOg6SVoy1EfNCwRg6qjKNwK+PHaWL1+uATRWgt2wbW+C3IhQ= 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=hNPIHM5x; 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="hNPIHM5x" Received: by mail-wm1-f74.google.com with SMTP id 5b1f17b1804b1-4395677bb0fso919975e9.0 for ; Tue, 11 Feb 2025 04:11:45 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1739275904; x=1739880704; 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=KGlWsAVkyKnhySbr83igZIXZOroWdqgSNXlU94DUNkk=; b=hNPIHM5xxYo829sOJVmbLjNol54hlJEo25mpmBJI4SVIH+jMOZk2eliTR3XBGrUvfv jKyOxqSnqFHyi1V98A0f8ZDASU6Lsv/Nj3QTLwpJp97dq1sb3ev4K/IFBiIXI9TVyHPz bW6/HbyESVFhhTZJdsNxjYlRCTzLBJOmbzWNfxx6bt3gmjbzlF/IV13bHEFGPk+IgUML CJcgK9ub4gUqeFkFnwA8b0L+Y7Z02sAMu70ViWzDQHasPbubPJsPMxbFn2n9YfFS5RwT WEvMZ85wgsQS8YZOsEkVofMuXoWRFdaIwGMU+UEWEx7QgQTTM3HgJUDIcx4Ge4DW89fM zaPw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1739275904; x=1739880704; 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=KGlWsAVkyKnhySbr83igZIXZOroWdqgSNXlU94DUNkk=; b=vMaKkc+FyeLMORxF4+hDL7IQezB0JZdqIknovSJotcOhKwh0E1nsGrRWoI3uufrvzG 60iNQWQTeefV3peGh0d8I91k8WEGqJwQ6s8NndEiECV06Tpxdn8sp7Zt5NPcPJSinfxr aZdJ3JVQ227kzc0DxpY9aM2KECm/svTWruJ0ZIQ2Trmm6i+dn8bK/rOqMCr/mgDZkmsv SOT+LR/9iPbv4wTBm0cnKMRA1vV0fCfuIYMbPg6zuwQiYlNso0o5aayl7sam0/VyI28b GDQnNrau4zEknaHzMEjTvFF1byoliV4mHTaPrYhqpn6AVI+yhflmt6wHV7lib1fS99vU l1jA== X-Gm-Message-State: AOJu0YwEw0tVBZdwZAxAeVbL2qFwRjChF8UOG0KdI0+G5nZUd3mxMfAT d2wS0c8Y7UnJnvVNolllZ3dy3ERLEdTJrvahhB2eiWRwBsLps0ZXkaNCNSchFhE/y68QEJA3zqF ZKRbeUlsWnDIpKtQ/j7+vGyUqzPyo2k9FMowjlDdgQAEfE/q75sW0P8gHQWZNJaAdRmPKwz2anP TfeOgYzfTLNonxEmoaKPBYP0w= X-Google-Smtp-Source: AGHT+IECBWxW5BmjsYJdVFsglQzvNG0pX6h42Ln2RnS0ynPClK45T5nCrnmXnpL5zjCvLKTXEj1dNopf1g== X-Received: from wmqd4.prod.google.com ([2002:a05:600c:34c4:b0:439:4c13:57e5]) (user=tabba job=prod-delivery.src-stubby-dispatcher) by 2002:a05:600c:354c:b0:439:4376:cc0 with SMTP id 5b1f17b1804b1-43943761119mr58255965e9.25.1739275904320; Tue, 11 Feb 2025 04:11:44 -0800 (PST) Date: Tue, 11 Feb 2025 12:11:23 +0000 In-Reply-To: <20250211121128.703390-1-tabba@google.com> Precedence: bulk X-Mailing-List: kvm@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250211121128.703390-1-tabba@google.com> X-Mailer: git-send-email 2.48.1.502.g6dc24dfdaf-goog Message-ID: <20250211121128.703390-8-tabba@google.com> Subject: [PATCH v3 07/11] 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, yu.c.zhang@linux.intel.com, isaku.yamahata@intel.com, mic@digikod.net, vbabka@suse.cz, vannapurve@google.com, ackerleytng@google.com, mail@maciej.szmigiero.name, david@redhat.com, michael.roth@amd.com, wei.w.wang@intel.com, liam.merwick@oracle.com, isaku.yamahata@gmail.com, kirill.shutemov@linux.intel.com, suzuki.poulose@arm.com, steven.price@arm.com, quic_eberman@quicinc.com, quic_mnalajal@quicinc.com, quic_tsoni@quicinc.com, quic_svaddagi@quicinc.com, quic_cvanscha@quicinc.com, quic_pderrin@quicinc.com, quic_pheragu@quicinc.com, catalin.marinas@arm.com, james.morse@arm.com, yuzenghui@huawei.com, oliver.upton@linux.dev, maz@kernel.org, will@kernel.org, qperret@google.com, keirf@google.com, roypat@amazon.co.uk, shuah@kernel.org, hch@infradead.org, jgg@nvidia.com, rientjes@google.com, jhubbard@nvidia.com, fvdl@google.com, hughd@google.com, jthoughton@google.com, tabba@google.com 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 11 12:11:24 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Fuad Tabba X-Patchwork-Id: 13970150 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 87B8F24BD07 for ; Tue, 11 Feb 2025 12:11:48 +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=1739275910; cv=none; b=FdaPt68AqqXj7Co2QZOiGQTZk3uDPTfZkVI/JMyZnWAy8LhX7c/JCbYG2muD5jnJ6LXatrdTnF0srY6TAa+pSHNbfWknby/dnEmuGk4P855jZdFEeotdqTs1BQX1PrTytVaXtIFpgTvSUvk/5oELhijzQfKAdQRf1NheEM3G1L4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739275910; c=relaxed/simple; bh=+aFDNxcNb5lE2L1C2164P8GbTEPp8AZ3UFOEhPeXs7M=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=BacMewdUPeMYnpuS8qWMQ7Lwt/9ElmQ+ALZK5wahnQpX/IKTk63jsvLp+RAuRXmlbLcHO9FcyVKRgC7WA1QMYwzTBDIHUzgeBCWJraSn3Ri5VyThYT18SN32ebmmls+1s8agahPtbV9ZPlR+eVYiGWNjvLTIu/dMTTIVHVOIha4= 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=Dyoc5TrV; 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="Dyoc5TrV" Received: by mail-wm1-f73.google.com with SMTP id 5b1f17b1804b1-4395586f952so1991185e9.2 for ; Tue, 11 Feb 2025 04:11:48 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1739275907; x=1739880707; 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=aEy+uMDhoWpq4iTCT5JLvzuI0rE/4/GuORtNn1GWkCY=; b=Dyoc5TrVM+SiZIN+dRP1PXF7VSiG/q8TS41pur+XrucIw8faL/SxdCdgNH178Eo9fH Hbg6qB7nQlKPvvg+sZtKzVx6uHcJEouawwe8yNqkOUORqO5T2/Jygg/ySSa21WUKykgh 7T1xR7HTyu40xrUZU0gaGWhKhISniPY5QpOFgfJIkQA+V0FSrH5diAxny4wSJfvUTELN cWrs6AUZ9FWsjKt0fw3WUH1F+Eql3FqVQI+ABHeb25LRz4MwU5mW/R7/EAwoLi4/Ef9g 9orY89q7Hjqz5We1XQeHOj+ndLoovxzIG/iHR2eQa16YDc8/1riaUEjgC4f1HzuHniYI LUNw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1739275907; x=1739880707; 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=aEy+uMDhoWpq4iTCT5JLvzuI0rE/4/GuORtNn1GWkCY=; b=R7ikeAvh0qJK2GiuCH5+F1dryLwDnAw2iKq0rXRL8yBUs3wG+R58De8q8PpMcDHXGu POL29KQZ+NIMV0KYWT0Pku/4pTZMSZte+8yUkNZFCWi87hcpd9C6nut1Mdajwc10Fc3Y HAI+f6vmqg1YfwKUYNVr2wRm155n7bbz1qI1XKyBGx6Vve4uwBti0u6k60c+OshZ/5Gn nUGo1nW3ply24kc9syhAKaAl4Uva1GhMjnzhztpeESlUCvd3LFOMXrcJwRooWWJmAERP JBElH76ZpT0hcti/AfCZMmLptjT24qvWaO0r5FiljroJp9ysH1adC724T9RWlXEdRICy xYfQ== X-Gm-Message-State: AOJu0Ywe2vRnXFw6gkyPBd8ioEJ3c1vFfTgF9bqgNKWR89MCpjuEah4Z GR1MRdSN2x0TqBS2phmAI1z8cDZvKnFoBG1wRg6t01QF+8lb71HIeoZYpF5SkurPYkxS4jGI6VU Q0QdMWrbmT5UhX7DlxnPl7vTn13zQdDt78omIxfO4oK4Dyzs0+Atjc5VWrVvPIH4HAZDafi032l 014cJz+5bQlNRtFBFiJCgHalE= X-Google-Smtp-Source: AGHT+IFpMluwBrp1e1iVvzK5nRkJpIOD6K8YzM5QfPfRoI4YahF/GtcuCoo0tDbujX6eAm2iyJ7gmW+WFg== X-Received: from wmbhc12.prod.google.com ([2002:a05:600c:870c:b0:434:f2eb:aa72]) (user=tabba job=prod-delivery.src-stubby-dispatcher) by 2002:a5d:59a9:0:b0:38d:db8b:f50a with SMTP id ffacd0b85a97d-38ddb8bf6efmr8898263f8f.24.1739275906632; Tue, 11 Feb 2025 04:11:46 -0800 (PST) Date: Tue, 11 Feb 2025 12:11:24 +0000 In-Reply-To: <20250211121128.703390-1-tabba@google.com> Precedence: bulk X-Mailing-List: kvm@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250211121128.703390-1-tabba@google.com> X-Mailer: git-send-email 2.48.1.502.g6dc24dfdaf-goog Message-ID: <20250211121128.703390-9-tabba@google.com> Subject: [PATCH v3 08/11] 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, yu.c.zhang@linux.intel.com, isaku.yamahata@intel.com, mic@digikod.net, vbabka@suse.cz, vannapurve@google.com, ackerleytng@google.com, mail@maciej.szmigiero.name, david@redhat.com, michael.roth@amd.com, wei.w.wang@intel.com, liam.merwick@oracle.com, isaku.yamahata@gmail.com, kirill.shutemov@linux.intel.com, suzuki.poulose@arm.com, steven.price@arm.com, quic_eberman@quicinc.com, quic_mnalajal@quicinc.com, quic_tsoni@quicinc.com, quic_svaddagi@quicinc.com, quic_cvanscha@quicinc.com, quic_pderrin@quicinc.com, quic_pheragu@quicinc.com, catalin.marinas@arm.com, james.morse@arm.com, yuzenghui@huawei.com, oliver.upton@linux.dev, maz@kernel.org, will@kernel.org, qperret@google.com, keirf@google.com, roypat@amazon.co.uk, shuah@kernel.org, hch@infradead.org, jgg@nvidia.com, rientjes@google.com, jhubbard@nvidia.com, fvdl@google.com, hughd@google.com, jthoughton@google.com, tabba@google.com 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 | 84 ++++++++++++++++++++++++++-------------- include/linux/kvm_host.h | 5 +++ virt/kvm/kvm_main.c | 5 --- 3 files changed, 61 insertions(+), 33 deletions(-) diff --git a/arch/arm64/kvm/mmu.c b/arch/arm64/kvm/mmu.c index b6c0acb2311c..305060518766 100644 --- a/arch/arm64/kvm/mmu.c +++ b/arch/arm64/kvm/mmu.c @@ -1454,6 +1454,33 @@ 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; + + if (WARN_ON_ONCE(write_fault && memslot_is_readonly(slot))) + return KVM_PFN_ERR_NOSLOT_MASK; + + ret = kvm_gmem_get_pfn(kvm, slot, gfn, &pfn, page, NULL); + if (!ret) { + *writable = write_fault; + 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,25 +1488,26 @@ 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_private = kvm_mem_is_private(kvm, gfn); + bool force_pte = logging_active || is_private || 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; enum kvm_pgtable_walk_flags flags = KVM_PGTABLE_WALK_HANDLE_FAULT | KVM_PGTABLE_WALK_SHARED; - if (fault_is_perm) + if (fault_is_perm && !is_private) fault_granule = kvm_vcpu_trap_get_perm_fault_granule(vcpu); write_fault = kvm_is_write_fault(vcpu); exec_fault = kvm_vcpu_trap_is_exec_fault(vcpu); @@ -1510,24 +1538,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_private) { + 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 +1631,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 +1645,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_private); 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 39fd6e35c723..415c6274aede 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 11 12:11:25 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Fuad Tabba X-Patchwork-Id: 13970151 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 9C58D2512D4 for ; Tue, 11 Feb 2025 12:11:50 +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=1739275912; cv=none; b=X7LCg1vrcq+YXmwS3z0SPX2hhWT1gayg9ip6QQKy74+A+irzzNSvAWdED7bhV4iGLqM2E435yo13ZwS9y8SA3u20L6zUgVmWzQjcAB4Pq9qe+KjGE9wt+EVtE043xsZ3pPQzffo9I0kk6zCPFEOgrck7Qv+/IRS4dvgWtK2v2g8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739275912; c=relaxed/simple; bh=yd2zoiSRroZzy57L8R22NjfMbsVTKuInjB1zYX+cpzE=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=bPPa0QjTv3BaBQli6yQza3cF1tXRZxQNykFCCGBHCH1Pk+VaMeguz+ouANwJQW3uXHpe71yVjg8Qm3OP1Jcrd+q1j6GkQ9jkQjjGTCJ8aZVdFziFqZwEV0b1Bq/2ZpZYOn+3pBYxf0ex7mk1sJpGQCpZtx+VlFN8cOAs+i/kcto= 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=s7RJdFWY; 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="s7RJdFWY" Received: by mail-wm1-f74.google.com with SMTP id 5b1f17b1804b1-4395677bb0fso920645e9.0 for ; Tue, 11 Feb 2025 04:11:50 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1739275909; x=1739880709; 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=IJ2HgreXKQ9guyRW6q6qFyEzZtqTgMKMejRNrHWMuW4=; b=s7RJdFWYTt6wzIauxkQZPnoSW/esHy63NZOaza8lWQ++zQxPGcM1wjplmW1EtO8ddE WxfnK7l8bqVTiRaPLjmZjHHyMUJFIjDy3QcICW4rR15af8lpEPLdf+Wx9K0dmjewtK0Q wWfNeDdSeT0pQ3S7Q4pZ+WeX1OzroKVdJdDUJ81m7KAawXUREHXrX5cUEUNgOa7npQtv 30UqppjLV1CvCHhDgWnzUGEtya0WLs2FILYb31otLxNa/t2/DGrMxQn1TEq/qqME1qkD 0qMUG2rB5h+29hNRVwisSk52ioPOYYa9LgsVfF9PT1QuQrIZGzrO3AIKLFoXu7Q87a7O I43g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1739275909; x=1739880709; 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=IJ2HgreXKQ9guyRW6q6qFyEzZtqTgMKMejRNrHWMuW4=; b=J1tbG5Ec4cDATPOAnPNQZsWMVO8EsoyN2m86Wg4y4Vs1ITGrhUkgnelNW78mIe04hu eOQbK7Ej0+2ZPTFN7tsKNG4fL44//3oRfx959Z46BX53+0XVKjCpG/2ajoQ3tc94dwi4 RWnDUf8vqxJZqf6WM1XiQG/GWdbFfP4BENzrItLClFOOApRWIAPDyQYQ5vLywl7hT7im Uwj0vSJ2ThtWtxL0+QeMyMb8fdA7MroKiS1QldzCoRrG4PuIoflvlTvhW9lXILFPyX42 6nfAZ/U0JqerCwUbQaOacFplfmN6usBVWDAfAHUU8nBfZanEoZT6j4XzfUmFW1mfa3WV /b0g== X-Gm-Message-State: AOJu0Yy5tsKZIxLwBYRr+l9Bg94NqBx6ns8vcDMDF7e8GrjPVQpITT9/ GVRgvCpvpOFxHY2G+qk9xLfyhGzs+Gleo4q6eZD8nUKthsj6Xs3E+YrrvVuMGmaFhneP5+cctvr Spa23bMl7rreaVJiZSWZbnsnZhATziCnnxLsH4bhDT1gWLzMHul3Ndq57gCc1ZwaxQ4xXOVo7hz 6i+ekCBqiZtE1WFAEF7FE5GtY= X-Google-Smtp-Source: AGHT+IEj4XD0sGiUgxvZj8X1oAi0zbv38fYpf93jNGmxC+Jnpk8S/pLCTD5RS0c/7wEygEIr3cX4yUmedQ== X-Received: from wmbeq3.prod.google.com ([2002:a05:600c:8483:b0:436:1796:9989]) (user=tabba job=prod-delivery.src-stubby-dispatcher) by 2002:a05:600c:a0a:b0:434:a525:7257 with SMTP id 5b1f17b1804b1-439249abea0mr120725365e9.21.1739275908711; Tue, 11 Feb 2025 04:11:48 -0800 (PST) Date: Tue, 11 Feb 2025 12:11:25 +0000 In-Reply-To: <20250211121128.703390-1-tabba@google.com> Precedence: bulk X-Mailing-List: kvm@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250211121128.703390-1-tabba@google.com> X-Mailer: git-send-email 2.48.1.502.g6dc24dfdaf-goog Message-ID: <20250211121128.703390-10-tabba@google.com> Subject: [PATCH v3 09/11] KVM: arm64: Introduce KVM_VM_TYPE_ARM_SW_PROTECTED machine type From: Fuad Tabba To: kvm@vger.kernel.org, linux-arm-msm@vger.kernel.org, linux-mm@kvack.org Cc: pbonzini@redhat.com, chenhuacai@kernel.org, mpe@ellerman.id.au, anup@brainfault.org, paul.walmsley@sifive.com, palmer@dabbelt.com, aou@eecs.berkeley.edu, seanjc@google.com, viro@zeniv.linux.org.uk, brauner@kernel.org, willy@infradead.org, akpm@linux-foundation.org, xiaoyao.li@intel.com, yilun.xu@intel.com, chao.p.peng@linux.intel.com, jarkko@kernel.org, amoorthy@google.com, dmatlack@google.com, yu.c.zhang@linux.intel.com, isaku.yamahata@intel.com, mic@digikod.net, vbabka@suse.cz, vannapurve@google.com, ackerleytng@google.com, mail@maciej.szmigiero.name, david@redhat.com, michael.roth@amd.com, wei.w.wang@intel.com, liam.merwick@oracle.com, isaku.yamahata@gmail.com, kirill.shutemov@linux.intel.com, suzuki.poulose@arm.com, steven.price@arm.com, quic_eberman@quicinc.com, quic_mnalajal@quicinc.com, quic_tsoni@quicinc.com, quic_svaddagi@quicinc.com, quic_cvanscha@quicinc.com, quic_pderrin@quicinc.com, quic_pheragu@quicinc.com, catalin.marinas@arm.com, james.morse@arm.com, yuzenghui@huawei.com, oliver.upton@linux.dev, maz@kernel.org, will@kernel.org, qperret@google.com, keirf@google.com, roypat@amazon.co.uk, shuah@kernel.org, hch@infradead.org, jgg@nvidia.com, rientjes@google.com, jhubbard@nvidia.com, fvdl@google.com, hughd@google.com, jthoughton@google.com, tabba@google.com Introduce a new virtual machine type, KVM_VM_TYPE_ARM_SW_PROTECTED, to serve as a development and testing vehicle for Confidential (CoCo) VMs, similar to the x86 KVM_X86_SW_PROTECTED_VM type. Initially, this is used to test guest_memfd without needing any underlying protection. Similar to the x86 type, this is currently only for development and testing. Do not use KVM_VM_TYPE_ARM_SW_PROTECTED for "real" VMs, and especially not in production. The behavior and effective ABI for software-protected VMs is unstable. Signed-off-by: Fuad Tabba --- Documentation/virt/kvm/api.rst | 5 +++++ arch/arm64/include/asm/kvm_host.h | 10 ++++++++++ arch/arm64/kvm/arm.c | 5 +++++ arch/arm64/kvm/mmu.c | 3 --- include/uapi/linux/kvm.h | 6 ++++++ 5 files changed, 26 insertions(+), 3 deletions(-) diff --git a/Documentation/virt/kvm/api.rst b/Documentation/virt/kvm/api.rst index 2b52eb77e29c..0fccee4feee7 100644 --- a/Documentation/virt/kvm/api.rst +++ b/Documentation/virt/kvm/api.rst @@ -214,6 +214,11 @@ exposed by the guest CPUs in ID_AA64MMFR0_EL1[PARange]. It only affects size of the address translated by the stage2 level (guest physical to host physical address translations). +KVM_VM_TYPE_ARM_SW_PROTECTED is currently only for development and testing of +confidential VMs without having underlying support. Do not use +KVM_VM_TYPE_ARM_SW_PROTECTED for "real" VMs, and especially not in production. +The behavior and effective ABI for software-protected VMs is unstable. + 4.3 KVM_GET_MSR_INDEX_LIST, KVM_GET_MSR_FEATURE_INDEX_LIST ---------------------------------------------------------- diff --git a/arch/arm64/include/asm/kvm_host.h b/arch/arm64/include/asm/kvm_host.h index 7cfa024de4e3..a4276d56f54d 100644 --- a/arch/arm64/include/asm/kvm_host.h +++ b/arch/arm64/include/asm/kvm_host.h @@ -383,6 +383,8 @@ struct kvm_arch { * the associated pKVM instance in the hypervisor. */ struct kvm_protected_vm pkvm; + + unsigned long vm_type; }; struct kvm_vcpu_fault_info { @@ -1555,4 +1557,12 @@ 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)) +#define kvm_arch_has_private_mem(kvm) \ + (IS_ENABLED(CONFIG_KVM_PRIVATE_MEM) && \ + ((kvm)->arch.vm_type & KVM_VM_TYPE_ARM_SW_PROTECTED)) + +#define kvm_arch_gmem_supports_shared_mem(kvm) \ + (IS_ENABLED(CONFIG_KVM_GMEM_SHARED_MEM) && \ + ((kvm)->arch.vm_type & KVM_VM_TYPE_ARM_SW_PROTECTED)) + #endif /* __ARM64_KVM_HOST_H__ */ diff --git a/arch/arm64/kvm/arm.c b/arch/arm64/kvm/arm.c index 071a7d75be68..a2066db52ada 100644 --- a/arch/arm64/kvm/arm.c +++ b/arch/arm64/kvm/arm.c @@ -146,6 +146,9 @@ int kvm_arch_init_vm(struct kvm *kvm, unsigned long type) { int ret; + if (type & ~KVM_VM_TYPE_MASK) + return -EINVAL; + mutex_init(&kvm->arch.config_lock); #ifdef CONFIG_LOCKDEP @@ -187,6 +190,8 @@ int kvm_arch_init_vm(struct kvm *kvm, unsigned long type) bitmap_zero(kvm->arch.vcpu_features, KVM_VCPU_MAX_FEATURES); + kvm->arch.vm_type = type; + return 0; err_free_cpumask: diff --git a/arch/arm64/kvm/mmu.c b/arch/arm64/kvm/mmu.c index 305060518766..b89649d31127 100644 --- a/arch/arm64/kvm/mmu.c +++ b/arch/arm64/kvm/mmu.c @@ -882,9 +882,6 @@ static int kvm_init_ipa_range(struct kvm_s2_mmu *mmu, unsigned long type) u64 mmfr0, mmfr1; u32 phys_shift; - if (type & ~KVM_VM_TYPE_ARM_IPA_SIZE_MASK) - return -EINVAL; - phys_shift = KVM_VM_TYPE_ARM_IPA_SIZE(type); if (is_protected_kvm_enabled()) { phys_shift = kvm_ipa_limit; diff --git a/include/uapi/linux/kvm.h b/include/uapi/linux/kvm.h index 117937a895da..f155d3781e08 100644 --- a/include/uapi/linux/kvm.h +++ b/include/uapi/linux/kvm.h @@ -652,6 +652,12 @@ struct kvm_enable_cap { #define KVM_VM_TYPE_ARM_IPA_SIZE_MASK 0xffULL #define KVM_VM_TYPE_ARM_IPA_SIZE(x) \ ((x) & KVM_VM_TYPE_ARM_IPA_SIZE_MASK) + +#define KVM_VM_TYPE_ARM_SW_PROTECTED (1UL << 9) + +#define KVM_VM_TYPE_MASK (KVM_VM_TYPE_ARM_IPA_SIZE_MASK | \ + KVM_VM_TYPE_ARM_SW_PROTECTED) + /* * ioctls for /dev/kvm fds: */ From patchwork Tue Feb 11 12:11:26 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Fuad Tabba X-Patchwork-Id: 13970152 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 024212512E7 for ; Tue, 11 Feb 2025 12:11:52 +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=1739275914; cv=none; b=g963REXjFBc2i4erJNok77//D1RzXwgQQG2puXhK9H46RYC3cL8yHbtsGLoj8kx+yqSrngb7+BphkhDYQlXgOlZetaoxc9oCFofKrI4YocyQppUn1STB2DNUdxVsSPBe2yPV9oJKo/keef3FMVgG7Ty/fvWRzXcBOoUqLzXJxtk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739275914; c=relaxed/simple; bh=Xjz8ZI7LqjSb0qALmI99DAbNRCMwGMVjteTHHYQ4dJQ=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=QL9n92iyMdsAMuFzPxW5RakyGhA6lAwWruLC/UcuDnDZk4sYAxGzPrUOY/YMSp+OBFXOkM+yAEgOOI9XLe2/2/ep22j5yunCTzKZo98I7D1anVtzoesKj3KRx4CE+u+ERnGtMUv14BtmcpwoUZ8zvGT8rh6svp1kqCPtIvqx+jM= 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=kUNzIIwq; 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="kUNzIIwq" Received: by mail-wr1-f74.google.com with SMTP id ffacd0b85a97d-38dbdc2926eso245f8f.2 for ; Tue, 11 Feb 2025 04:11:52 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1739275911; x=1739880711; 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=9SmIo8QGaSGW4O/nm3ipq/SJW3NddPOH9GGmfIatxcE=; b=kUNzIIwqnbluC+H7Brm6hqJsAfIUzWP0idHXR+zDdKcBDeeU+vZbCNZkmSBPWrMQWK TTd9UZkwjGWBzkm5v9w3nHQU0/RnKNgOllust1F5/Opq9oWeOR+l2Zkoq5TPRy1TpkpN dCUBY8i9gMt68aiSIwPq6A0Httw+sqxjz9FeX9l8sjIE75UrEFvX+hDYe4MEn+ljvcGT 0t3Oia28httljmZbpcFuLujRfVxyNRTQfEqfxqXy/UDeFV0dXKzyzoPaOZNY5IlLZeB5 i08GKfc7d+vTb8a/KjkT1YIvoE4/YbzebixwG0aTFO7WtLcem4hHW18f9bSP8jDJk26N wkTg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1739275911; x=1739880711; 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=9SmIo8QGaSGW4O/nm3ipq/SJW3NddPOH9GGmfIatxcE=; b=ePZ59aBSt0WbWgM1+xXqaIAOPrTjiCvkKDIitN2NCGn5uHGvUW0WzjYZVAuDNpEVoS jubZBBEJD8gPEz2+F1b0jCeULRiQ1bgeCkr1rkpQHRkW1EZY17wJcRQw3OLR8O/e63eN tMPjMESspr83uiN0J9G20u/aaS6mT99hMI8D/dcViQaoUqzCbqra0TDjEMT94MGMVHBJ vQyVI+hvb9WNkRdm2NGaONU6fPOEY8wl/XuhBt/EY3yaVJ/UaiDZ1rGfVcyO+jI9Wlnj 3b8eeVS+wlZJUS0f6KZmdDRUKW5apcF7sci1XsYoQwN1PHeG6tY4MOvOx5+PZPYVuCjo VrbQ== X-Gm-Message-State: AOJu0YxzIM/Edx8WzlmxiTANalqfdpFfMbZZIMnhTCAUbCnq+X9lEy5C VbVMsSzMu7HG+sHZ/2kGdP5VQVwaVEgmQh4cokem37RwBA16h8NUBFKddpeVpIbiGDR7qmMKAyF /VM01ZdpESEysufShA2sHs+p3y59cXgM88jCIAgvTXU4xENRa6RpV1t6XF++ZAY2/Gm7AblWH5M 0UfWmDndPjYYHQtxxqz3qoX74= X-Google-Smtp-Source: AGHT+IH0xuxWTGEs9x087sQRaUuSBVW+q25VqdZB2aOt6dDiT4Tp+EMY0I0pqw4sShmqWhjrTgxeK/obMw== X-Received: from wmbay40.prod.google.com ([2002:a05:600c:1e28:b0:439:3e30:957a]) (user=tabba job=prod-delivery.src-stubby-dispatcher) by 2002:a5d:47c3:0:b0:38d:e166:8dc2 with SMTP id ffacd0b85a97d-38de1669178mr6366905f8f.16.1739275911124; Tue, 11 Feb 2025 04:11:51 -0800 (PST) Date: Tue, 11 Feb 2025 12:11:26 +0000 In-Reply-To: <20250211121128.703390-1-tabba@google.com> Precedence: bulk X-Mailing-List: kvm@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250211121128.703390-1-tabba@google.com> X-Mailer: git-send-email 2.48.1.502.g6dc24dfdaf-goog Message-ID: <20250211121128.703390-11-tabba@google.com> Subject: [PATCH v3 10/11] 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, yu.c.zhang@linux.intel.com, isaku.yamahata@intel.com, mic@digikod.net, vbabka@suse.cz, vannapurve@google.com, ackerleytng@google.com, mail@maciej.szmigiero.name, david@redhat.com, michael.roth@amd.com, wei.w.wang@intel.com, liam.merwick@oracle.com, isaku.yamahata@gmail.com, kirill.shutemov@linux.intel.com, suzuki.poulose@arm.com, steven.price@arm.com, quic_eberman@quicinc.com, quic_mnalajal@quicinc.com, quic_tsoni@quicinc.com, quic_svaddagi@quicinc.com, quic_cvanscha@quicinc.com, quic_pderrin@quicinc.com, quic_pheragu@quicinc.com, catalin.marinas@arm.com, james.morse@arm.com, yuzenghui@huawei.com, oliver.upton@linux.dev, maz@kernel.org, will@kernel.org, qperret@google.com, keirf@google.com, roypat@amazon.co.uk, shuah@kernel.org, hch@infradead.org, jgg@nvidia.com, rientjes@google.com, jhubbard@nvidia.com, fvdl@google.com, hughd@google.com, jthoughton@google.com, tabba@google.com Enable mapping guest_memfd in arm64, which would only apply to VMs with the type KVM_VM_TYPE_ARM_SW_PROTECTED. Signed-off-by: Fuad Tabba --- arch/arm64/kvm/Kconfig | 1 + 1 file changed, 1 insertion(+) 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 11 12:11:27 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Fuad Tabba X-Patchwork-Id: 13970153 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 66E282512FD for ; Tue, 11 Feb 2025 12:11:55 +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=1739275917; cv=none; b=N4SQrIf85isDGffHykmPHTABEc6bKSw5Vvd+SMVrgmBuQvAVPx4fF143XXXCL0WAjaFxgeXTIeDLJRqHtaGAqouAD8erAJE9405Y3uWnW9+9ARrZ5C0rSGCmZXMkHCEjO+B7XyYNr7oW8PHfoHZubg4kzpqmb6GXOP+3D7t4DBk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739275917; c=relaxed/simple; bh=yuptmyKnBI5fTNV9BPCQ1yDUdHKbCQPxXGUL0kF+AIk=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=Vx46Qd1DzclopejgSTRtCWoaOiLlcuOrHvAgaQ0W2zB/v70NNcha7MUz98Dhc1oOMbAGGpoj58WmYKnR4EAX4cnSG25PA5aIla65mO4pwNhEPog4JPCXGsgd5vENagMQFN9HXOJ4p806izUn0Qdb6wL2CGlzSfR9RGUpk3aaXMg= 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=KHyGmP/B; 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="KHyGmP/B" Received: by mail-wm1-f73.google.com with SMTP id 5b1f17b1804b1-4393e89e910so13395805e9.0 for ; Tue, 11 Feb 2025 04:11:55 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1739275914; x=1739880714; 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=0Z6E+H+CVdcl32MPqQH2IMjpdY1rfB5MHlrVNopXX+Y=; b=KHyGmP/BG9UEypi+PSBigTTNAUZdKbW77N2hOyaHDSmdXYmuLXkc75lojQkijCKZaA hhJ3pIBqsXxscwoxdTfMsr6EpZWCM6UigaiHd9vKfJ6i7rmw2VUfHcaGfqQByFegHVez UYMAnyRCulfA8fBo+eoF6lad439/SrhGPj70Bjc04aD+V1s2fuweJhL2plz4m6KviOE7 bMk9pXIUesWqRznVy9Q0tTZu0viTDZ10TaoJGBuCQzneyJssNZgCD8XZuLzvo30cJP5g qgRHcsxNtge1bMzb3LGbJKhnd59UO0exWgcs4vMGhE3tgJpRiAkuMO9FFSdmuBEwzv1B ZAug== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1739275914; x=1739880714; 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=0Z6E+H+CVdcl32MPqQH2IMjpdY1rfB5MHlrVNopXX+Y=; b=QR4cyossuFEEllwtVk7GFrokBlv0KdZQRhWKT27sNi7o74W+WmBf7NOJy6Br1XwDY2 QxhGaj3DZ1RJCDzCLFel4qYBOw5bQm0YOn0i8X1vWI7TOcVSgXurRNQ28YNQAXaByKxt R4Z8OQPaMyTLkqhCAQ1K0/V1SZSVJ4wekxxmhfzkj/xM6cfuSqOBXUbRf2qzt5pru4w1 Qw5xmuSkiOFwhCFBI9NO4b2ylBHUDPaBn9Wc992jQ19s5R7gMdvBVw/y/X6PBk+1PwCP 2YicOx2hpfS719PKbZvyzS2syJF8X5WNZyyYArgCoq9bKWKm6IXanfd2ywnWaHBYuvcz PaGg== X-Gm-Message-State: AOJu0YzvLExlDyok1Jw8KYV+b/WCDlJb9uTKHpnp2/KjT4owi7tP4gdC ro1nfABa3YpZMYK6WPglVJY+xjKAFKjEXhiFOsqKEztPRPW8vUZVs7mA0u38uAs/I8lFT7p/cLh ajICR+yokjHvyy9EV+0Gj8ab1EHiAzz3wzbGgkVTo6zaLqqBzxE8gSxB2yIYV0ggwE5f2BnvtXB YEsFnSyl3aesXg03ooRMtmsrw= X-Google-Smtp-Source: AGHT+IFt5+7gpCuP4nql5X9TS6iRdHHoSwQcx2BpSBXHd9t1p6f34BIlOh4b2HrfUl+cmCslb38pfVfhKw== X-Received: from wmbea8.prod.google.com ([2002:a05:600c:6748:b0:439:42cb:132d]) (user=tabba job=prod-delivery.src-stubby-dispatcher) by 2002:a05:600c:1c8c:b0:434:a468:4a57 with SMTP id 5b1f17b1804b1-439249ca925mr120732765e9.26.1739275913615; Tue, 11 Feb 2025 04:11:53 -0800 (PST) Date: Tue, 11 Feb 2025 12:11:27 +0000 In-Reply-To: <20250211121128.703390-1-tabba@google.com> Precedence: bulk X-Mailing-List: kvm@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250211121128.703390-1-tabba@google.com> X-Mailer: git-send-email 2.48.1.502.g6dc24dfdaf-goog Message-ID: <20250211121128.703390-12-tabba@google.com> Subject: [PATCH v3 11/11] 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, yu.c.zhang@linux.intel.com, isaku.yamahata@intel.com, mic@digikod.net, vbabka@suse.cz, vannapurve@google.com, ackerleytng@google.com, mail@maciej.szmigiero.name, david@redhat.com, michael.roth@amd.com, wei.w.wang@intel.com, liam.merwick@oracle.com, isaku.yamahata@gmail.com, kirill.shutemov@linux.intel.com, suzuki.poulose@arm.com, steven.price@arm.com, quic_eberman@quicinc.com, quic_mnalajal@quicinc.com, quic_tsoni@quicinc.com, quic_svaddagi@quicinc.com, quic_cvanscha@quicinc.com, quic_pderrin@quicinc.com, quic_pheragu@quicinc.com, catalin.marinas@arm.com, james.morse@arm.com, yuzenghui@huawei.com, oliver.upton@linux.dev, maz@kernel.org, will@kernel.org, qperret@google.com, keirf@google.com, roypat@amazon.co.uk, shuah@kernel.org, hch@infradead.org, jgg@nvidia.com, rientjes@google.com, jhubbard@nvidia.com, fvdl@google.com, hughd@google.com, jthoughton@google.com, tabba@google.com 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 +++++++++++++++++-- tools/testing/selftests/kvm/lib/kvm_util.c | 3 +- 3 files changed, 71 insertions(+), 8 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..f1e89f72b89f 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,30 @@ 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 +#ifdef __aarch64__ + return KVM_VM_TYPE_ARM_SW_PROTECTED; +#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 +237,26 @@ 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[]) +{ + test_vm_type(VM_TYPE_DEFAULT, false); + + if (kvm_has_cap(KVM_CAP_GMEM_SHARED_MEM)) + test_vm_type(get_shared_type(), true); + + return 0; } diff --git a/tools/testing/selftests/kvm/lib/kvm_util.c b/tools/testing/selftests/kvm/lib/kvm_util.c index 33fefeb3ca44..17aed505746b 100644 --- a/tools/testing/selftests/kvm/lib/kvm_util.c +++ b/tools/testing/selftests/kvm/lib/kvm_util.c @@ -347,9 +347,8 @@ struct kvm_vm *____vm_create(struct vm_shape shape) } #ifdef __aarch64__ - TEST_ASSERT(!vm->type, "ARM doesn't support test-provided types"); if (vm->pa_bits != 40) - vm->type = KVM_VM_TYPE_ARM_IPA_SIZE(vm->pa_bits); + vm->type |= KVM_VM_TYPE_ARM_IPA_SIZE(vm->pa_bits); #endif vm_open(vm);