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 1679EC2D0CD for ; Thu, 15 May 2025 07:26:17 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 7A1E36B0083; Thu, 15 May 2025 03:26:15 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 74FAA6B0099; Thu, 15 May 2025 03:26:15 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 5A2FD6B009F; Thu, 15 May 2025 03:26:15 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0011.hostedemail.com [216.40.44.11]) by kanga.kvack.org (Postfix) with ESMTP id 384B66B0083 for ; Thu, 15 May 2025 03:26:15 -0400 (EDT) Received: from smtpin05.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay05.hostedemail.com (Postfix) with ESMTP id E7C725F94E for ; Thu, 15 May 2025 07:26:16 +0000 (UTC) X-FDA: 83444308752.05.0612809 Received: from mail-qt1-f175.google.com (mail-qt1-f175.google.com [209.85.160.175]) by imf12.hostedemail.com (Postfix) with ESMTP id 0996F40008 for ; Thu, 15 May 2025 07:26:14 +0000 (UTC) Authentication-Results: imf12.hostedemail.com; dkim=pass header.d=google.com header.s=20230601 header.b=eRavuDvd; spf=pass (imf12.hostedemail.com: domain of tabba@google.com designates 209.85.160.175 as permitted sender) smtp.mailfrom=tabba@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=1747293975; 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=vo4SLO3uNh2IdiJIh3hAoz8Rud5NcgG3L58yxFzW/g0=; b=aQ10gfUp3zEg/0cpwtcfxbIQbCf5/90ZW6buh4qBTuo3Brbba853Nvzhi9Zk+RQLzHBR07 2bHOc86NFNIJhsiuiPGt30Zygw/Vautlvu8Ss9Kmvz0GlONcijvAGDZ+w4H2A86YZJg7Bz MxgGydYCAwkV3QWoktpY2BxQJ0Q8G6s= ARC-Authentication-Results: i=1; imf12.hostedemail.com; dkim=pass header.d=google.com header.s=20230601 header.b=eRavuDvd; spf=pass (imf12.hostedemail.com: domain of tabba@google.com designates 209.85.160.175 as permitted sender) smtp.mailfrom=tabba@google.com; dmarc=pass (policy=reject) header.from=google.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1747293975; a=rsa-sha256; cv=none; b=kkpFn4VHmwuRf4qCgsoI/iczBajpx9W/DDlRiNwBzovqVkeIWnnmUO2BHDW5Fy+DnrsUta U3sxnZhrM/UJwSFxORVsvxBTDgGYMRlcVojzmNJWQfCtQmd7W/Z0P37Bt+yt2Xp7QCW9bM KyER5iNis1whke+Bzk9EjqOETX5t5hs= Received: by mail-qt1-f175.google.com with SMTP id d75a77b69052e-4774611d40bso200681cf.0 for ; Thu, 15 May 2025 00:26:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1747293974; x=1747898774; 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=vo4SLO3uNh2IdiJIh3hAoz8Rud5NcgG3L58yxFzW/g0=; b=eRavuDvdsyrNCnA3rNat7goGHoIIEq7tGlyFcDF9gesO81g7JYxTLWqJBtjeQnHnRf eqRPw/bKLT3nK56e7GglWrN0oHNNikSHALGkWvU+5aK6Y5tm04sbuk7Kx93hmnq1e//4 eI2mgI/wRnVxQgOplgntu6nXt2nl+flP8zVxZIW3cpEfC6iapBseXr0V4T11AEtJ+FgL jGUYe5XoqnhVNdDjOJyLG+QiwnnQaaRxoQvY94NbHrPJq+ZOEGX4CGdD7MWAymcdD/4j GjFemby9RQ3cWq9Lkmhiv7IBJPhlF3wCL0nIJuP6gwYF5iAB93zteo1d1RWp1B+1lzDg QW5w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1747293974; x=1747898774; 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=vo4SLO3uNh2IdiJIh3hAoz8Rud5NcgG3L58yxFzW/g0=; b=EBRwP1lrf/jdIAFD/HYTSG8GmKfOKJ8eMm19hCRgRhg1i1x8cps9/0UlPim0PaNrv8 08yePRXlboa5Pg1XIloC9oG+OzU1A6kaUZC1xhOJqhImb1VxYDINetZvSwz+qHDy297c C++CQ+ooDjd7wkUBMn/U/zy/h6NjJdaH/TGLsKb+U/XpLq8hwSwLQU2I2H5ZH0zmDmHF mzFrmVB9Q9WTRnoMm1KUvhL/mbNvDKnuT2lnqu8WWiEytWd3wpo8tR9S6MuZoqCLR++R O2JPMDJb+71RvP7rcqqKgpboyf3dUvbWQ79n1uChwYmgXom4121ryrVSDKTyGCJKCSTC fXmg== X-Forwarded-Encrypted: i=1; AJvYcCVVI4Nrn8pFGyczkK9Wbm+qTObzK9poGRbhFlyATOX0Yj3l2729A+G0N7idsOc1jETd8l5JxuVtKw==@kvack.org X-Gm-Message-State: AOJu0YzNPynuA8LU/QSwoZ/Ve9i38HbcD0VXYiVcY+3E0h/leJslxTzM Ai4ipLL/KLLAg2h9Ulj+OwH+P85fd1VLT2qjw0PEDH+Qcr+uynaxnX14qSSgJbQ7Y6lvKm+ziJe 0FXDD81isa5g2K6nBnujr8i0EhnmtAhwEP7XzH71k X-Gm-Gg: ASbGncudynlaEq+9kcox6iUOkEg8EmFp9ivd80VkXae48akcSx7iHD0QiUEvm+fJZd3 0GqI29lQnTWRSAcnCs3Urexl3ZcZrLAElgz/M0tfQgb3kcN/NvgMf4difMJb3a7Xpz868O03WfM SkbjJd4hG0nVMw3TCymr/2QGZPttAJdShVO2QGEZka5DQMtAx3qKzCtII63rNn X-Google-Smtp-Source: AGHT+IFI1q9T3RwZ6xR6YNcpKz27g0JYxyAEh0LrBO/Vj7UzKniC4Jf6LCjYBgSMVRYUsZxEm5bMo4KBwsYAMt3sch0= X-Received: by 2002:a05:622a:11c5:b0:480:dde:aa4c with SMTP id d75a77b69052e-494a1cfecdemr2833071cf.4.1747293973589; Thu, 15 May 2025 00:26:13 -0700 (PDT) MIME-Version: 1.0 References: <20250513163438.3942405-1-tabba@google.com> <20250513163438.3942405-8-tabba@google.com> In-Reply-To: From: Fuad Tabba Date: Thu, 15 May 2025 09:25:36 +0200 X-Gm-Features: AX0GCFvCwY0hIEs4lzYRNAmALk_G43FJxm8AY9gAHiT2goR59wcIyYi271jWWsE Message-ID: Subject: Re: [PATCH v9 07/17] KVM: guest_memfd: Allow host to map guest_memfd() pages To: James Houghton 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: 0996F40008 X-Rspam-User: X-Rspamd-Server: rspam11 X-Stat-Signature: 5wror9fgp75rocnhh8bzuz5jgdokdwtj X-HE-Tag: 1747293974-568249 X-HE-Meta: U2FsdGVkX1+EQPkO4EbkEbcpD0618mWc/OCrq7Et5mG+MW6eG64gPTOLMn+4z2CfwBWYSgvUSdWX3GSftmQrEWH95isWwp958OxxZfiHmJEPxoEcFW+fZgglu310D7M+BEcXlQnCM2sA7zFmfO4U9kxA362YHscE+91Hiy5fEn+Ex0plHelCKA3Cf1PMJl/ewxTEamfn8vWHmuotwHkoLbzYiDDlmvF+V8eZ18dom+TRzzD2hvoIHO3oLwbutJODxc8DFyyfWLWYhIoXSyJc/fRpiQ29bdmyL/EaL5VBN5wViLVleEb7v+6FZRv3VRGstO0vbu5Lzo1l4hzN3gdzcolZI7Ij6v/yPIg4mUIX6KX+PWiP/3mc/UZtVE7l7g6SN/M0c7ss6l02K2+Jtd7PwetwEjQlsnrAL6M4D4o7hwdmY0hNjqFOn7pFVaqIXz91pE2Loj/QIdEdteeYykZyobmBE0J4BRQe8YwIWN1wHAhSNgv5ZKPPL6pg4n6fIIXhTpJuSE5KtbfVSxiFJr55M+xX0k4fsiPfwL8iE+BSrXpZWS2t9PlSd2P3NC3pEt0NweVjmKYYW7Il88Q1CfMzW1/z59UBcynBkpjFuPi3s9kVeZjWqeZ5Bz/c9aHrdwWVSU7jl3WZu4gE8NIRkRE6pQutZrWYvtayaLJ3pCce+SqE+icTwk9x+Vdmeqebgfi8vxirf5+lltFuk7Nubxoo83CW0g8EQyze/QkAZB5O7f5wdlZoPdoZqB6aJRIMnytmYQYksHdGrNirweRtZb5S4Tb6WqNLUvJp1jQwW/o7iqs+LmaEZSFQj6tp4mx7T26+2vXc/0PEQZLXFHE0x/m6l73mjsiBMVybNT6fnY5MleW3g//hNfhEPUFDO1GvSByvGeSgsTN4i7JEtAEZbEVSPdYGglW8JWlj2pb4j/lzT5M7qnMogpFfL033z8L3PI0ch7tr/DxMQEUAONyzgJ/ 7BY/4uXT WiCyVRlG0vTm4Rkp1h+yYIwFQig0goV+xo/Mn96wkkhlls07D/MZv0kYUIufXc+fhEw3WdO5xxDe1ExpTHK2/0tYySFxb6jZ4KCaJwkqV8LP1UxjChvUBlOYALxTQ/KozqHWC7kdiLw4sgFq1tORl9YbJGKI2DxZqW8LsWSBEO3saPGrVOWBqzUm6AGbPvCEpva83+zhKUxEkFErCZOLN/DT0o9pYYW6G9HKiZFnYw4Qiw0gmQy5eDlz9sBVZSx28p5au6InOwXe/l0jwxZ4ffmwAb7/yx8Iz7T7CvRYhl/DzWPXScqP5FAjjMBLENEnmH5zreozWPNsFWhQfLKXVsepqbQ== 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 Wed, 14 May 2025 at 22:40, James Houghton wrote: > > , > > On Tue, May 13, 2025 at 9:34=E2=80=AFAM Fuad Tabba wro= te: > > > > 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_memf= d > > 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= _host.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_= forced_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 backin= g private > > + * memory, e.g., TDX, cannot use guest_memfd with userspace mapping en= abled. > > + */ > > +#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_sta= te) > > 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 k= vm *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 suppo= rt for > > + * guest_memfd is enabled. > > + */ > > +#if !defined(kvm_arch_vm_supports_gmem_shared_mem) && !IS_ENABLED(CONF= IG_KVM_GMEM) > > +static inline bool kvm_arch_vm_supports_gmem_shared_mem(struct kvm *kv= m) > > +{ > > + 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_g= uest_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_memor= y_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_cre= ate_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_memo= ry_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. Thanks for pointing that out. I'll fix this. /fuad > > > + !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 > >