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 293FBC3ABDA for ; Wed, 14 May 2025 20:40:47 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 9723D6B00AC; Wed, 14 May 2025 16:40:46 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 8FE156B00C7; Wed, 14 May 2025 16:40:46 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 7748E6B00C8; Wed, 14 May 2025 16:40:46 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0017.hostedemail.com [216.40.44.17]) by kanga.kvack.org (Postfix) with ESMTP id 5722A6B00AC for ; Wed, 14 May 2025 16:40:46 -0400 (EDT) Received: from smtpin06.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay08.hostedemail.com (Postfix) with ESMTP id 0FAE114055D for ; Wed, 14 May 2025 20:40:46 +0000 (UTC) X-FDA: 83442682092.06.33FB29A Received: from mail-yw1-f177.google.com (mail-yw1-f177.google.com [209.85.128.177]) by imf17.hostedemail.com (Postfix) with ESMTP id 2813B40007 for ; Wed, 14 May 2025 20:40:43 +0000 (UTC) Authentication-Results: imf17.hostedemail.com; dkim=pass header.d=google.com header.s=20230601 header.b=pdn2JerX; spf=pass (imf17.hostedemail.com: domain of jthoughton@google.com designates 209.85.128.177 as permitted sender) smtp.mailfrom=jthoughton@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=1747255244; 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:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=T/7+afizZx7+/RQDjCUDJIpgGk5iqWIyw/rWqCvD/nw=; b=JgYj1+UcyZKQxQ/YyjSyQnHuCVJ9H+ptXQ7+v5uCHuup5XMrKRpcS+r7YW8a6eVRvEmDt4 MMwsxOOQTUKFElCftAL722VLJlk+PQZF0L6KGCGUN+tA8mNwVronF3x2SuCmw7kuwr16eJ yCrNDgBnIlXDnmQt100mAlt8+OPPat0= ARC-Authentication-Results: i=1; imf17.hostedemail.com; dkim=pass header.d=google.com header.s=20230601 header.b=pdn2JerX; spf=pass (imf17.hostedemail.com: domain of jthoughton@google.com designates 209.85.128.177 as permitted sender) smtp.mailfrom=jthoughton@google.com; dmarc=pass (policy=reject) header.from=google.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1747255244; a=rsa-sha256; cv=none; b=LmQNIIvP1OI1KS4dQEBriDRqY/g6JSn85L36PXZEXbhe1ZW65fBKIb/FL3C/UHqiTorZ2G UQ31wi4uuOx8KZ68PQ+1Ka+jMpoDVc+WCqqAhmuDGONBIg2YVqln42VDK+3C/8kMQZjHUr CfY4p0syLyRzb5HOLdh/OJMnUGWIE6s= Received: by mail-yw1-f177.google.com with SMTP id 00721157ae682-708ac7dfc19so2449857b3.3 for ; Wed, 14 May 2025 13:40:43 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1747255243; x=1747860043; darn=kvack.org; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:from:to:cc:subject:date :message-id:reply-to; bh=T/7+afizZx7+/RQDjCUDJIpgGk5iqWIyw/rWqCvD/nw=; b=pdn2JerXIe12c55AJUVGfTa6sDTn5vapVyHjp+98GcRWQNIczmqq5xN9+hWRRHmLaT qogEcTn/7g/whZvP3yHThUe6iXtFbgxeuqcBq2CvbmBAOZP9vPpjFvWS18EEx/cDZRc/ pgWUvRPmJX7SJpUGsX5kpH8QIiXhAVjEv3hXU/BHKHqu4RxcE7RtwHOhFH769EeCMTtp ON3kNHyKpXWh57pTNs0tbLb/M8AWFwIrTL8BerMIm8K20+7qMQuka7IZcaP+klAPXAuN psOC03yo3TfQOpuddhbcF1InU/7/CELL64aJCmrWm7i886m1KbwgxuOSrOrTGYY51M9q a0uA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1747255243; x=1747860043; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=T/7+afizZx7+/RQDjCUDJIpgGk5iqWIyw/rWqCvD/nw=; b=V1PopjcdfJNos7OPn0lfXUJD/85U4aIvArIwMXF4e7oPXdPaMoHBY46kvg2yYq6nF9 3Xobpci3ZRUVvhslb+Es3E/JckUmXUawlvpTT29eAvzzuE06OKg333sUYutOq/TaspnD i3ul2e72WndST4EXYirKO0WY4Wf+K62mJv+SpDJcHideAPN9VXhAGkLDlAfTAtfOP1CQ 6Iu3vREtDOSdzZsgrgcgewIW/ojbzL4G+ebJVhpkeH4bDVlZ3voUJ+2tP2ouFEx+22mm T0qdBtE5kNtM8y2mvlfVPoSj2Vt/DIzarZgjGxa/L8KK+GKQeTzfkUl+VM1bmSN9dDuD OCoQ== X-Forwarded-Encrypted: i=1; AJvYcCXGxOXbeSrZEb05dnKW3ssGDWo/agmiUJxQBcNZWeYAX/xTCeRu73ZS23fZupzYoa4sVldCl9ei5Q==@kvack.org X-Gm-Message-State: AOJu0YyXSx9i3Hco63HM0cbVudGWa0E/GtL3wNfkEtnMldkB4CRzcFEF 5XdWIjX6VOKeE7mVL2QU/UUhJJBSefxLCnlxJt6rY9jAXm3NOvN/HySI2etOjq3t6I5IjAVDDah 7nyIXqy9vYkgkxLgke3MokVvZYZRw4ks5YLAc X-Gm-Gg: ASbGncvRFHNvXJV2ytb7JSINofninzTOVoftUDMCIWSA/hdvoeFJ5sETExEF+sb6s1J 9/clhCw9AeYBk3lJLlcPcy7FjKyh0oTiMEAdhLHeAUHcvxfo5ZaNnES7dX5hVHpE+9YLpE0P2oL sWtKMB9PfY29Eosuyl/+Op31wr407Uby4P6Igq1hgQRHSa92UpADFANNnkhd+rMew= X-Google-Smtp-Source: AGHT+IHMOoxxNuOHFNWO8IK0boxKcMaNPhWodorBvd9h9FTfRV8OHIpNfD/gZaEW3uynJG2ygIW8tBaT72OOCtVP8aM= X-Received: by 2002:a05:690c:508d:b0:70c:9364:2c61 with SMTP id 00721157ae682-70c936433d2mr1717257b3.9.1747255242891; Wed, 14 May 2025 13:40:42 -0700 (PDT) MIME-Version: 1.0 References: <20250513163438.3942405-1-tabba@google.com> <20250513163438.3942405-8-tabba@google.com> In-Reply-To: <20250513163438.3942405-8-tabba@google.com> From: James Houghton Date: Wed, 14 May 2025 13:40:06 -0700 X-Gm-Features: AX0GCFtK2DyiNvyhImWHSxXTuu1QIux7oSRN4_q-FDUfQ5BDQ4-9OKFnUEDKbWU Message-ID: Subject: Re: [PATCH v9 07/17] KVM: guest_memfd: Allow host to map guest_memfd() pages 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, 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, peterx@redhat.com, pankaj.gupta@amd.com, ira.weiny@intel.com Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Rspamd-Queue-Id: 2813B40007 X-Rspam-User: X-Rspamd-Server: rspam11 X-Stat-Signature: nkq7z8hxzdmfi98bn5ucz9b1y9m63x8b X-HE-Tag: 1747255243-977357 X-HE-Meta: U2FsdGVkX1+6R6LxkIrWMD+BbGzXRJxERZ9X0lbMJHOwKf+JJmLzxa0WbrcEmcfE4QS+ivKZFiWDVCVgmaZVM9/WSWfzI+cymEPHirBYcd17iqOCgEPiwvs6jfj09IPO1qtm3tKrHyyt2AnhPC3xaWh9+M0ewWMVsnjlJJwDHaN9sQb28ft+W7a/94uLxMweJPdXNRsJvgcxFCp/qKh6VNLzmzb2RWyPpSdPtbHIfOBwTnJX7j/PKX7f91czOs+zG2k/BL+HYc6Pe9/E7hW4vrwAgkRqjLxolJKrFZ5uq6zym6pskgDlVd/Y4th5PLWxiRtWyeCwzpiYrXEpHQ6l5284DvY7P2ot7d4Gs7mcQi0vhFXY3UoSi7IYa7eF2UV5tWDUeg1/wWXxNBB9lF5izKX2imKVfzjxsh1Ufvt7w70zX9nvN6jbiZZgaO3Jf0pW0iVDFwrMcruJ8XEaRUEBFm5EMiQUyjQJ8QHHuj5L6UeBkRSQ4S6/g1+UoRXv4fHiHwxN17p6XZVN5PMImP4CV5TrMxbJ+1HWCUkM+Ol5S+MsREFSyi6rTsRWN7VhUGTzgOqj7+RC89esN00lxaiZ2zWjIc+v8cCCHdDYPwamB0BvThSGOou8tIKuo7ZZFaehMnIZh0LNzZFKd1ox0nUVV8MvmxHpwsXB/Eo9wcDcNLf6pwzk9/kHH/wcUz5uWQ4cX+YLwq6RW80Uy9J2nB9Q8aoykSV8w62EZij6ciNBdsd/KGeRFM5EVFEpBKsq4Ylkh8sSVTLvAfLXZPn+t1ccqETfPTGOu8vIgqp6eXKD526pbyF13QGnczuzatk8sWCQ2tK05rXSO2PSLc2CNlQY0hlcWJC7DxKcoYzuJsis/dFhOMf1fzRp0m4wp0KnkbFAaZL4p/pTmq6Aap6JL7pW8TjPcwoZRDAeoNp5m0ZOQim8csoh8OPanf6e5Osef988FV1fICD5HMOybuHMKoQ WgQvy80c jXGQwFv02vBWwDKrPp94R8JrqsBy4/vjfDlU8k5JL+VM45jBTQvDXF56c4kNUSZK+slcKrLtLUt3mqVykHvIPieHR4YnVQrUdmJrAZ2H8sxi0Gqt1Ab7rraP2Y3yB6bHWlZxMcPjOUDVvVQYCo2B+27O7C3fy/T08CHbmkPfTrjCMKnqB4seTZ67w8M1m2x2YcG+qLboKp+Y1nbItDQH+FTGuND7EWZFY9WNXPyXwOGI+PaUIU3VTS/EDohERywBlPR7L94yBahyPGED4/9HRCl+MYoqb+RRA2kC1cSBbcOlAwmU9MofNrVwTdQ/+e5p/LgbZC70TtapZxWrK7RbwB65Itw== 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: , On Tue, May 13, 2025 at 9:34=E2=80=AFAM Fuad Tabba wrote= : > > This patch enables support for shared memory in guest_memfd, including > mapping that memory at the host userspace. This support is gated by the > configuration option KVM_GMEM_SHARED_MEM, and toggled by the guest_memfd > flag GUEST_MEMFD_FLAG_SUPPORT_SHARED, which can be set when creating a > guest_memfd instance. > > Co-developed-by: Ackerley Tng > Signed-off-by: Ackerley Tng > Signed-off-by: Fuad Tabba > --- > arch/x86/include/asm/kvm_host.h | 10 ++++ > include/linux/kvm_host.h | 13 +++++ > include/uapi/linux/kvm.h | 1 + > virt/kvm/Kconfig | 5 ++ > virt/kvm/guest_memfd.c | 88 +++++++++++++++++++++++++++++++++ > 5 files changed, 117 insertions(+) > > diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_h= ost.h > index 709cc2a7ba66..f72722949cae 100644 > --- a/arch/x86/include/asm/kvm_host.h > +++ b/arch/x86/include/asm/kvm_host.h > @@ -2255,8 +2255,18 @@ void kvm_configure_mmu(bool enable_tdp, int tdp_fo= rced_root_level, > > #ifdef CONFIG_KVM_GMEM > #define kvm_arch_supports_gmem(kvm) ((kvm)->arch.supports_gmem) > + > +/* > + * CoCo VMs with hardware support that use guest_memfd only for backing = private > + * memory, e.g., TDX, cannot use guest_memfd with userspace mapping enab= led. > + */ > +#define kvm_arch_vm_supports_gmem_shared_mem(kvm) \ > + (IS_ENABLED(CONFIG_KVM_GMEM_SHARED_MEM) && \ > + ((kvm)->arch.vm_type =3D=3D KVM_X86_SW_PROTECTED_VM || = \ > + (kvm)->arch.vm_type =3D=3D KVM_X86_DEFAULT_VM)) > #else > #define kvm_arch_supports_gmem(kvm) false > +#define kvm_arch_vm_supports_gmem_shared_mem(kvm) false > #endif > > #define kvm_arch_has_readonly_mem(kvm) (!(kvm)->arch.has_protected_state= ) > diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h > index ae70e4e19700..2ec89c214978 100644 > --- a/include/linux/kvm_host.h > +++ b/include/linux/kvm_host.h > @@ -729,6 +729,19 @@ static inline bool kvm_arch_supports_gmem(struct kvm= *kvm) > } > #endif > > +/* > + * Returns true if this VM supports shared mem in guest_memfd. > + * > + * Arch code must define kvm_arch_vm_supports_gmem_shared_mem if support= for > + * guest_memfd is enabled. > + */ > +#if !defined(kvm_arch_vm_supports_gmem_shared_mem) && !IS_ENABLED(CONFIG= _KVM_GMEM) > +static inline bool kvm_arch_vm_supports_gmem_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 b6ae8ad8934b..9857022a0f0c 100644 > --- a/include/uapi/linux/kvm.h > +++ b/include/uapi/linux/kvm.h > @@ -1566,6 +1566,7 @@ struct kvm_memory_attributes { > #define KVM_MEMORY_ATTRIBUTE_PRIVATE (1ULL << 3) > > #define KVM_CREATE_GUEST_MEMFD _IOWR(KVMIO, 0xd4, struct kvm_create_gue= st_memfd) > +#define GUEST_MEMFD_FLAG_SUPPORT_SHARED (1UL << 0) > > struct kvm_create_guest_memfd { > __u64 size; > diff --git a/virt/kvm/Kconfig b/virt/kvm/Kconfig > index 559c93ad90be..f4e469a62a60 100644 > --- a/virt/kvm/Kconfig > +++ b/virt/kvm/Kconfig > @@ -128,3 +128,8 @@ config HAVE_KVM_ARCH_GMEM_PREPARE > config HAVE_KVM_ARCH_GMEM_INVALIDATE > bool > depends on KVM_GMEM > + > +config KVM_GMEM_SHARED_MEM > + select KVM_GMEM > + bool > + prompt "Enables in-place shared memory for guest_memfd" > diff --git a/virt/kvm/guest_memfd.c b/virt/kvm/guest_memfd.c > index 6db515833f61..8e6d1866b55e 100644 > --- a/virt/kvm/guest_memfd.c > +++ b/virt/kvm/guest_memfd.c > @@ -312,7 +312,88 @@ static pgoff_t kvm_gmem_get_index(struct kvm_memory_= slot *slot, gfn_t gfn) > return gfn - slot->base_gfn + slot->gmem.pgoff; > } > > +#ifdef CONFIG_KVM_GMEM_SHARED_MEM > + > +static bool kvm_gmem_supports_shared(struct inode *inode) > +{ > + uint64_t flags =3D (uint64_t)inode->i_private; > + > + return flags & GUEST_MEMFD_FLAG_SUPPORT_SHARED; > +} > + > +static vm_fault_t kvm_gmem_fault_shared(struct vm_fault *vmf) > +{ > + struct inode *inode =3D file_inode(vmf->vma->vm_file); > + struct folio *folio; > + vm_fault_t ret =3D VM_FAULT_LOCKED; > + > + filemap_invalidate_lock_shared(inode->i_mapping); > + > + folio =3D kvm_gmem_get_folio(inode, vmf->pgoff); > + if (IS_ERR(folio)) { > + int err =3D PTR_ERR(folio); > + > + if (err =3D=3D -EAGAIN) > + ret =3D VM_FAULT_RETRY; > + else > + ret =3D vmf_error(err); > + > + goto out_filemap; > + } > + > + if (folio_test_hwpoison(folio)) { > + ret =3D VM_FAULT_HWPOISON; > + goto out_folio; > + } > + > + if (WARN_ON_ONCE(folio_test_large(folio))) { > + ret =3D VM_FAULT_SIGBUS; > + goto out_folio; > + } > + > + if (!folio_test_uptodate(folio)) { > + clear_highpage(folio_page(folio, 0)); > + kvm_gmem_mark_prepared(folio); > + } > + > + vmf->page =3D folio_file_page(folio, vmf->pgoff); > + > +out_folio: > + if (ret !=3D 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 =3D { > + .fault =3D kvm_gmem_fault_shared, > +}; > + > +static int kvm_gmem_mmap(struct file *file, struct vm_area_struct *vma) > +{ > + if (!kvm_gmem_supports_shared(file_inode(file))) > + return -ENODEV; > + > + if ((vma->vm_flags & (VM_SHARED | VM_MAYSHARE)) !=3D > + (VM_SHARED | VM_MAYSHARE)) { > + return -EINVAL; > + } > + > + vma->vm_ops =3D &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 =3D { > + .mmap =3D kvm_gmem_mmap, > .open =3D generic_file_open, > .release =3D kvm_gmem_release, > .fallocate =3D kvm_gmem_fallocate, > @@ -463,6 +544,9 @@ int kvm_gmem_create(struct kvm *kvm, struct kvm_creat= e_guest_memfd *args) > u64 flags =3D args->flags; > u64 valid_flags =3D 0; > > + if (kvm_arch_vm_supports_gmem_shared_mem(kvm)) > + valid_flags |=3D GUEST_MEMFD_FLAG_SUPPORT_SHARED; > + > if (flags & ~valid_flags) > return -EINVAL; > > @@ -501,6 +585,10 @@ int kvm_gmem_bind(struct kvm *kvm, struct kvm_memory= _slot *slot, > offset + size > i_size_read(inode)) > goto err; > > + if (kvm_gmem_supports_shared(inode) && When building without CONFIG_KVM_GMEM_SHARED_MEM, my compiler complains that kvm_gmem_supports_shared() is not defined. > + !kvm_arch_vm_supports_gmem_shared_mem(kvm)) > + goto err; > + > filemap_invalidate_lock(inode->i_mapping); > > start =3D offset >> PAGE_SHIFT; > -- > 2.49.0.1045.g170613ef41-goog >