From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 00E16C282EC for ; Fri, 14 Mar 2025 18:47:04 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 2F5DF280003; Fri, 14 Mar 2025 14:47:03 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 27F5A280001; Fri, 14 Mar 2025 14:47:03 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 121C6280003; Fri, 14 Mar 2025 14:47:03 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0012.hostedemail.com [216.40.44.12]) by kanga.kvack.org (Postfix) with ESMTP id E575F280001 for ; Fri, 14 Mar 2025 14:47:02 -0400 (EDT) Received: from smtpin05.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay07.hostedemail.com (Postfix) with ESMTP id 632CB161528 for ; Fri, 14 Mar 2025 18:47:03 +0000 (UTC) X-FDA: 83221038726.05.CDA43B1 Received: from mail-pj1-f74.google.com (mail-pj1-f74.google.com [209.85.216.74]) by imf25.hostedemail.com (Postfix) with ESMTP id B5380A0014 for ; Fri, 14 Mar 2025 18:47:01 +0000 (UTC) Authentication-Results: imf25.hostedemail.com; dkim=pass header.d=google.com header.s=20230601 header.b=V+pTfBus; spf=pass (imf25.hostedemail.com: domain of 3pHnUZwsKCC8LNVPcWPjeYRRZZRWP.NZXWTYfi-XXVgLNV.ZcR@flex--ackerleytng.bounces.google.com designates 209.85.216.74 as permitted sender) smtp.mailfrom=3pHnUZwsKCC8LNVPcWPjeYRRZZRWP.NZXWTYfi-XXVgLNV.ZcR@flex--ackerleytng.bounces.google.com; dmarc=pass (policy=reject) header.from=google.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1741978021; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type:content-transfer-encoding: in-reply-to:in-reply-to:references:dkim-signature; bh=G8BSRuYn8KeNNKWnEiWpWmj0CAZVyouloPrj65g6XRA=; b=z9dnwdSfQHW1IuONGdFaiY1704qWIpD5CoV0VBr3vIjvvEQvBgSnFJq9nZlU2dY886a2Fd CYjA2CdfibtXaAAm1VNrY6sBasrSTjicaJGWoFEZ+o7j5BksYHAzrYgL0w1NuiZ+OtrRd5 LnQI7JXgCk3uvDjyHSsBtHTWTcGyEYs= ARC-Authentication-Results: i=1; imf25.hostedemail.com; dkim=pass header.d=google.com header.s=20230601 header.b=V+pTfBus; spf=pass (imf25.hostedemail.com: domain of 3pHnUZwsKCC8LNVPcWPjeYRRZZRWP.NZXWTYfi-XXVgLNV.ZcR@flex--ackerleytng.bounces.google.com designates 209.85.216.74 as permitted sender) smtp.mailfrom=3pHnUZwsKCC8LNVPcWPjeYRRZZRWP.NZXWTYfi-XXVgLNV.ZcR@flex--ackerleytng.bounces.google.com; dmarc=pass (policy=reject) header.from=google.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1741978021; a=rsa-sha256; cv=none; b=NzApdK+0+/lFV+HHwB0MPCvr7ckPf18ree0sd2N2a3sjKxli1KQAl48h3Whe2uhGmNNEdM rVv0gxHGc0PRYe3fp0vjKLl8Pr1d9diKxXByOJneGAa4rOGizljpDTXlxu5e9fKGinmusS yE+8dQtX9RAOHU9JQOnjF8XOmEK1Foo= Received: by mail-pj1-f74.google.com with SMTP id 98e67ed59e1d1-2feb47c6757so33323a91.3 for ; Fri, 14 Mar 2025 11:47:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1741978020; x=1742582820; darn=kvack.org; h=cc:to:from:subject:message-id:mime-version:in-reply-to:date:from:to :cc:subject:date:message-id:reply-to; bh=G8BSRuYn8KeNNKWnEiWpWmj0CAZVyouloPrj65g6XRA=; b=V+pTfBusNjy7RR6k7dan3Q7KkLFi/4HtsB7JXiqhEgnJMK0SVnq05EMa6FY2FtMJyX SRY8MHyiPM0DUiBfvTNyXKr4Lh6BNgvPngyfKiILpiyzzuDDhPxtFnOP4f8/P6bWTl0u 1/o6mPsZXUMviV8OMlMQD4FJqHCkSf4i6BqPtITNkK1qIESi1laJiXbRfcb4Lot0KHiZ UpxMmmthz3ZDr3d96MLlV4kGkwsh0uGBYKD2qBzUSIYd3zyfXv91KxlKvX+AVjn2aLzY WPn9u6UyougNkjSiDDzQy2q1804r1c/aN6V4WJn/MMy0JaDuhuuQ6NG++Wtxesv+OnEW TE3g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741978020; x=1742582820; h=cc:to:from:subject:message-id:mime-version:in-reply-to:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=G8BSRuYn8KeNNKWnEiWpWmj0CAZVyouloPrj65g6XRA=; b=J30uBv5fG+0m3M1QjrmQwFm8CEEXW9tNeZREKyRQSS06R1iMLLO6GTX5RH7WshBbs/ 2w09S+remZ5CGtZosYKIPkE/PjKiqOyyJVESbctIbHizUGqOiCgCjrr8Bs83esCd9Uzu LZMZ5uQs1uSdySajR43DeingNKpUpyZbWojVpFuatMqjnHizezHFfzNqcdqPdNH8g72l tFwmXB4a5D5HLaz9mDfSy5CHv3UHF+TLaQsXmZvfonUEUBydyZgmMWbwu8NrIxPZEHuz cBla6+pKAbU+sTpQOn0CX4Dc1jnBuqgZXuqv+me+UvGH1mP5ucUJ6f2G39kxKwL4zx2C hmeg== X-Forwarded-Encrypted: i=1; AJvYcCXVfd8kCfFTeY2dvBCTQE8E5epHb6zBmk845wsd9FpPIYKvNQ2eevmHMGZOSycswXC54+9c+dITvw==@kvack.org X-Gm-Message-State: AOJu0YwdgJLQak4XYIt7qERGfmJs2+1FnJXdIZxlo/hUCvqP/+hGyBUR lYEA/pn0GyO4zUFPbz0xCiXSjyvSM3VgE+xg+zx09HUwc1rhWos8m1spb6m3rQpAf1Y5LnL98Km qgB8izNFixNVNse2wOPJA2A== X-Google-Smtp-Source: AGHT+IFnOUHozyBvrEzVKU15S1zj0eWgSlNFNHQ78f1k2qNDSePcqu/68jFbMHYM2FfRGrD7HcNv9AiHGbMehyTTNw== X-Received: from pjwx4.prod.google.com ([2002:a17:90a:c2c4:b0:2f5:63a:4513]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:3a08:b0:2fe:8217:2da6 with SMTP id 98e67ed59e1d1-30151d9d6eemr3990810a91.22.1741978020486; Fri, 14 Mar 2025 11:47:00 -0700 (PDT) Date: Fri, 14 Mar 2025 18:46:58 +0000 In-Reply-To: <20250312175824.1809636-5-tabba@google.com> (message from Fuad Tabba on Wed, 12 Mar 2025 17:58:17 +0000) Mime-Version: 1.0 Message-ID: Subject: Re: [PATCH v6 04/10] KVM: guest_memfd: Allow host to map guest_memfd() pages From: Ackerley Tng To: Fuad Tabba Cc: kvm@vger.kernel.org, linux-arm-msm@vger.kernel.org, linux-mm@kvack.org, pbonzini@redhat.com, chenhuacai@kernel.org, mpe@ellerman.id.au, anup@brainfault.org, paul.walmsley@sifive.com, palmer@dabbelt.com, aou@eecs.berkeley.edu, seanjc@google.com, viro@zeniv.linux.org.uk, brauner@kernel.org, willy@infradead.org, akpm@linux-foundation.org, xiaoyao.li@intel.com, yilun.xu@intel.com, chao.p.peng@linux.intel.com, jarkko@kernel.org, amoorthy@google.com, dmatlack@google.com, isaku.yamahata@intel.com, mic@digikod.net, vbabka@suse.cz, vannapurve@google.com, mail@maciej.szmigiero.name, david@redhat.com, michael.roth@amd.com, wei.w.wang@intel.com, liam.merwick@oracle.com, isaku.yamahata@gmail.com, kirill.shutemov@linux.intel.com, suzuki.poulose@arm.com, steven.price@arm.com, quic_eberman@quicinc.com, quic_mnalajal@quicinc.com, quic_tsoni@quicinc.com, quic_svaddagi@quicinc.com, quic_cvanscha@quicinc.com, quic_pderrin@quicinc.com, quic_pheragu@quicinc.com, catalin.marinas@arm.com, james.morse@arm.com, yuzenghui@huawei.com, oliver.upton@linux.dev, maz@kernel.org, will@kernel.org, qperret@google.com, keirf@google.com, roypat@amazon.co.uk, shuah@kernel.org, hch@infradead.org, jgg@nvidia.com, rientjes@google.com, jhubbard@nvidia.com, fvdl@google.com, hughd@google.com, jthoughton@google.com, peterx@redhat.com, tabba@google.com Content-Type: text/plain; charset="UTF-8" X-Rspam-User: X-Rspamd-Queue-Id: B5380A0014 X-Rspamd-Server: rspam03 X-Stat-Signature: 5csouf7m9eujfhjmdnymdrhhj97okmh3 X-HE-Tag: 1741978021-555569 X-HE-Meta: U2FsdGVkX1/PbteZDNLP4LxDm5klG5r4RJVoMGYjORjSqMZ+603n0Hj+NQIVstq2kIUACBH8JACdwcCJr+KnoVUqhWZHbRJTPgpQK6/3LwAFUV6rcKpwqrqa5SsYSR6b/fU3fQpNhDbqan9fQLnZxitpDdnT+Ohy8Gqojmi1dsClyP7opLhqU3hxoFHfbgCqOp0SxbSIce4sp2/flqz2V4c2Fyl3QUeHNu4bF2kZeQg6CPq+D8SEy+BohaaaZk0ly85Aq3+F6DHOIAiDyCa6Ke6UUXH4dFjgZB2Cy+1tzKI93vnrfs8vXje6sVnOUEkusXtQqVNwo4T7gDLprlQd6g5M62ImLPhNP1o8JuEhMfrBmViJj6Fsh34qxy++sv1+/sPV7ExgTMD5pq+88X+IinkWxfmKJaVJ2qAh14IbtEd2Q752bjAom4W4BA9lTFGaBd3HLQgmj8Cxi8j4Z4yWWB4Hy9W0aTyY27XBE5q8eTsxAYfGtj5MPQ0peqNVhjf2w14heseGitnWDKQHbb1svg9cf+KaNjSdeo1BYYfUG3v96nvF+ASaKAGTenr8r1TWJbNhoQXJoD7fxeYcmMKTS4VTBilgQt7GgJebAyXsVLMU+0WgWXOguAySfhoEphBiUtKAKeW6CFjffxyb7JVj6wq+MnNZWPWbHafZHpRNHoLrTwPM7N95lHbTLDmHUC76srJr5jAe0Ep9rckwNxlJGTsb9F+mG6l3O9IV/2I+IhWRwrGFwuG2wIF2wKDymjPQ96Qfst+q1aSH4uFRm1hU45UnptPvNu71kXnlhxgByRSGCawcaFZxaXAI27MlwItLHxwHJ9zfkYUX3WIwdi69DhtqInqQsMlShBSod2Oj+gJ3sHBgEKP0ntkbW0/0F7cLAmyQP4HPO9rr3ziyTc1iheTkkJ7+MFphSrO2d53ADN+QvmDDiI2KtH8Gb4Iuem9i0A+pa/P1mswp5uR6tdA eWbdjoff 3pZQEfdd2JhqvgLX95ZEUc/vFCawH0VOwb55ykD3cE1UqM59rXmO+CVgiqhFegevAgN0nfL4+T4XxWgJUS20Q5zKqWLsTaPUStTcYEAETOxhSTcNLq7Ovwind9kjoL7yj6x4YtvbgEXRbQNsEQA4TvVnmF7BiLVDe8CZAiFmszAAzB1KQbXMt5RGx531XzVNg8E3tlpRg94r2YJ3Ae9Njr+j3W7LxGCLr1IZr5zL6pwT+4Ux0pAy5zQf4WJFavcm+JqZHIhZZhUHzTyNDPUvMtxPrUKj2MQQpm6LfzsjxJ+prktthAI1XZpL5JGULJ4pZ52zy9TnatIvgd+fOKoascDRmMKpeM7dDmD8GWBM561oUfERgniUKoTt29mO9A2RRPdDErdI9fDErd+OT+KFWCd+5cg== X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: Fuad Tabba writes: > Add support for mmap() and fault() for guest_memfd backed memory > in the host for VMs that support in-place conversion between > shared and private. To that end, this patch adds the ability to > check whether the VM type supports in-place conversion, and only > allows mapping its memory if that's the case. > > Also add the KVM capability KVM_CAP_GMEM_SHARED_MEM, which > indicates that the VM supports shared memory in guest_memfd, or > that the host can create VMs that support shared memory. > Supporting shared memory implies that memory can be mapped when > shared with the host. > > This is controlled by the KVM_GMEM_SHARED_MEM configuration > option. > > Signed-off-by: Fuad Tabba > --- > include/linux/kvm_host.h | 11 +++++ > include/uapi/linux/kvm.h | 1 + > virt/kvm/guest_memfd.c | 102 +++++++++++++++++++++++++++++++++++++++ > virt/kvm/kvm_main.c | 4 ++ > 4 files changed, 118 insertions(+) > > diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h > index 3ad0719bfc4f..601bbcaa5e41 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_GMEM_SHARED_MEM) > +static inline bool kvm_arch_gmem_supports_shared_mem(struct kvm *kvm) > +{ > + return false; > +} > +#endif > + > #ifndef kvm_arch_has_readonly_mem > static inline bool kvm_arch_has_readonly_mem(struct kvm *kvm) > { > diff --git a/include/uapi/linux/kvm.h b/include/uapi/linux/kvm.h > index 45e6d8fca9b9..117937a895da 100644 > --- a/include/uapi/linux/kvm.h > +++ b/include/uapi/linux/kvm.h > @@ -929,6 +929,7 @@ struct kvm_enable_cap { > #define KVM_CAP_PRE_FAULT_MEMORY 236 > #define KVM_CAP_X86_APIC_BUS_CYCLES_NS 237 > #define KVM_CAP_X86_GUEST_MODE 238 > +#define KVM_CAP_GMEM_SHARED_MEM 239 > > struct kvm_irq_routing_irqchip { > __u32 irqchip; > diff --git a/virt/kvm/guest_memfd.c b/virt/kvm/guest_memfd.c > index 5fc414becae5..eea44e003ed1 100644 > --- a/virt/kvm/guest_memfd.c > +++ b/virt/kvm/guest_memfd.c > @@ -320,7 +320,109 @@ static pgoff_t kvm_gmem_get_index(struct kvm_memory_slot *slot, gfn_t gfn) > return gfn - slot->base_gfn + slot->gmem.pgoff; > } > > +#ifdef CONFIG_KVM_GMEM_SHARED_MEM > +static bool folio_offset_is_shared(const struct folio *folio, struct file *file, pgoff_t index) > +{ > + struct kvm_gmem *gmem = file->private_data; > + > + VM_BUG_ON_FOLIO(!folio_test_locked(folio), folio); I should've commented on this in the last series, but why must folio lock be held to check if this offset is shared? I was thinking to use the filemap's lock (filemap_invalidate_lock()) to guard mappability races. Does that work too? > + > + /* 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)) { > + int err = PTR_ERR(folio); > + > + if (err == -EAGAIN) > + ret = VM_FAULT_RETRY; > + else > + ret = vmf_error(err); > + > + goto out_filemap; > + } > + > + if (folio_test_hwpoison(folio)) { > + ret = VM_FAULT_HWPOISON; > + goto out_folio; > + } > + > + if (!folio_offset_is_shared(folio, vmf->vma->vm_file, vmf->pgoff)) { > + ret = VM_FAULT_SIGBUS; > + goto out_folio; > + } > + > + /* > + * Shared folios would not be marked as "guestmem" so far, and we only > + * expect shared 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; > +} > + >