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 DDF0DC28B28 for ; Mon, 17 Mar 2025 10:43:36 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 69793280002; Mon, 17 Mar 2025 06:43:35 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 64792280001; Mon, 17 Mar 2025 06:43:35 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 4E83B280002; Mon, 17 Mar 2025 06:43:35 -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 2F320280001 for ; Mon, 17 Mar 2025 06:43:35 -0400 (EDT) Received: from smtpin29.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay04.hostedemail.com (Postfix) with ESMTP id 9DE841A1BF9 for ; Mon, 17 Mar 2025 10:43:35 +0000 (UTC) X-FDA: 83230706790.29.E0F0AF5 Received: from mail-qt1-f174.google.com (mail-qt1-f174.google.com [209.85.160.174]) by imf03.hostedemail.com (Postfix) with ESMTP id C421420006 for ; Mon, 17 Mar 2025 10:43:33 +0000 (UTC) Authentication-Results: imf03.hostedemail.com; dkim=pass header.d=google.com header.s=20230601 header.b=URxXffdD; spf=pass (imf03.hostedemail.com: domain of tabba@google.com designates 209.85.160.174 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=1742208213; 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:references:dkim-signature; bh=XXsl8Znc7YaVQPIO4zvfdKc88bAEyrTJ9gyCn16OGIs=; b=eVtnTFHhqRg7polLCRojg5U9dkQKzpzyhdbpKeNngie1MP60a/7cSSP0Ju5FhA+QEvm5bS Fe1WC047ttjA5SzZjr/YaVlwnWrykJfMIB/F/7imip9iVVqXSx+bYmfEtC546fCcsz0t7D ixnQf/7bdqiugV3b/9HYgkHa5FUtavA= ARC-Authentication-Results: i=1; imf03.hostedemail.com; dkim=pass header.d=google.com header.s=20230601 header.b=URxXffdD; spf=pass (imf03.hostedemail.com: domain of tabba@google.com designates 209.85.160.174 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=1742208213; a=rsa-sha256; cv=none; b=OTTK3TR5LNWL3diLnPij6QopWmpDFWdRdP5RJULkUdyPo/5NqR2SrY3/Tkj/H3WOUPn8BJ oUOu4BfVbh5Hwifw8a7eFB5myOo2U2CU35+AAnWlEbs2CcmCnaYulBup7whv6Rwz2xczC+ STfhgDfUnmelAJgONlWGry0N1ZaDNW4= Received: by mail-qt1-f174.google.com with SMTP id d75a77b69052e-47666573242so725661cf.0 for ; Mon, 17 Mar 2025 03:43:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1742208213; x=1742813013; darn=kvack.org; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=XXsl8Znc7YaVQPIO4zvfdKc88bAEyrTJ9gyCn16OGIs=; b=URxXffdDcCJ2txvrF/K7202XnRRG+Z88GrwnQmqMRza8GLwpwY2QaQ71viVfcCY0sc nL+S/t8i71sppRW9wo7pnWmCyAP/1yCWDafVDAXRS+zjYUEOUlQDPCyvxixj5US71Jx9 vE3oV6W8kx56yY13tdAQ8bPiDcCEPHbJlzvndcA8q2ZRo+nC5I0hR9Lsx74wzKqzLSPl Ck9isI3BGDsNwK5vg6Bo8pREJbzqsaVqaFP1nXUF1eVEuVom8XEyoBVYsIapfjWZOJ6F a2YAhn8TketYAqmVrLWt8mz28gIGGrZREqrOfqHYwNg8JPf79a2j2RNIpSSnEZAGJEAu thKw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1742208213; x=1742813013; h=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=XXsl8Znc7YaVQPIO4zvfdKc88bAEyrTJ9gyCn16OGIs=; b=CuY/aGm9qiRRi0icO4ntbyiVuLNhfNZfPN4qZ/oYHyT4F9N2FNSBjBnkTcf1qWZF8n 2LsHLEDkuvhtHOAdSzANfYQv1xOdp+ICysBmzgho7p9JVLbCdXPxVkIxPffm7rd1NRNP sQwkjJ4ZQ77Zzd24KgdhhULqzkomc8PUus0eb9XUkQDLFWSBTrDX5wmjTYo51IS9fiKv hEDG5eLqWynxRkoKt0ySYc0r9HIdkDx2VN91sS7bW7BNwRP5H9slom/8Ny3i3CEk2e84 +uUdhei2wX6W0ppB2EP6+R09RlCqozN52qvcgDJWLRd7yrtgxOVaMNXGKfb2Ti9JHKAG RDRA== X-Forwarded-Encrypted: i=1; AJvYcCU2NhNPpa/T21QLBDd9cGgaiTW4Cg6r16pDOdoUlxjaXjsLUyKe+56DLT2FNwAk/Ou5ZmABI+yRaw==@kvack.org X-Gm-Message-State: AOJu0YxBeY1ib9Qss/T0Q4n3DzVsEgSPlGmz0QVeflIiFxf/W9AlofqF fdvAHMEAvO90fqXdaErEClnK7aV+GkBnndQnMQppyYKiZ92NgUAMkbdTSI9ovGJ+1i+SBANXhJe +1lHYvPbZWzBJRQcSwQ29hwPk/+kMBcmhhdxT X-Gm-Gg: ASbGnctK10HAEJzMMcqA5cUvrWzW6BlsGbn/ZaHbFB1332UDvUVEZnCApLF6NM5U8yc ZAbF2uHTdf/azDJ77QcxbPyWNZlEUmgUTUZuuLD8BJD/AAcgARFX8j0mz5N+kFxTQG5veIF9b+R OiKZM//KhUFaywlxodfRaMabc8 X-Google-Smtp-Source: AGHT+IHJWq4Z//LDwfjcMzRXJgvfWvJ21XafXzviEczNJmUZGmueSmOp0XmbGkMwiDZ+TVIlZfTRWPSJzm3KJGuGEkk= X-Received: by 2002:a05:622a:17c7:b0:466:8887:6751 with SMTP id d75a77b69052e-476d6493834mr5972421cf.23.1742208212553; Mon, 17 Mar 2025 03:43:32 -0700 (PDT) MIME-Version: 1.0 References: <20250312175824.1809636-5-tabba@google.com> In-Reply-To: From: Fuad Tabba Date: Mon, 17 Mar 2025 10:42:55 +0000 X-Gm-Features: AQ5f1Jq1rpMwHhCDA119Gya4MZ8zuCCVrvyeSrpEUukqLiAAzVcSDt7WV5aF5cE Message-ID: Subject: Re: [PATCH v6 04/10] KVM: guest_memfd: Allow host to map guest_memfd() pages To: Ackerley Tng 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 Content-Type: text/plain; charset="UTF-8" X-Rspam-User: X-Rspamd-Queue-Id: C421420006 X-Rspamd-Server: rspam03 X-Stat-Signature: 6ko47yr3dcrth4qrktj3m9b8pqryz69q X-HE-Tag: 1742208213-611673 X-HE-Meta: U2FsdGVkX18UK2I/W4yrn7DcRKsH22TOfSiHeV6pRMW4mP63jbpXcs9vRtVDyphbJ7uCbdSyq9cary0hLehr+K+rwC0LjI5tTxo8SzT6+uL2pLlr6yX32cnvjhRH5KYAZtH68ZvL3tM3tSpMIxCTMYmlmW7fkLGBTY/gIuxeVcciQdsm7TyyhSE9V8r+NRSM3+QeYxolj6jaIlNxjtROcqBKubbxq7s6lzGp9oSBXfxC2aYWQjScMSHQ6jTGtCRwgcHd5/HBT0Ak4+pUl1827UFTzsa8FFESKFkfbJehb9OdWtSk/ulvWfne01zK45ecU/rs6lJRsW+cRrVG9Jk7DNxpkAuYqgTHXZJZSZncic5U8Pca9XIImZVs4qZggyLCRZkWeQFG/6dEuHlldE9Xm5aTAvU1+vxF5yBPyQev1FgHnZikrH/lCQqUAAP3UqGfEOG8EHGA4pT3GL83mQEIx5/88icp4NjEO5l0UARb5/Cs/JD1qqTwmEy6DWD/kcAWz/mLhWmRv9z978rPUdhXJ3IJKsbBKKb+3gH0W6G3q2HY/6rpnL1EgfMK65XUUBIDNvoRiwy4+w6GUBSd0HJd4zHQ0ZtL8P6f1gqyyT7Hn5t4HIBJXV7t4FKon54qcTGxDd9l1Y5I7H3w4LI305GgBg3rfXIG/S8HGRBKNnKAFjW8P3HnNphbjntZsz/4uBNShqB0zQks1KJeafZlnQ47elTjEPonCBlPqOt47Xj4jZOmllx53jQJo2s+5H8XON9FOOTdn2yPSNGwlypiDsFPXnaFaJhkdaY9696j4uAb3tjPg6zCidFeu8TkPZn8pwTNw5AZc3a2RAxxyqvTRNeE9uzJ3+s0BVA0im4N/m/qIBtrzc6MqwWBCFRJu6B2wS7XYFHi7KU1syUkVvqvoFQs7C6z5rXgw4SQ3xV3yyRPoyrW+iE2l3McjN2IXlCl8PYgm3csbVf7dE9xSNyiqGQ 81S0zHID 7hjnEWmGFB+DXx6XXLzcFZ/jKi9zM+CX62Rg9BzqXZKA+TQQ5ADFsVIdLMXDZJyvbynmMow9cTaLab64ix9xS6c6jc1hIUu/2LgBLJkWXhOfcFWQxhNUT6B9GdE6AC9R7OXbxRcaqMIVXkTuX0/NLalT8iWsniGP9v2FEjJXHkJbzdzFFJhej8oDto41rioilcIOwPBOtGjgKC0AjHDo+h57nCmMiCS7rxl/Qqz6l2PKjB6+QEJN9hV1wu3Qb0y/raWCVHMbcwLelAut3vdXeNxiXXSHV5J1liuDfPqZSulXLGoKwZDbUiTzb5bfY5lVnAElxeP4B+5bpnCKB+Cz/1TSgVg== 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: Hi Ackerley, On Fri, 14 Mar 2025 at 18:47, Ackerley Tng wrote: > > 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? I was thinking the same thing as I am preparing the sharing state patch series to be sent. I (wrongly) thought before that it wasn't possible to protect all cases with the invalidate_lock, but they already are. I will fix it in the respin of both. Thanks! /fuad > > + > > + /* 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; > > +} > > + > >