From patchwork Tue Mar 18 16:20:40 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Fuad Tabba X-Patchwork-Id: 14021245 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 1A981C28B28 for ; Tue, 18 Mar 2025 16:20:55 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id E4E3C280011; Tue, 18 Mar 2025 12:20:52 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id CEB4028000B; Tue, 18 Mar 2025 12:20:52 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id A7CC3280011; Tue, 18 Mar 2025 12:20:52 -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 8488728000B for ; Tue, 18 Mar 2025 12:20:52 -0400 (EDT) Received: from smtpin13.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay10.hostedemail.com (Postfix) with ESMTP id 0953DC13A7 for ; Tue, 18 Mar 2025 16:20:54 +0000 (UTC) X-FDA: 83235185628.13.2D9361A Received: from mail-wr1-f73.google.com (mail-wr1-f73.google.com [209.85.221.73]) by imf29.hostedemail.com (Postfix) with ESMTP id CF5D1120006 for ; Tue, 18 Mar 2025 16:20:51 +0000 (UTC) Authentication-Results: imf29.hostedemail.com; dkim=pass header.d=google.com header.s=20230601 header.b=OvZbXHgF; spf=pass (imf29.hostedemail.com: domain of 3Yp3ZZwUKCEk4lmmlrzzrwp.nzxwty58-xxv6lnv.z2r@flex--tabba.bounces.google.com designates 209.85.221.73 as permitted sender) smtp.mailfrom=3Yp3ZZwUKCEk4lmmlrzzrwp.nzxwty58-xxv6lnv.z2r@flex--tabba.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=1742314852; 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=v5BCJQxA8skMwKLEJl+6kBnMuf3AEUFL1v827aCOrto=; b=SwMut1aFh63IJzH3S3t00qO9q3T8xm3GHk8LoWDhrkeXT7pwnKUqY5yPx96yu//lU2crYm cuHD+gzFMRqWJNYAs+QrpmE/M2pfLLHnAa8lDqgTssPYXyGrf7FlSUKC6WSTOyDkwe+z2R UGGdxuxvH2IEbjx1zMlZWIrAvgdIg7A= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1742314852; a=rsa-sha256; cv=none; b=wh0fnW4hk8c0Oef+l8QJSZUNAAO531w9ECKIGyvVCXC0PPPTdyFz2LlpCSF+nCE25Vb9IB Se1eTOIrTL4iRBfDMwwBRUKgqr2f1Jp/+i6Isvk13YDGsVStvwHHpDKnGDSYjleM4BpXfV Owu1JcHdgxtroENzQUFVmHmLRzeTCPw= ARC-Authentication-Results: i=1; imf29.hostedemail.com; dkim=pass header.d=google.com header.s=20230601 header.b=OvZbXHgF; spf=pass (imf29.hostedemail.com: domain of 3Yp3ZZwUKCEk4lmmlrzzrwp.nzxwty58-xxv6lnv.z2r@flex--tabba.bounces.google.com designates 209.85.221.73 as permitted sender) smtp.mailfrom=3Yp3ZZwUKCEk4lmmlrzzrwp.nzxwty58-xxv6lnv.z2r@flex--tabba.bounces.google.com; dmarc=pass (policy=reject) header.from=google.com Received: by mail-wr1-f73.google.com with SMTP id ffacd0b85a97d-39141ffa913so3500855f8f.2 for ; Tue, 18 Mar 2025 09:20:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1742314850; x=1742919650; darn=kvack.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=v5BCJQxA8skMwKLEJl+6kBnMuf3AEUFL1v827aCOrto=; b=OvZbXHgFAL9NnKt+Iy/lq/KKxo0wWrbJ7i4lIlqzvdEeiLaJqLZhIS94ivEOMzyZwL D5b9qYcVnnyhVFn85OpEEO05J7lbR9e0jgTAQkag62eVptK6+HOBOZhGRUPTYGf1ymkU TOeuGdFvP6GNluf3/GyEC8KjvwcKP6il6ErmdSyUsqdDpyh7Z+IhmqoiLKjneTQAoxZV I3avlitJcOYE3lZOujl+kmTzc7KuRQknxB+o4ppiHRovO4V5S+lTFX3p3BvFwQytur2x pizqHDhF+x4++48L5yvbNFrMOaGi8KZth1gDMnFFXZbQ2UMn3dDND2FJMrjfuXfCNPa9 /DZA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1742314850; x=1742919650; 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=v5BCJQxA8skMwKLEJl+6kBnMuf3AEUFL1v827aCOrto=; b=YjvPnQVLKPh4/Vg2+1HEk8jD7DU1RkVeWEaKJtKU8kOtWLvkUxZs1Y1aXPwGxBaNVC 4dVt4l80pUnm4SEsiij0rJqMvUwYJIkaIIWJ7uLLoCQTKn34hbLLZv0MaStPFgpqa0ra gO2AYioDrlMgJUPVqw13iG4XkG2CgNJ2Aa65I7iO9N55EHwKjyBXVKdurG4rX/PPPP7Q XC7iZNhiA9mX7aCUj6lD3eanjcl1ss7Wy+g2BwJpyBBvLAvIa0UIQYFtdGsoNOR5QNwe DG/creldEnwP0GgGLlsCvPEfrB2dqk98/oupz7pps8ltswUX/6/V+/M/2V908OTummqC 4HKw== X-Forwarded-Encrypted: i=1; AJvYcCVuoBbGcdkChD3Lm0WMpVc0HSh2BS041CcFGhmdIYDcGDf8Bx3fuoiA+ConTNePbz2+1vsv+7F3Zg==@kvack.org X-Gm-Message-State: AOJu0YwXNpHPL9CvfDxWGETxbkVBdKdnroPcpKSHgZZDZiE28/ggC1u4 8njk9GFjeIBVQ39bUxcgHHIoy2BUjDFemgo6PjzwPGz+Rjbpv5eO0psMK/ddDqPBs1HXVEFwWw= = X-Google-Smtp-Source: AGHT+IGbzRLPDDV73rxMsaRerWBWjkFmSiW+9snF6eGB9z04UAhCgCAjBT3TYQ4Timp1oFUP+R5pRnwAyg== X-Received: from wmbgx13.prod.google.com ([2002:a05:600c:858d:b0:43d:1d5b:1c79]) (user=tabba job=prod-delivery.src-stubby-dispatcher) by 2002:a05:600c:4690:b0:43c:ec28:d303 with SMTP id 5b1f17b1804b1-43d3b950aefmr32213585e9.5.1742314850210; Tue, 18 Mar 2025 09:20:50 -0700 (PDT) Date: Tue, 18 Mar 2025 16:20:40 +0000 In-Reply-To: <20250318162046.4016367-1-tabba@google.com> Mime-Version: 1.0 References: <20250318162046.4016367-1-tabba@google.com> X-Mailer: git-send-email 2.49.0.rc1.451.g8f38331e32-goog Message-ID: <20250318162046.4016367-2-tabba@google.com> Subject: [PATCH v6 1/7] KVM: guest_memfd: Make guest mem use guest mem inodes instead of anonymous inodes 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, 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, peterx@redhat.com, tabba@google.com X-Rspam-User: X-Rspamd-Server: rspam11 X-Rspamd-Queue-Id: CF5D1120006 X-Stat-Signature: 7na73x7qfb8fzpct5izscdatacqpdwun X-HE-Tag: 1742314851-990982 X-HE-Meta: U2FsdGVkX19KN8cO2F986HOhkHYjbjZ6cahm3i9jjQ8TTPWsDCVirX/KDWwj+/YFXNeDZoMTxdYEd6QfBeM4bLLcFDQa9V2o+yG0GXvDxDgEpWXvi9tinxsCuCndAruRfv3M8c9KdCTm0cj2sd+zwl+XWJk1wbvV0ZP8GxETvquSyZTv8Yb5VX2atbyYE0jNasJm1kuAHzfSMWjyaD3AsheryZSY/CDAqMcU7ktatG17eDP1wznd4utsyPyKWQZ6vwTPW02JRrY8s2z7gN6+D1MscC3zJ9N2NGd+JYuWCpyykyXqp3tUvR/gUhCrs2+QK305ANSSy5RZ7drcev6pxEH505HHvTIB4lg51puoonQS9G9X0uUsxYjxw0fhbFI7ZMI+xLSqZ68QwbCGFnbI4L7H/v2p8sr2zaAmAgq/cqZsUoU1lJc+LrvouhTP586RKLbhhqH2JEl48inSDW3hioXbjhRUNnUNJpuKB2Mifg1vl2j/s48B2Q/Kq1MhL5AGksuM2P8KO1G0QSd3PfMPcQW9nea0r0BFM8TWgucF95aa8589hk0NbLQHgzYk81F/NNuzs4FZcgQ6zVUGEfesenK0C/p/ReEl6IGe2GS5q9FgBTK9zLqKYlOkIyVjGu2eRPQiVeyDxyFjOea2w1GN6B7hlzkM0KGDufbDaRyuWrj1AVc1S/v9lFQuox8W7yLpkv5Gz/wbc0nlJGOj0ssOnJHIxtLz9YDfilo1QRuDGKuVLXGMLnt7HnuwGFNvGWZnBzWmKPx75BjRuiLWfE15DSXqqMkQ3R+19UyxiP+yJHavpXbVf2T31Ewa1eAbQrDGRk7L/Gb2taqPcrx1bIC4d3xcWt1NXcjq4TNLI1BqhOECSTnly4Um0pk+ywIgr30qrBNVcSAym3B1rM/TQVdMnmYevG90sV9J6C8Detb9WU8Nk5v+zf0Yx+krSPjATbb6um4WWDE3E10Q0fRVBzg lqlglPRf brheRpD/Z6Vbk86CF+lu6HqYVYvjQALd5dvi/aYws4zTpc+yy1I6pp4e2jqNaSvXQPllgDHGb+5BDro5BklMJSEyugHHmF84FugD6V4EmV442ZyqTRNFy7fuE0W4WTNyVNAfoxTxj8mq/ZWrz83Stb/QUpVlcUCB6+L1YL85Ak81xBOdGVLU8bW/NL6DDhQ7cwz39L0SgR1/tN6pvCEas8Sa1gm416L9XX8+SY6kdkUt+YOrvAdHUxhoNnxkwrPT7vtzuGBta6d0L9Ff/v7eE/AeIzlMXQ5myIcV1OlMP0DO/oQCaic+M0pyzzH66yVPeLuERMDawQgwV6s7xL12nJJ4/HbJnVAQjwpbHc+HPDhiTuSaPjwY+PknPkOfrueJC6NZSc9m0fAjUspsPWMjJsH0Ox4+Y/5El6ZA7yKWU8Yiv4f3M+ruD+wlYGdZi7nTQhyKnAw572aTjxubbdIHjL00PsRj2ciKRe2FIv7cd0dpeof6IqiFDhs+XtoxxWoI76xkBmH04FcB6w/fC6pJPZJT+QKc691zGHgayeCtVGmti23kL9IMdpgiNHzHcoj2SSc6toyMUqyNXI3sEOUt5649iIBuP3fP/WoCcf5gCB1bLO/p+0VmI8H4NNJkrEEt2VwX4+PZND+g/825BdFCuF1gcAg== 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: From: Ackerley Tng Using guest mem inodes allows us to store metadata for the backing memory on the inode. Metadata will be added in a later patch to support HugeTLB pages. Metadata about backing memory should not be stored on the file, since the file represents a guest_memfd's binding with a struct kvm, and metadata about backing memory is not unique to a specific binding and struct kvm. Signed-off-by: Fuad Tabba Signed-off-by: Ackerley Tng --- include/uapi/linux/magic.h | 1 + virt/kvm/guest_memfd.c | 130 +++++++++++++++++++++++++++++++------ 2 files changed, 111 insertions(+), 20 deletions(-) diff --git a/include/uapi/linux/magic.h b/include/uapi/linux/magic.h index bb575f3ab45e..169dba2a6920 100644 --- a/include/uapi/linux/magic.h +++ b/include/uapi/linux/magic.h @@ -103,5 +103,6 @@ #define DEVMEM_MAGIC 0x454d444d /* "DMEM" */ #define SECRETMEM_MAGIC 0x5345434d /* "SECM" */ #define PID_FS_MAGIC 0x50494446 /* "PIDF" */ +#define GUEST_MEMORY_MAGIC 0x474d454d /* "GMEM" */ #endif /* __LINUX_MAGIC_H__ */ diff --git a/virt/kvm/guest_memfd.c b/virt/kvm/guest_memfd.c index fbf89e643add..844e70c82558 100644 --- a/virt/kvm/guest_memfd.c +++ b/virt/kvm/guest_memfd.c @@ -1,12 +1,16 @@ // SPDX-License-Identifier: GPL-2.0 +#include #include #include #include +#include #include #include #include "kvm_mm.h" +static struct vfsmount *kvm_gmem_mnt; + struct kvm_gmem { struct kvm *kvm; struct xarray bindings; @@ -320,6 +324,38 @@ static pgoff_t kvm_gmem_get_index(struct kvm_memory_slot *slot, gfn_t gfn) return gfn - slot->base_gfn + slot->gmem.pgoff; } +static const struct super_operations kvm_gmem_super_operations = { + .statfs = simple_statfs, +}; + +static int kvm_gmem_init_fs_context(struct fs_context *fc) +{ + struct pseudo_fs_context *ctx; + + if (!init_pseudo(fc, GUEST_MEMORY_MAGIC)) + return -ENOMEM; + + ctx = fc->fs_private; + ctx->ops = &kvm_gmem_super_operations; + + return 0; +} + +static struct file_system_type kvm_gmem_fs = { + .name = "kvm_guest_memory", + .init_fs_context = kvm_gmem_init_fs_context, + .kill_sb = kill_anon_super, +}; + +static void kvm_gmem_init_mount(void) +{ + kvm_gmem_mnt = kern_mount(&kvm_gmem_fs); + BUG_ON(IS_ERR(kvm_gmem_mnt)); + + /* For giggles. Userspace can never map this anyways. */ + kvm_gmem_mnt->mnt_flags |= MNT_NOEXEC; +} + #ifdef CONFIG_KVM_GMEM_SHARED_MEM static bool kvm_gmem_offset_is_shared(struct file *file, pgoff_t index) { @@ -430,6 +466,8 @@ static struct file_operations kvm_gmem_fops = { void kvm_gmem_init(struct module *module) { kvm_gmem_fops.owner = module; + + kvm_gmem_init_mount(); } static int kvm_gmem_migrate_folio(struct address_space *mapping, @@ -511,11 +549,79 @@ static const struct inode_operations kvm_gmem_iops = { .setattr = kvm_gmem_setattr, }; +static struct inode *kvm_gmem_inode_make_secure_inode(const char *name, + loff_t size, u64 flags) +{ + const struct qstr qname = QSTR_INIT(name, strlen(name)); + struct inode *inode; + int err; + + inode = alloc_anon_inode(kvm_gmem_mnt->mnt_sb); + if (IS_ERR(inode)) + return inode; + + err = security_inode_init_security_anon(inode, &qname, NULL); + if (err) { + iput(inode); + return ERR_PTR(err); + } + + inode->i_private = (void *)(unsigned long)flags; + inode->i_op = &kvm_gmem_iops; + inode->i_mapping->a_ops = &kvm_gmem_aops; + inode->i_mode |= S_IFREG; + inode->i_size = size; + mapping_set_gfp_mask(inode->i_mapping, GFP_HIGHUSER); + mapping_set_inaccessible(inode->i_mapping); + /* Unmovable mappings are supposed to be marked unevictable as well. */ + WARN_ON_ONCE(!mapping_unevictable(inode->i_mapping)); + + return inode; +} + +static struct file *kvm_gmem_inode_create_getfile(void *priv, loff_t size, + u64 flags) +{ + static const char *name = "[kvm-gmem]"; + struct inode *inode; + struct file *file; + int err; + + err = -ENOENT; + if (!try_module_get(kvm_gmem_fops.owner)) + goto err; + + inode = kvm_gmem_inode_make_secure_inode(name, size, flags); + if (IS_ERR(inode)) { + err = PTR_ERR(inode); + goto err_put_module; + } + + file = alloc_file_pseudo(inode, kvm_gmem_mnt, name, O_RDWR, + &kvm_gmem_fops); + if (IS_ERR(file)) { + err = PTR_ERR(file); + goto err_put_inode; + } + + file->f_flags |= O_LARGEFILE; + file->private_data = priv; + +out: + return file; + +err_put_inode: + iput(inode); +err_put_module: + module_put(kvm_gmem_fops.owner); +err: + file = ERR_PTR(err); + goto out; +} + static int __kvm_gmem_create(struct kvm *kvm, loff_t size, u64 flags) { - const char *anon_name = "[kvm-gmem]"; struct kvm_gmem *gmem; - struct inode *inode; struct file *file; int fd, err; @@ -529,32 +635,16 @@ static int __kvm_gmem_create(struct kvm *kvm, loff_t size, u64 flags) goto err_fd; } - file = anon_inode_create_getfile(anon_name, &kvm_gmem_fops, gmem, - O_RDWR, NULL); + file = kvm_gmem_inode_create_getfile(gmem, size, flags); if (IS_ERR(file)) { err = PTR_ERR(file); goto err_gmem; } - file->f_flags |= O_LARGEFILE; - - inode = file->f_inode; - WARN_ON(file->f_mapping != inode->i_mapping); - - inode->i_private = (void *)(unsigned long)flags; - inode->i_op = &kvm_gmem_iops; - inode->i_mapping->a_ops = &kvm_gmem_aops; - inode->i_mode |= S_IFREG; - inode->i_size = size; - mapping_set_gfp_mask(inode->i_mapping, GFP_HIGHUSER); - mapping_set_inaccessible(inode->i_mapping); - /* Unmovable mappings are supposed to be marked unevictable as well. */ - WARN_ON_ONCE(!mapping_unevictable(inode->i_mapping)); - kvm_get_kvm(kvm); gmem->kvm = kvm; xa_init(&gmem->bindings); - list_add(&gmem->entry, &inode->i_mapping->i_private_list); + list_add(&gmem->entry, &file_inode(file)->i_mapping->i_private_list); fd_install(fd, file); return fd; From patchwork Tue Mar 18 16:20:41 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Fuad Tabba X-Patchwork-Id: 14021247 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 12A88C282EC for ; Tue, 18 Mar 2025 16:20:57 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 5E3D2280012; Tue, 18 Mar 2025 12:20:54 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 4F5A828000B; Tue, 18 Mar 2025 12:20:54 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 2603B280012; Tue, 18 Mar 2025 12:20:54 -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 01EFE28000B for ; Tue, 18 Mar 2025 12:20:53 -0400 (EDT) Received: from smtpin01.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay02.hostedemail.com (Postfix) with ESMTP id 6EF5A12136D for ; Tue, 18 Mar 2025 16:20:55 +0000 (UTC) X-FDA: 83235185670.01.6A31582 Received: from mail-wm1-f73.google.com (mail-wm1-f73.google.com [209.85.128.73]) by imf12.hostedemail.com (Postfix) with ESMTP id 6CCC440003 for ; Tue, 18 Mar 2025 16:20:53 +0000 (UTC) Authentication-Results: imf12.hostedemail.com; dkim=pass header.d=google.com header.s=20230601 header.b=taWF04cx; dmarc=pass (policy=reject) header.from=google.com; spf=pass (imf12.hostedemail.com: domain of 3ZJ3ZZwUKCEs6noont11tyr.p1zyv07A-zzx8npx.14t@flex--tabba.bounces.google.com designates 209.85.128.73 as permitted sender) smtp.mailfrom=3ZJ3ZZwUKCEs6noont11tyr.p1zyv07A-zzx8npx.14t@flex--tabba.bounces.google.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1742314853; 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=rIMCAizGZejWtu7P2Nd20c3m6UoVLaxoQ99DBpyfZ/M=; b=189932DJlH/GuNme97t9kVHEB4PRB7QDuhZK+qbmDkIKAAT5gF8dcKeYiVUduOIWLMaONZ oTHlmiHMibrbacO+l5/51AIM0WDKwMH3lefT2WKybuNqGWpi7SQPysTnQX42kBTsk72WhH 4YgqI4DcM2/mQXqHwzE4j41HQg3KntY= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1742314853; a=rsa-sha256; cv=none; b=uTuLW5zm2z3mRQ5y1fQNQ0ygDDrb99fUP/Dtp+Ydk6CdjBquTkPnkalOY0BhM69tE/FYkl TLt+GXkCgR+g4fgT6X2BIOajNG30B/G2/LiqhPPY7WMoZaZtWU2b20j89a6k/LkaQveqjv OUWcXEr3ZjJDcaQrTtg+5jBGvoE7WB0= ARC-Authentication-Results: i=1; imf12.hostedemail.com; dkim=pass header.d=google.com header.s=20230601 header.b=taWF04cx; dmarc=pass (policy=reject) header.from=google.com; spf=pass (imf12.hostedemail.com: domain of 3ZJ3ZZwUKCEs6noont11tyr.p1zyv07A-zzx8npx.14t@flex--tabba.bounces.google.com designates 209.85.128.73 as permitted sender) smtp.mailfrom=3ZJ3ZZwUKCEs6noont11tyr.p1zyv07A-zzx8npx.14t@flex--tabba.bounces.google.com Received: by mail-wm1-f73.google.com with SMTP id 5b1f17b1804b1-43cf327e9a2so28405115e9.3 for ; Tue, 18 Mar 2025 09:20:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1742314852; x=1742919652; darn=kvack.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=rIMCAizGZejWtu7P2Nd20c3m6UoVLaxoQ99DBpyfZ/M=; b=taWF04cxLsyw3n6I9ztA3PD9RXQkke6meC+LqjEfd1FHZbvb5wNq/IG9h8Ru6wahbE p5h7NfscIj/be4SZl4gvtcosLdy99C4d8YIt1CojEtTm6xto86Cs1soJ1+1NPW6ZG2E8 XDFCUo3ECWiyBdvHXImV101CfXYunFWEAYJtF974vYCwNYBs6cDaN70jRiv8gFzuyabd JNV94Q0/Nwf11lDUlE1z4/TXkd5+nu0cUPAF1+w+RxkGu9UUIekJsJSDfY9h1jI0qJ+L 2v01ulXX29+tZKydRaXE5vzBFcWiUYXwSOB2/cDHEPGK+JGWcsnxObLD3cE75N0BCezS AGRQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1742314852; x=1742919652; 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=rIMCAizGZejWtu7P2Nd20c3m6UoVLaxoQ99DBpyfZ/M=; b=AgDAR0g6Xkw/U+FESecUVUzA7zle/lOInedLp1TxlzrMk2k6o5h+N38gKY++vZKcyP tm7BqpDGwPxhFUkMbtgJAxOWyutu/WwCta6oqk98gpi4eGUyQGq8QOBuWMRSEf60GHIk mO2a60+ZyoKNwk2yG4Iuf9wTvAWtp21FN+2D0KP+IXA0LgpsYCb+1HHzNTELV4RVv/pR bJG1KZYDvf8AZpKxXUkiJ0ogOvrzvL/FaCQH+ef9Pztf+bI9OJGFcmFILSs3+G7lhoiF ln8CE06CNpoYPWY/IkaVwiTOUy/ULSlzbj/lMwgjGJ5RgW2HECUhEaMDVGDux3w3OMBu q01w== X-Forwarded-Encrypted: i=1; AJvYcCVWxwRUcTXrhn6yxPrXGIk+M3kQk7FYxP6aGDLJ4r8MFIVRguY2nP/brwz3RxLjMmMITtm8+iDkTQ==@kvack.org X-Gm-Message-State: AOJu0YxGg3fKfy87NUhQcSA0ciaE1iekbmMV6FQ9KkR+KOPV91oGtNlY PhMwWWszD/KfN0/78YK+PLjsx9gtyWOsNbPaEUBQHjpcgNZ1atiP9VLhalix+fs8rz8qoeOJFg= = X-Google-Smtp-Source: AGHT+IFmHd9CyHM8TklDJLl/Zwd2hd7SSZMAwOsu5I2BqW7wDeKi1D4jAZf4EsiqIdJLp0CMxLUAq5zQDw== X-Received: from wmcn4.prod.google.com ([2002:a05:600c:c0c4:b0:43c:fae1:8125]) (user=tabba job=prod-delivery.src-stubby-dispatcher) by 2002:a05:600c:5103:b0:43d:fa:1f9a with SMTP id 5b1f17b1804b1-43d3ba2971emr26297695e9.30.1742314852121; Tue, 18 Mar 2025 09:20:52 -0700 (PDT) Date: Tue, 18 Mar 2025 16:20:41 +0000 In-Reply-To: <20250318162046.4016367-1-tabba@google.com> Mime-Version: 1.0 References: <20250318162046.4016367-1-tabba@google.com> X-Mailer: git-send-email 2.49.0.rc1.451.g8f38331e32-goog Message-ID: <20250318162046.4016367-3-tabba@google.com> Subject: [PATCH v6 2/7] KVM: guest_memfd: Introduce kvm_gmem_get_pfn_locked(), which retains the folio lock 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, 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, peterx@redhat.com, tabba@google.com X-Rspam-User: X-Rspamd-Server: rspam04 X-Rspamd-Queue-Id: 6CCC440003 X-Stat-Signature: uuzh8nddd566awu7n4kp8z5paafge63d X-HE-Tag: 1742314853-395977 X-HE-Meta: U2FsdGVkX1+oO5qzfkTKGN4LXtlG6LfgIJco3Tq8Z75S2qitJhGzv5qHtqk9SMBCZiOKrYou82iZeWTDbNWXebY8c735JrwtD48TRHtohU7ULb9xOQDq3FAF8lTqzRkLHWaGCm0VQbRw32ohcWQWvUUyJbkDRiMmCX3gaO2pfEgcc/p3fah28M/DorjJU9DzPf/vJTwI4JeYU8ltLIqDw2skCoQYnC/U20JsMx/VtxBdtyGapT6WfSNGknzhu+6P/F70heemYw68zKzX1uxf7eWIj0KH4atbRgpUsBKmh+Gq7cFcGWduOwNPXByRCgVGa2FHAht/HC+dDpwmA18l+sKWwl9/9NCj+2MO5s9Kv07+sbTWWV7jhUgBlyPC3oUJjWWB08OByx5a8jsUMs57eiz41AzZf79IjmLMBrWFPhoE7ZmPwKsbxYZU69UxpKTTbsIT8QK7Obj5j0u65+2CNIt5V8A/UeF8ttUYzP/9W5JkSC+IhBn1/jZJeTO8G7VZ46upkvvL9c3hDbCf3q6s5Qs/wjxJZxFoyJGxFEzySH9Wf4usEbcr7XEGucbG6zcHdYQ2ZteXB9yh14SvYyUQ3C1MuGKuuUnH3hTecush4s7aE2P0yXuDdqOqYa+xbML+p2npnu1KavyfnSkKwRkLd4IfLJQuQky5pHFQY89x8xt4FqeeFBzfzKoaCMwvfOzxu42edIXipJKoJCWZlyCFh105SUeSnDVRP3fUxBMWEljJDqtmk7XYHc4qhwlZDmn+jWQiwcCF7dOqS2CeYw0bAPtxLHrNBaGjBthlvz8EXHBg+fR6qqjSuj8Kx/IaLaYDcCbddt150PDWMnpswguhHhjfjf+Sp6WLKpGYX+8mrVyck7N6AC/c+K7yboVsbTffZYz/spaJVzb02poCRdUEz2AiZiQR4jNRuQt/RrYhDcYam4A3u1szVJY9FQ+lhvEL690MyAZ6zOaAlShEgbn 1ua6evMd x/3Nsov7+OCUF1rBng51fr1rk9JJjNXO1ngOFjrNJoivCRDkeJZpAJQ4Uf3XrB9sKxES8H8ZnHsUmeivuMLlt/sYk9YhfwaE/rKDHHfCS0oWiP1Bz6mNpEdx00K9yIMbGXgrvWAvPDTD78WUtUM6H/9DK89YdPV/wl+KfIWP8U9J8vrzylpPxGx2dBt54u02tkUr8+aoCcxcxBv0uk6mKd/xs6QAoCIfbrMl0ICMvxk7F/yqb1B/0ub2ieVkUHT72MC096wsORFulNShYZugy6mdKHp1N90XX4t76UnaoKDZLvSqwh6ajoXjOjLDoqpUc2Hzew9bxxOBLFBad2jl5MX/bO4A7P8OBeURcisBqjGWT+IElLqfuBGtdePPgy1XEGKvPpoEELi5BHzGOmzCeZTzpkpb+FC9F8UdOhIIXmlusB7CThH3haFV+C/TzHcekYCu4OArMqgfI5wjdmYYCBodnLmCicCA5kc7QYfb9WxjKdZGUEBH3Qg38ZLD8kXEs+JqkVsesyn3PRAK/TFt5X9kP3lCgMr77qfi8KPVw5Tkvy6tHSvSVyHiuO1xwzzkBEkZFve9VG2ugbPwdNA+QSaYbOCznCoK5QVTf0QSYV9L8cOp3scpsN3gZ5lR5i8pxkjR4Y1snbDXJtA9az/LM/c71sw== 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: Create a new variant of kvm_gmem_get_pfn(), which retains the folio lock if it returns successfully. This is needed in subsequent patches to protect against races when checking whether a folio can be shared with the host. Signed-off-by: Fuad Tabba --- include/linux/kvm_host.h | 11 +++++++++++ virt/kvm/guest_memfd.c | 27 ++++++++++++++++++++------- 2 files changed, 31 insertions(+), 7 deletions(-) diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index ec3bedc18eab..bc73d7426363 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h @@ -2535,6 +2535,9 @@ static inline bool kvm_mem_is_private(struct kvm *kvm, gfn_t gfn) int kvm_gmem_get_pfn(struct kvm *kvm, struct kvm_memory_slot *slot, gfn_t gfn, kvm_pfn_t *pfn, struct page **page, int *max_order); +int kvm_gmem_get_pfn_locked(struct kvm *kvm, struct kvm_memory_slot *slot, + gfn_t gfn, kvm_pfn_t *pfn, struct page **page, + int *max_order); #else static inline int kvm_gmem_get_pfn(struct kvm *kvm, struct kvm_memory_slot *slot, gfn_t gfn, @@ -2544,6 +2547,14 @@ static inline int kvm_gmem_get_pfn(struct kvm *kvm, KVM_BUG_ON(1, kvm); return -EIO; } +static inline int kvm_gmem_get_pfn_locked(struct kvm *kvm, + struct kvm_memory_slot *slot, + gfn_t gfn, kvm_pfn_t *pfn, + struct page **page, int *max_order) +{ + KVM_BUG_ON(1, kvm); + return -EIO; +} #endif /* CONFIG_KVM_PRIVATE_MEM */ #ifdef CONFIG_HAVE_KVM_ARCH_GMEM_PREPARE diff --git a/virt/kvm/guest_memfd.c b/virt/kvm/guest_memfd.c index 844e70c82558..ac6b8853699d 100644 --- a/virt/kvm/guest_memfd.c +++ b/virt/kvm/guest_memfd.c @@ -802,9 +802,9 @@ static struct folio *__kvm_gmem_get_pfn(struct file *file, return folio; } -int kvm_gmem_get_pfn(struct kvm *kvm, struct kvm_memory_slot *slot, - gfn_t gfn, kvm_pfn_t *pfn, struct page **page, - int *max_order) +int kvm_gmem_get_pfn_locked(struct kvm *kvm, struct kvm_memory_slot *slot, + gfn_t gfn, kvm_pfn_t *pfn, struct page **page, + int *max_order) { pgoff_t index = kvm_gmem_get_index(slot, gfn); struct file *file = kvm_gmem_get_file(slot); @@ -824,17 +824,30 @@ int kvm_gmem_get_pfn(struct kvm *kvm, struct kvm_memory_slot *slot, if (!is_prepared) r = kvm_gmem_prepare_folio(kvm, slot, gfn, folio); - folio_unlock(folio); - - if (!r) + if (!r) { *page = folio_file_page(folio, index); - else + } else { + folio_unlock(folio); folio_put(folio); + } out: fput(file); return r; } +EXPORT_SYMBOL_GPL(kvm_gmem_get_pfn_locked); + +int kvm_gmem_get_pfn(struct kvm *kvm, struct kvm_memory_slot *slot, + gfn_t gfn, kvm_pfn_t *pfn, struct page **page, + int *max_order) +{ + int r = kvm_gmem_get_pfn_locked(kvm, slot, gfn, pfn, page, max_order); + + if (!r) + unlock_page(*page); + + return r; +} EXPORT_SYMBOL_GPL(kvm_gmem_get_pfn); #ifdef CONFIG_KVM_GENERIC_PRIVATE_MEM From patchwork Tue Mar 18 16:20:42 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Fuad Tabba X-Patchwork-Id: 14021246 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 05802C35FFB for ; Tue, 18 Mar 2025 16:21:00 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 56090280013; Tue, 18 Mar 2025 12:20:56 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 4E94128000B; Tue, 18 Mar 2025 12:20:56 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 2C6DC280013; Tue, 18 Mar 2025 12:20:56 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0016.hostedemail.com [216.40.44.16]) by kanga.kvack.org (Postfix) with ESMTP id 002C828000B for ; Tue, 18 Mar 2025 12:20:55 -0400 (EDT) Received: from smtpin11.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay02.hostedemail.com (Postfix) with ESMTP id 4098812138F for ; Tue, 18 Mar 2025 16:20:57 +0000 (UTC) X-FDA: 83235185754.11.360756A Received: from mail-wm1-f74.google.com (mail-wm1-f74.google.com [209.85.128.74]) by imf24.hostedemail.com (Postfix) with ESMTP id 363A1180004 for ; Tue, 18 Mar 2025 16:20:55 +0000 (UTC) Authentication-Results: imf24.hostedemail.com; dkim=pass header.d=google.com header.s=20230601 header.b=R+sLbeF8; spf=pass (imf24.hostedemail.com: domain of 3ZZ3ZZwUKCEw7oppou22uzs.q20zw18B-00y9oqy.25u@flex--tabba.bounces.google.com designates 209.85.128.74 as permitted sender) smtp.mailfrom=3ZZ3ZZwUKCEw7oppou22uzs.q20zw18B-00y9oqy.25u@flex--tabba.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=1742314855; 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=wGT6XUfvwyo20nNpxU+yI0gtyvy9pE2xbzRktK0coPQ=; b=j884OfyPiM2RW/n1HcK13b7v7n4JCeB0LSCXIZ26ucDod7warWSjbfwmZ/eZ92JdPNDWQj B+hQ+E/7QbI8lp/T2EKGRibw8VMF3l6sXI+Av3LdW5nvgR+U5UPB1O1SS/SHyJthKQctr3 Wk+PKcHBlDp3ezkMLT+T79K3mJloTE4= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1742314855; a=rsa-sha256; cv=none; b=6+voMWOMfj+Mk0elEYjiiP+7hxfZydvpYLUiE6LgZzpd8UHj+xKR8QDP5uaPJTutF1fJrA kJhiCd5h9uGXH53DblCeaHSrLw/l5yJ+8OkHx6htiZ93bOJBZhOvx8YfQOJ16Y80qzzQdC juF9D+R3vFlBOZ6VFKZPkn7a3EJaDS0= ARC-Authentication-Results: i=1; imf24.hostedemail.com; dkim=pass header.d=google.com header.s=20230601 header.b=R+sLbeF8; spf=pass (imf24.hostedemail.com: domain of 3ZZ3ZZwUKCEw7oppou22uzs.q20zw18B-00y9oqy.25u@flex--tabba.bounces.google.com designates 209.85.128.74 as permitted sender) smtp.mailfrom=3ZZ3ZZwUKCEw7oppou22uzs.q20zw18B-00y9oqy.25u@flex--tabba.bounces.google.com; dmarc=pass (policy=reject) header.from=google.com Received: by mail-wm1-f74.google.com with SMTP id 5b1f17b1804b1-43ceeaf1524so21013275e9.1 for ; Tue, 18 Mar 2025 09:20:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1742314854; x=1742919654; darn=kvack.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=wGT6XUfvwyo20nNpxU+yI0gtyvy9pE2xbzRktK0coPQ=; b=R+sLbeF8PhIMTsAU9qqTw3Vptldk9raZRtcMOYa7cntM2OinBGNgYmPh7TnvNo4nLb P8LX0hN6xMK1mXdPW1CERG1MCOy5Y7nt4bV6XxBMlK66WFs52q+bFNN7P9yboSeQk86x TL99fWmbKFRjIG2mYFAI1p/tS3TzRM88RXgkTGlI6KxB+Q79ffP1N29JoWora+UNHPjZ KFk5gb8/DAZth5pf9FKnq4KDoWLJLiDadBmxK44FivGQH16z2DPeaulsWJ6bpVoSetB/ Si6h2uTvq0uLtxz0gXUuOP2gHn9AbB8rQxYJaqyn4FQurovG9EPw6n8tUAR075YuSVVK 8flA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1742314854; x=1742919654; 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=wGT6XUfvwyo20nNpxU+yI0gtyvy9pE2xbzRktK0coPQ=; b=aN0vOLx8cPSyTWvfUZ/xHSe///Q1ZYmorh6zPUNmW83qBjDWchyMgT1DYrXEpChEy5 5BexFvyYdOtCzfXFnwDRE1RzkJYJM+xk17gyoWqFFYFH/UO+AJkskciy0h6ZRGD74E8M h1Cg8RkVQzwfpX4nmWHoSOVWnJ4sHroG2KzdAMlM9Ap0mO7rA0zthdLAhSYiwU+/L436 L3gEHc50JHyQ9Njp7XbyRPVfUCmQlspL7zVf30yz2SDq5Jel5AYVPmNsHszMCrykkw+h T7lthQifZ1SPn7zMrSXoSfYfyMJpTOd7ZgG7KWoul2Q+gZak3R2HoqUBZOTxJwhmGfRH SkNA== X-Forwarded-Encrypted: i=1; AJvYcCWSIifLZFZFdF2iSwmTF7GAmwphEYP2VuCg2TgAzLdpxUxgXYPPmYGrnkAYc4zyAXlSDjz2tUgCYA==@kvack.org X-Gm-Message-State: AOJu0YyWgr+edB3xJXcZdpD3IiSR0eba+Z6HvvKl4zFEyNX9pQGWmwJO 49S8CXpjENEWmPwtcF/gXlAtj4tbfbbypuPPGcrQMpzZl72p/izHoMH+h1HR1irTaLxScmn/1Q= = X-Google-Smtp-Source: AGHT+IGl0L+YQjnz7OSpay/gXAo8oxSXXskgyTEmCA9MZ9D7uSR+5ym8M6rluFfuo6rcX+QX8YfBK7dWiQ== X-Received: from wmqe11.prod.google.com ([2002:a05:600c:4e4b:b0:43d:4038:9229]) (user=tabba job=prod-delivery.src-stubby-dispatcher) by 2002:a05:600c:1504:b0:43c:ed33:a500 with SMTP id 5b1f17b1804b1-43d3b9cc07fmr27713425e9.10.1742314853967; Tue, 18 Mar 2025 09:20:53 -0700 (PDT) Date: Tue, 18 Mar 2025 16:20:42 +0000 In-Reply-To: <20250318162046.4016367-1-tabba@google.com> Mime-Version: 1.0 References: <20250318162046.4016367-1-tabba@google.com> X-Mailer: git-send-email 2.49.0.rc1.451.g8f38331e32-goog Message-ID: <20250318162046.4016367-4-tabba@google.com> Subject: [PATCH v6 3/7] KVM: guest_memfd: Track folio sharing within a struct kvm_gmem_private 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, 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, peterx@redhat.com, tabba@google.com X-Rspam-User: X-Rspamd-Server: rspam11 X-Rspamd-Queue-Id: 363A1180004 X-Stat-Signature: mdsz3djn1x9rz7f1yzankrbcouph51cb X-HE-Tag: 1742314854-154584 X-HE-Meta: U2FsdGVkX1/Kmkus6yxdGl1m+eAd4DMH5TunP8MTCkwqUjHejDBDGPrfZn6BELZGvL5YSvj1OPQ3OpJpGazebAkb4Xh8VZCXDAKMXruJcRiUNSal+HvhjPPvRQ8PGWTKeElRM/b/1urG37bBbiuXbpoI1SWU+daEVcuygNrFOrSv7U2G/wqpy4IpsMFaQA/19fui+o59g5IsGTXASIL2XjNr4ijqgCJeREb/j/csfcjRNryU0FXbmveDm7cgZLLYScFPxps1UcgNJkOEG+tpfYRjz5G+6yZQFkHWRkV3pbel1gO0tC4SC4Ihw9EMD+1oDlWiInAo46KSeLlMdqcUiivJU+/1fvFALEHzVQfezD6QpO4TJ1pLMyTACZBYCAqRWgyH/Xm8Ozf/owXI5eKNmcH98zSSGdr5qsbX3Ax0zq0yi2fkLeOBvwLmpaC03JyyvpR/yaNxzdLnpbFObglITHZzeqzmeJLadtWLf07hirR+yvidA2fJ6+55YMS9bOs3aOdWPh0mcEFQaRVwFUgTMnDhr+qPwnq0YTFXICw1Vhx/b+ls9QaribthXaayAT388khptBUnVrGsJZms87iRHO+BTGZtonvR8BHiry38Vtf3b7VH4CDGipi/MxmeFrR81CeA/rlzYr7Fa8GKbw+ofxLdnqIF32CR48L+KeIwvnkO5q8fGevRTST/oCnxConRReWb5UPB287SZzN9FQjHYL91J4XP6gaMbCxg0KYsLqTf49aLEyuJONSR/sJ5P2JPndG706ZBwGU/YFsAFXFWMG4ZlWKzVBzgADJBJe4OQoi72tsrSZZLRtR4DReTTOOsQgWZMsXteWCCRMSdufuk3bMUnVCcymc71l17w0Dgycri2c4sOltzqJuMb9oTGOjbLRtfyBXf5CQ8FjwwCmhOd46ftxod3mLb7IRKMyg/6w7YuqlZ45/jBBOsrBYYWpmPa8FTrJzI4Nz33tcHiLm fwwq75KH 0fzvLDiUbJN8sUy5sKlUWWVcn7gbZUL3fcdjjBYbPKq7KEvKWn1GRB+Fdo/omuaNc7gGhlChkFRXZEv5GrmHoT1rvLb6mOhcTCvMePOyyoAbRdAaevL7Py3sTsZMDCDI2LHWLUow5p0+I1itHPWfu/DUz6MzUvcHoqjyERm4p04Cq0QJRkDeBTI6DWwoJmHOHC0j3dOxefgjCRr6Wj8mJu7UOXfgBBF2deeqvA+wdmZgVU0tD9icP2HSM9Dl16jgrseveirj2h/8K341Z1sAKFgJvCDz5DAzcCtzmwlHbIQ1wfMpda1LRhlUbOuDNkbwjeF0j70hXWTmRGkXSRCOdHUPhFOwlU4Rx7QY22VAjafADUDIUjwk3Jsoa1xa/UJ39nOBbZpBEZzG9G7MtYgVWWTJrQa9tFEL8kALhyuIs2gE2vJVYV2wSVHElBrB3DWSeEk3nMUyzG5cqYvLRcd8TkD3QfB3k8fHxSR39CgYamL8BeNnHaiX+qyR4M/U/FrN50ZLJxft3rzoaiIyDTLN4kBB2q2lGahxDhZ6det9EM76JIPzjHiZzFN3drnMvYmic1w3mjvp00e0GM0oy79GINOXYcTDmGMxmUqT+mI8wAK7le37nudQLxymd2sZhl5Bfc+Fk8xIsAAbF6RJGwO6Vog5TBfAjTYag5FXLMbKnS9XQ2rC5ppX7dFIFSA== 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: From: Ackerley Tng Track guest_memfd folio sharing state within the inode, since it is a property of the guest_memfd's memory contents. The guest_memfd PRIVATE memory attribute is not used for two reasons. It reflects the userspace expectation for the memory state, and therefore can be toggled by userspace. Also, although each guest_memfd file has a 1:1 binding with a KVM instance, the plan is to allow multiple files per inode, e.g. to allow intra-host migration to a new KVM instance, without destroying guest_memfd. Signed-off-by: Ackerley Tng Co-developed-by: Vishal Annapurve Signed-off-by: Vishal Annapurve Co-developed-by: Fuad Tabba Signed-off-by: Fuad Tabba --- virt/kvm/guest_memfd.c | 56 ++++++++++++++++++++++++++++++++++++++---- 1 file changed, 51 insertions(+), 5 deletions(-) diff --git a/virt/kvm/guest_memfd.c b/virt/kvm/guest_memfd.c index ac6b8853699d..a7f7c6eb6b4a 100644 --- a/virt/kvm/guest_memfd.c +++ b/virt/kvm/guest_memfd.c @@ -17,6 +17,17 @@ struct kvm_gmem { struct list_head entry; }; +struct kvm_gmem_inode_private { +#ifdef CONFIG_KVM_GMEM_SHARED_MEM + struct xarray shared_offsets; +#endif +}; + +static struct kvm_gmem_inode_private *kvm_gmem_private(struct inode *inode) +{ + return inode->i_mapping->i_private_data; +} + #ifdef CONFIG_KVM_GMEM_SHARED_MEM void kvm_gmem_handle_folio_put(struct folio *folio) { @@ -324,8 +335,28 @@ static pgoff_t kvm_gmem_get_index(struct kvm_memory_slot *slot, gfn_t gfn) return gfn - slot->base_gfn + slot->gmem.pgoff; } +static void kvm_gmem_evict_inode(struct inode *inode) +{ + struct kvm_gmem_inode_private *private = kvm_gmem_private(inode); + +#ifdef CONFIG_KVM_GMEM_SHARED_MEM + /* + * .evict_inode can be called before private data is set up if there are + * issues during inode creation. + */ + if (private) + xa_destroy(&private->shared_offsets); +#endif + + truncate_inode_pages_final(inode->i_mapping); + + kfree(private); + clear_inode(inode); +} + static const struct super_operations kvm_gmem_super_operations = { - .statfs = simple_statfs, + .statfs = simple_statfs, + .evict_inode = kvm_gmem_evict_inode, }; static int kvm_gmem_init_fs_context(struct fs_context *fc) @@ -553,6 +584,7 @@ static struct inode *kvm_gmem_inode_make_secure_inode(const char *name, loff_t size, u64 flags) { const struct qstr qname = QSTR_INIT(name, strlen(name)); + struct kvm_gmem_inode_private *private; struct inode *inode; int err; @@ -561,10 +593,19 @@ static struct inode *kvm_gmem_inode_make_secure_inode(const char *name, return inode; err = security_inode_init_security_anon(inode, &qname, NULL); - if (err) { - iput(inode); - return ERR_PTR(err); - } + if (err) + goto out; + + err = -ENOMEM; + private = kzalloc(sizeof(*private), GFP_KERNEL); + if (!private) + goto out; + +#ifdef CONFIG_KVM_GMEM_SHARED_MEM + xa_init(&private->shared_offsets); +#endif + + inode->i_mapping->i_private_data = private; inode->i_private = (void *)(unsigned long)flags; inode->i_op = &kvm_gmem_iops; @@ -577,6 +618,11 @@ static struct inode *kvm_gmem_inode_make_secure_inode(const char *name, WARN_ON_ONCE(!mapping_unevictable(inode->i_mapping)); return inode; + +out: + iput(inode); + + return ERR_PTR(err); } static struct file *kvm_gmem_inode_create_getfile(void *priv, loff_t size, From patchwork Tue Mar 18 16:20:43 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Fuad Tabba X-Patchwork-Id: 14021248 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 400D1C28B28 for ; Tue, 18 Mar 2025 16:21:03 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id A2FC3280014; Tue, 18 Mar 2025 12:20:58 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 9BA2328000B; Tue, 18 Mar 2025 12:20:58 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 7BBEF280014; Tue, 18 Mar 2025 12:20:58 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0015.hostedemail.com [216.40.44.15]) by kanga.kvack.org (Postfix) with ESMTP id 54B8128000B for ; Tue, 18 Mar 2025 12:20:58 -0400 (EDT) Received: from smtpin25.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay03.hostedemail.com (Postfix) with ESMTP id A003BABD2A for ; Tue, 18 Mar 2025 16:20:59 +0000 (UTC) X-FDA: 83235185838.25.04C5184 Received: from mail-wm1-f73.google.com (mail-wm1-f73.google.com [209.85.128.73]) by imf02.hostedemail.com (Postfix) with ESMTP id 2C65B8002B for ; Tue, 18 Mar 2025 16:20:56 +0000 (UTC) Authentication-Results: imf02.hostedemail.com; dkim=pass header.d=google.com header.s=20230601 header.b=dBnPD7tG; dmarc=pass (policy=reject) header.from=google.com; spf=pass (imf02.hostedemail.com: domain of 3Z53ZZwUKCE49qrrqw44w1u.s421y3AD-220Bqs0.47w@flex--tabba.bounces.google.com designates 209.85.128.73 as permitted sender) smtp.mailfrom=3Z53ZZwUKCE49qrrqw44w1u.s421y3AD-220Bqs0.47w@flex--tabba.bounces.google.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1742314857; a=rsa-sha256; cv=none; b=gBz0ZyFTFGgCfjKEUd/+biJ+XZjkMy/NbJQAB1GaX5Ru/Q43XxvzSCeqFtQBcovIk5Fi/T jX+AQdXK8cLgosgRRSjRR3nyOFZa5O8WM4zTl+ahaQHxObWU2fr2NZWjV+31lZp2TFPSQe rw5If1Iie+uPElFbOkQp2CTwfCWcLCk= ARC-Authentication-Results: i=1; imf02.hostedemail.com; dkim=pass header.d=google.com header.s=20230601 header.b=dBnPD7tG; dmarc=pass (policy=reject) header.from=google.com; spf=pass (imf02.hostedemail.com: domain of 3Z53ZZwUKCE49qrrqw44w1u.s421y3AD-220Bqs0.47w@flex--tabba.bounces.google.com designates 209.85.128.73 as permitted sender) smtp.mailfrom=3Z53ZZwUKCE49qrrqw44w1u.s421y3AD-220Bqs0.47w@flex--tabba.bounces.google.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1742314857; 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=0uRqiA5y6bwZJswTBUBVpBBlKkERam5rlpE8w5/s9pQ=; b=KNRUNISK6N19uH6talbPRGRoSeGTz5pL0CvxcA+MWo4sjkb4h+VfPwQY6scKvkPcibmsBf HTcQBfrl0wVxnvUehLGIH8AFVgtWWGFdZXXdSSmq3b8+NcQ/LybpWpnS00Dwsuud+k/iFH MWmaLl5iDFKQgQykj2tGaov0REIo72Y= Received: by mail-wm1-f73.google.com with SMTP id 5b1f17b1804b1-43ced8c2eb7so25949955e9.1 for ; Tue, 18 Mar 2025 09:20:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1742314856; x=1742919656; darn=kvack.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=0uRqiA5y6bwZJswTBUBVpBBlKkERam5rlpE8w5/s9pQ=; b=dBnPD7tGMRmT+9gC69fx96DKLU0O16i5be+QZ0QWEHGX5ZRkpK1aRdzmHHl5AZt2DU kZdhxvr+B/jj4KEWInKUcozw4PcqRjWYbxQtD0WlV1dvSYAaQydzWFdo4zT43iCXDIGz w3nDyH/ut+UBKB6WyVD6f6YvxwhKatwBX2abHAjI82iE8+Tx3GJ8mN1PHa/D11h7pc6E tESRdc7iMMaBb5XhTHDgEFhY6b0LG2kr1wG9zGOKbCh6Er3SP5lt+z9pSB9HKvabEahY 3yMq7d13lH9dxcMnMlQpa+B9ESJFOyhINZmUeblgxX2lfRKlL5Cx9vuRsE3QFBbXuHEf TzTw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1742314856; x=1742919656; 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=0uRqiA5y6bwZJswTBUBVpBBlKkERam5rlpE8w5/s9pQ=; b=keZEENT71PlkBZY6l9W36cvf8TMjXIFgn6nNyzFqmsD/ffPb/YPcFGrP9msbbSbpx5 //IlnZRjl+/M2q/p4js7YAwaYiqizxbrP6Ki8Zzn2qAinuSdLxgooVkwYtWLzlkXA0f+ gxQMxbDK0dF/A3JqaH3P8HNAVZIwT3IG4KTWd8RzXPZwFL5EuXT3x7daeGws5kT/CB0Q vLJTPbE85xeVsME0o0peYJYjkYvPDPXA8+4ojZIpq6Vd67Mwtst/6T2T029QqSlhsJMV srJUfK4ZASdgVCX9B+7xuElFzk2QXH86nGjJfR1I7uPFbhz3YyHaEgKl0Hrqcrs4yToM ba+Q== X-Forwarded-Encrypted: i=1; AJvYcCVgWYLAS0H790dQrPkwsZb9MU3pRMIo59nEd2QTEM+f3begTIcSMQ2MSibcLVZVIx2BpAvf43548w==@kvack.org X-Gm-Message-State: AOJu0Yz0RIxs/QTeqj0sQ/dVl6cDxmjSHH/5uD7NOwqy+JCC8ihX/N1j PVfgQi4HCHXTyQ+LfO8GKgwbcLwSVZo56j1SEzeAt2M7ye7a+A/rqXJ0cbvCssQYQP35oyJbxw= = X-Google-Smtp-Source: AGHT+IGmIciTBdHZ96gCAdqnT6Aeuf4gTKWQU8tfq92iyygo3HUg48wgjEHxGX/Kbvi4hg2TcPjULeDUFw== X-Received: from wmbfl10.prod.google.com ([2002:a05:600c:b8a:b0:43c:f122:1874]) (user=tabba job=prod-delivery.src-stubby-dispatcher) by 2002:a05:600c:3c9e:b0:43c:f4df:4870 with SMTP id 5b1f17b1804b1-43d3ba06316mr23345235e9.25.1742314855816; Tue, 18 Mar 2025 09:20:55 -0700 (PDT) Date: Tue, 18 Mar 2025 16:20:43 +0000 In-Reply-To: <20250318162046.4016367-1-tabba@google.com> Mime-Version: 1.0 References: <20250318162046.4016367-1-tabba@google.com> X-Mailer: git-send-email 2.49.0.rc1.451.g8f38331e32-goog Message-ID: <20250318162046.4016367-5-tabba@google.com> Subject: [PATCH v6 4/7] KVM: guest_memfd: Folio sharing states and functions that manage their transition 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, 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, peterx@redhat.com, tabba@google.com X-Rspamd-Server: rspam07 X-Rspam-User: X-Stat-Signature: mfhtabi3wi4yxky6wwpdqs7yy7f754yg X-Rspamd-Queue-Id: 2C65B8002B X-HE-Tag: 1742314856-562383 X-HE-Meta: U2FsdGVkX1/XFZJr5QxIrsVCcBiHbi6atuA3AVmsdixCEvHAb/mVusk6p/brxZ6RfMSh+klCG/+Pg//a/iG5C5qJoi1351dJarjli5kIv9akoOliIuUSoyQl7azf1kH9wBXk5MZE35Y2PLH1yIp+yzp3zLJ+SOk3blG9fZpzIXqY60LDSWcIJ4Afl4kJWkRPitCkWjF4a0IjaBlmhSToPRhKcqFYpDnp5bocRDVFxEKj2NBLjEJb88dxsBmGeMV8EiTE1Q0cA3fihbVxRKbi22GhmQQaHfxz0CaXJa60Tin9amSGQ//yNGsL6vawWFHKemc9eVYEYiAAjsr+//U9K7BbTzzAw1rSaFRrLh+lfU1BCtOxZPPDnu27IqhcSuQ3+6g0OhHj8sYYtnJrHytCTZPTq5fbpMve31IdN5chXdonCQXidnLuM2bYoIF3JdW69a/1yYHKdquZU972+WUGUQJNCLZ1dNltyrj5bNnef6/zCqsYnHtb8lV1obpom6j4rl7wCgSJxnZrETxK0E0B4YwzyU4mQ76uvKKZz/dQT7JtJOvZx2jucLq8TB0Kjd6XQUbK6496dGIeM4S/ZMXdah8SPt/g5rrYsJJlEuxoRTDzCHhsDfUDvZ873F75WWNiRCzB0HB3krqFHXdubSqyzEgSsXUh52t9zOb25MutR8f4nQs0fETZqmpXivHRIwo6FCU8kQglaeuhlKyVdgVHRYn6AdVSg5/wgsBLTjYMogivnkz4rY17u0w2ixpUqpRZQ+rjFywPtg1lv2KVlJ9NYT1WFlje/jXcnzJZz1Ege2oMXhzol187xGhVc3cSEseQrv2ho8h/0D1mKnEL11acPdfqJPk+UQ0CQgbLWsAYMf2FFaOd5+pvznH1Uf40/l9TEfYThrK8RzG1nQpUUXzIVr9e7iroqzbCWWVDnold43dzYjOWkmM+4Gz+5DSLW5knALeRj48qasGYEz+H5Fx RO80xP93 v1FM0gledgkLlG73Y8bdTmRvXdIn/wtdmXhCsQZlYFNVVWagEA1TZA8VjZR3FWoAVU4K2IZqdENY920fkwfN5Zs9pbOJF6EffDkxvbIkySxsABZ/PZjcxYLG8ca5Qt2DcW/VoHST0VpTFDlw9D+G1fu0xK+qUqSYiclx1WpsHhpugAGHcenmKHncYGxOMYQvQDTjmbBrDppeh8jpoC5/rakMjYxJtaaVgMcdpyi61QtZPi5cCUA36i8y/3YuiWABs/ejJyycggKhjpz6TsPD8zg4JehcBavpH/r0zmIwvDqGRUpBZej6/7bGo+zETemf8pT2naBerVe+4H4fxB5VoP3dcq6GDG2QCvVjLxsHyfPAAtw8VpfkwAUIRwKznsHFeEuj1OnEdjP7h9ldsspCMssokvm+Iwd/o7ET4lTLBpP9OMtHJtjfEI9Ef5531XswQnUGZgJzHQ67prOEiJNavy0BeVjK81q6iAdf8xYMQf6yfpJjL3A9O/XmOzmyOn/TYAr6I9EL/coLFsQykEaiNal7PyDBsGrRngWdOd2vcr+9yJVoLw8BDdssKE5ramAP3UUi+PvP0qX0mGsF0Lv5zFnbbRXB6wUGKSiM6033EK5WrVqA5EAL23WiEX2Dwrb99CNon5zNEReUTgw96KPX8pa7kSg== 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: To allow in-place sharing of guest_memfd folios with the host, guest_memfd needs to track their sharing state, because mapping of shared folios will only be allowed where it safe to access these folios. It is safe to map and access these folios when explicitly shared with the host, or potentially if not yet exposed to the guest (e.g., at initialization). This patch introduces sharing states for guest_memfd folios as well as the functions that manage transitioning between those states. Signed-off-by: Fuad Tabba --- include/linux/kvm_host.h | 39 +++++++- virt/kvm/guest_memfd.c | 188 ++++++++++++++++++++++++++++++++++++--- virt/kvm/kvm_main.c | 62 +++++++++++++ 3 files changed, 275 insertions(+), 14 deletions(-) diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index bc73d7426363..bf82faf16c53 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h @@ -2600,7 +2600,44 @@ long kvm_arch_vcpu_pre_fault_memory(struct kvm_vcpu *vcpu, #endif #ifdef CONFIG_KVM_GMEM_SHARED_MEM +int kvm_gmem_set_shared(struct kvm *kvm, gfn_t start, gfn_t end); +int kvm_gmem_clear_shared(struct kvm *kvm, gfn_t start, gfn_t end); +int kvm_gmem_slot_set_shared(struct kvm_memory_slot *slot, gfn_t start, + gfn_t end); +int kvm_gmem_slot_clear_shared(struct kvm_memory_slot *slot, gfn_t start, + gfn_t end); +bool kvm_gmem_slot_is_guest_shared(struct kvm_memory_slot *slot, gfn_t gfn); void kvm_gmem_handle_folio_put(struct folio *folio); -#endif +#else +static inline int kvm_gmem_set_shared(struct kvm *kvm, gfn_t start, gfn_t end) +{ + WARN_ON_ONCE(1); + return -EINVAL; +} +static inline int kvm_gmem_clear_shared(struct kvm *kvm, gfn_t start, + gfn_t end) +{ + WARN_ON_ONCE(1); + return -EINVAL; +} +static inline int kvm_gmem_slot_set_shared(struct kvm_memory_slot *slot, + gfn_t start, gfn_t end) +{ + WARN_ON_ONCE(1); + return -EINVAL; +} +static inline int kvm_gmem_slot_clear_shared(struct kvm_memory_slot *slot, + gfn_t start, gfn_t end) +{ + WARN_ON_ONCE(1); + return -EINVAL; +} +static inline bool kvm_gmem_slot_is_guest_shared(struct kvm_memory_slot *slot, + gfn_t gfn) +{ + WARN_ON_ONCE(1); + return false; +} +#endif /* CONFIG_KVM_GMEM_SHARED_MEM */ #endif diff --git a/virt/kvm/guest_memfd.c b/virt/kvm/guest_memfd.c index a7f7c6eb6b4a..4b857ab421bf 100644 --- a/virt/kvm/guest_memfd.c +++ b/virt/kvm/guest_memfd.c @@ -28,14 +28,6 @@ static struct kvm_gmem_inode_private *kvm_gmem_private(struct inode *inode) return inode->i_mapping->i_private_data; } -#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."); -} -EXPORT_SYMBOL_GPL(kvm_gmem_handle_folio_put); -#endif /* CONFIG_KVM_GMEM_SHARED_MEM */ - /** * folio_file_pfn - like folio_file_page, but return a pfn. * @folio: The folio which contains this index. @@ -388,13 +380,183 @@ static void kvm_gmem_init_mount(void) } #ifdef CONFIG_KVM_GMEM_SHARED_MEM -static bool kvm_gmem_offset_is_shared(struct file *file, pgoff_t index) +/* + * An enum of the valid folio sharing states: + * Bit 0: set if not shared with the guest (guest cannot fault it in) + * Bit 1: set if not shared with the host (host cannot fault it in) + */ +enum folio_shareability { + KVM_GMEM_ALL_SHARED = 0b00, /* Shared with host and guest. */ + KVM_GMEM_GUEST_SHARED = 0b10, /* Shared only with guest. */ + KVM_GMEM_NONE_SHARED = 0b11, /* Not shared, transient state. */ +}; + +static int kvm_gmem_offset_set_shared(struct inode *inode, pgoff_t index) { - struct kvm_gmem *gmem = file->private_data; + struct xarray *shared_offsets = &kvm_gmem_private(inode)->shared_offsets; + void *xval = xa_mk_value(KVM_GMEM_ALL_SHARED); + + rwsem_assert_held_write_nolockdep(&inode->i_mapping->invalidate_lock); + + return xa_err(xa_store(shared_offsets, index, xval, GFP_KERNEL)); +} + +/* + * Marks the range [start, end) as shared with both the host and the guest. + * Called when guest shares memory with the host. + */ +static int kvm_gmem_offset_range_set_shared(struct inode *inode, + pgoff_t start, pgoff_t end) +{ + pgoff_t i; + int r = 0; + + filemap_invalidate_lock(inode->i_mapping); + for (i = start; i < end; i++) { + r = kvm_gmem_offset_set_shared(inode, i); + if (WARN_ON_ONCE(r)) + break; + } + filemap_invalidate_unlock(inode->i_mapping); + + return r; +} + +static int kvm_gmem_offset_clear_shared(struct inode *inode, pgoff_t index) +{ + struct xarray *shared_offsets = &kvm_gmem_private(inode)->shared_offsets; + void *xval_guest = xa_mk_value(KVM_GMEM_GUEST_SHARED); + void *xval_none = xa_mk_value(KVM_GMEM_NONE_SHARED); + struct folio *folio; + int refcount; + int r; + + rwsem_assert_held_write_nolockdep(&inode->i_mapping->invalidate_lock); + + folio = filemap_lock_folio(inode->i_mapping, index); + if (!IS_ERR(folio)) { + /* +1 references are expected because of filemap_lock_folio(). */ + refcount = folio_nr_pages(folio) + 1; + } else { + r = PTR_ERR(folio); + if (WARN_ON_ONCE(r != -ENOENT)) + return r; + + folio = NULL; + } + + if (!folio || folio_ref_freeze(folio, refcount)) { + /* + * No outstanding references: transition to guest shared. + */ + r = xa_err(xa_store(shared_offsets, index, xval_guest, GFP_KERNEL)); + + if (folio) + folio_ref_unfreeze(folio, refcount); + } else { + /* + * Outstanding references: the folio cannot be faulted in by + * anyone until they're dropped. + */ + r = xa_err(xa_store(shared_offsets, index, xval_none, GFP_KERNEL)); + } + + if (folio) { + folio_unlock(folio); + folio_put(folio); + } + + return r; +} + +/* + * Marks the range [start, end) as not shared with the host. If the host doesn't + * have any references to a particular folio, then that folio is marked as + * shared with the guest. + * + * However, if the host still has references to the folio, then the folio is + * marked and not shared with anyone. Marking it as not shared allows draining + * all references from the host, and ensures that the hypervisor does not + * transition the folio to private, since the host still might access it. + * + * Called when guest unshares memory with the host. + */ +static int kvm_gmem_offset_range_clear_shared(struct inode *inode, + pgoff_t start, pgoff_t end) +{ + pgoff_t i; + int r = 0; + + filemap_invalidate_lock(inode->i_mapping); + for (i = start; i < end; i++) { + r = kvm_gmem_offset_clear_shared(inode, i); + if (WARN_ON_ONCE(r)) + break; + } + filemap_invalidate_unlock(inode->i_mapping); + + return r; +} + +void kvm_gmem_handle_folio_put(struct folio *folio) +{ + WARN_ONCE(1, "A placeholder that shouldn't trigger. Work in progress."); +} +EXPORT_SYMBOL_GPL(kvm_gmem_handle_folio_put); + +static bool kvm_gmem_offset_is_shared(struct inode *inode, pgoff_t index) +{ + struct xarray *shared_offsets = &kvm_gmem_private(inode)->shared_offsets; + unsigned long r; + + rwsem_assert_held_nolockdep(&inode->i_mapping->invalidate_lock); + + r = xa_to_value(xa_load(shared_offsets, index)); + + return r == KVM_GMEM_ALL_SHARED; +} + +static bool kvm_gmem_offset_is_guest_shared(struct inode *inode, pgoff_t index) +{ + struct xarray *shared_offsets = &kvm_gmem_private(inode)->shared_offsets; + unsigned long r; + + rwsem_assert_held_nolockdep(&inode->i_mapping->invalidate_lock); + + r = xa_to_value(xa_load(shared_offsets, index)); + + return (r == KVM_GMEM_ALL_SHARED || r == KVM_GMEM_GUEST_SHARED); +} + +int kvm_gmem_slot_set_shared(struct kvm_memory_slot *slot, gfn_t start, gfn_t end) +{ + struct inode *inode = file_inode(READ_ONCE(slot->gmem.file)); + pgoff_t start_off = slot->gmem.pgoff + start - slot->base_gfn; + pgoff_t end_off = start_off + end - start; + + return kvm_gmem_offset_range_set_shared(inode, start_off, end_off); +} + +int kvm_gmem_slot_clear_shared(struct kvm_memory_slot *slot, gfn_t start, gfn_t end) +{ + struct inode *inode = file_inode(READ_ONCE(slot->gmem.file)); + pgoff_t start_off = slot->gmem.pgoff + start - slot->base_gfn; + pgoff_t end_off = start_off + end - start; + + return kvm_gmem_offset_range_clear_shared(inode, start_off, end_off); +} + +bool kvm_gmem_slot_is_guest_shared(struct kvm_memory_slot *slot, gfn_t gfn) +{ + struct inode *inode = file_inode(READ_ONCE(slot->gmem.file)); + unsigned long pgoff = slot->gmem.pgoff + gfn - slot->base_gfn; + bool r; + filemap_invalidate_lock_shared(inode->i_mapping); + r = kvm_gmem_offset_is_guest_shared(inode, pgoff); + filemap_invalidate_unlock_shared(inode->i_mapping); - /* For now, VMs that support shared memory share all their memory. */ - return kvm_arch_gmem_supports_shared_mem(gmem->kvm); + return r; } static vm_fault_t kvm_gmem_fault(struct vm_fault *vmf) @@ -422,7 +584,7 @@ static vm_fault_t kvm_gmem_fault(struct vm_fault *vmf) goto out_folio; } - if (!kvm_gmem_offset_is_shared(vmf->vma->vm_file, vmf->pgoff)) { + if (!kvm_gmem_offset_is_shared(inode, vmf->pgoff)) { ret = VM_FAULT_SIGBUS; goto out_folio; } diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index 3e40acb9f5c0..90762252381c 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -3091,6 +3091,68 @@ static int next_segment(unsigned long len, int offset) return len; } +#ifdef CONFIG_KVM_GMEM_SHARED_MEM +int kvm_gmem_set_shared(struct kvm *kvm, gfn_t start, gfn_t end) +{ + struct kvm_memslot_iter iter; + int r = 0; + + mutex_lock(&kvm->slots_lock); + + kvm_for_each_memslot_in_gfn_range(&iter, kvm_memslots(kvm), start, end) { + struct kvm_memory_slot *memslot = iter.slot; + gfn_t gfn_start, gfn_end; + + if (!kvm_slot_can_be_private(memslot)) + continue; + + gfn_start = max(start, memslot->base_gfn); + gfn_end = min(end, memslot->base_gfn + memslot->npages); + if (WARN_ON_ONCE(start >= end)) + continue; + + r = kvm_gmem_slot_set_shared(memslot, gfn_start, gfn_end); + if (WARN_ON_ONCE(r)) + break; + } + + mutex_unlock(&kvm->slots_lock); + + return r; +} +EXPORT_SYMBOL_GPL(kvm_gmem_set_shared); + +int kvm_gmem_clear_shared(struct kvm *kvm, gfn_t start, gfn_t end) +{ + struct kvm_memslot_iter iter; + int r = 0; + + mutex_lock(&kvm->slots_lock); + + kvm_for_each_memslot_in_gfn_range(&iter, kvm_memslots(kvm), start, end) { + struct kvm_memory_slot *memslot = iter.slot; + gfn_t gfn_start, gfn_end; + + if (!kvm_slot_can_be_private(memslot)) + continue; + + gfn_start = max(start, memslot->base_gfn); + gfn_end = min(end, memslot->base_gfn + memslot->npages); + if (WARN_ON_ONCE(start >= end)) + continue; + + r = kvm_gmem_slot_clear_shared(memslot, gfn_start, gfn_end); + if (WARN_ON_ONCE(r)) + break; + } + + mutex_unlock(&kvm->slots_lock); + + return r; +} +EXPORT_SYMBOL_GPL(kvm_gmem_clear_shared); +#endif /* CONFIG_KVM_GMEM_SHARED_MEM */ + /* Copy @len bytes from guest memory at '(@gfn * PAGE_SIZE) + @offset' to @data */ static int __kvm_read_guest_page(struct kvm_memory_slot *slot, gfn_t gfn, void *data, int offset, int len) From patchwork Tue Mar 18 16:20:44 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Fuad Tabba X-Patchwork-Id: 14021249 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 DDB6DC282EC for ; Tue, 18 Mar 2025 16:21:06 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id F2B9D280015; Tue, 18 Mar 2025 12:21:00 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id E175428000B; Tue, 18 Mar 2025 12:21:00 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id BCE32280015; Tue, 18 Mar 2025 12:21:00 -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 9174C28000B for ; Tue, 18 Mar 2025 12:21:00 -0400 (EDT) Received: from smtpin02.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay05.hostedemail.com (Postfix) with ESMTP id CAF29586F0 for ; Tue, 18 Mar 2025 16:21:01 +0000 (UTC) X-FDA: 83235185922.02.6B68086 Received: from mail-wm1-f74.google.com (mail-wm1-f74.google.com [209.85.128.74]) by imf08.hostedemail.com (Postfix) with ESMTP id 66883160027 for ; Tue, 18 Mar 2025 16:20:59 +0000 (UTC) Authentication-Results: imf08.hostedemail.com; dkim=pass header.d=google.com header.s=20230601 header.b=bGAbca+c; spf=pass (imf08.hostedemail.com: domain of 3aZ3ZZwUKCFABsttsy66y3w.u64305CF-442Dsu2.69y@flex--tabba.bounces.google.com designates 209.85.128.74 as permitted sender) smtp.mailfrom=3aZ3ZZwUKCFABsttsy66y3w.u64305CF-442Dsu2.69y@flex--tabba.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=1742314859; 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=a6WFCPXhVulU3JlKKdNPQ8TZldM3kvZLBiH+wPK8x24=; b=mYW6LTTglA4KNo73jMpGpA43D1ybU9vWSA6QUP826Dz24SUG8XfmBzeQbhuvmgXYyGgEQB u21MuEnG0CAhwD7RVKHLVrmvoe3oMtQciMm3TTu1GTSP+Tmn6kpn+fEGDL2nK0p13t/KBI bo4eiWr6ronYSPo4NxTzmN9JSWnzI50= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1742314859; a=rsa-sha256; cv=none; b=xE7Mzrp6zIfc7XiH9Z3Hu75nY6kGDvB3hRpw9Tfl1f9kXaIUfxnO58TwZTvKq9MKHzbAz7 CLJgpDBaHPZpG49ECH6keB6J4X6fwhe9UZZG5kx1ip4DWjAvmZaa22iEact17WTVBYOa1Z 5Ino4OroZ7lMO3j2sJ4riaLPPWysB4Q= ARC-Authentication-Results: i=1; imf08.hostedemail.com; dkim=pass header.d=google.com header.s=20230601 header.b=bGAbca+c; spf=pass (imf08.hostedemail.com: domain of 3aZ3ZZwUKCFABsttsy66y3w.u64305CF-442Dsu2.69y@flex--tabba.bounces.google.com designates 209.85.128.74 as permitted sender) smtp.mailfrom=3aZ3ZZwUKCFABsttsy66y3w.u64305CF-442Dsu2.69y@flex--tabba.bounces.google.com; dmarc=pass (policy=reject) header.from=google.com Received: by mail-wm1-f74.google.com with SMTP id 5b1f17b1804b1-43ce245c5acso39934955e9.2 for ; Tue, 18 Mar 2025 09:20:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1742314858; x=1742919658; darn=kvack.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=a6WFCPXhVulU3JlKKdNPQ8TZldM3kvZLBiH+wPK8x24=; b=bGAbca+cRpgRzhxqEwegVEkGPvhWJBt6nZhw05wiiMNADAYy6rxH7zFrHZo6GdxTlD Ty58t5/NHmuolduYaHMZB6PtLTtn2oHt11+AW8oorMuhTeQuBT9WRg8Ino0oJoEPyGra oMU8SHk7IWmKWEyxlaN5ADB3C+KQJggqCGCu3WAYN+PkORq7iuridl0MdOns3afuxwbu j7o98DEEE12NoDFDftYaGQ6BwLXD971Cw59vTbidJXN+dYYeUDF37xPMHC7LKBA5xQcF //3bTqNDwcXtFy+HZPxNIdjgf4e+X6kZKKz5mBfJIImPlEAfu3ciS03TJRPz4XNGEJr9 8tOg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1742314858; x=1742919658; 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=a6WFCPXhVulU3JlKKdNPQ8TZldM3kvZLBiH+wPK8x24=; b=jIsmiJaHnS8ejk3y3vB10WdMQJgsEyBlIQb+DXROYB27Hz4q9Rpz4NLCx1+AygZO99 8wuN9y0bMHo6t0NyX2SKqirpArKhBzchNSlV7Qfkx87IKPoxl9ta2a+tF9E2M3m3DN9b NKoHnvDk9pbS7UEbBUXV/+S9ZzpbUdKWPYLfg63qHPKORcohza/h3swUAhWs00IZs8Hd ydsgDG8qKvVZeUG9D5qwsZ2ONZgmV/WEtM7miGbe7rq5IVDOfwxDT5RHJKyfTZBBcEMv p3CT0tzWWfSjrJfZHpsCa53TNLBwTykKEWXG4X3rI5jMuo7DWwTBionm5+E2GcosjP4w MVaQ== X-Forwarded-Encrypted: i=1; AJvYcCXEqlj4sKo3OwJCFTQ15s3e94i5lXO4ApjzDntXzFoOZ1uL0k6BhT7lPaJGbFG0a/JxYXDW/L6I9Q==@kvack.org X-Gm-Message-State: AOJu0YzZbSjqqPNym2/tzog59l9PCN+uTUGwaYEMB+ntfswIeb8bv0Ln srYhW20NhDdBvxpZtjujM7wMDKA4ikZM2psyWZLhLJzJ8IF03O0ObKidqDvS7EhzTfbhJBQVFA= = X-Google-Smtp-Source: AGHT+IFpCY8S6zPBB8YKDIAA3pydzkUV4b8FblJAz6faFFJzNyDdarVqLGdmgRcnMjMcQ62t91jU7QaUhQ== X-Received: from wmrs14.prod.google.com ([2002:a05:600c:384e:b0:43c:f8ae:4d6c]) (user=tabba job=prod-delivery.src-stubby-dispatcher) by 2002:a05:600c:4e0b:b0:43c:fbbf:7bf1 with SMTP id 5b1f17b1804b1-43d3ba0f389mr35016465e9.30.1742314857836; Tue, 18 Mar 2025 09:20:57 -0700 (PDT) Date: Tue, 18 Mar 2025 16:20:44 +0000 In-Reply-To: <20250318162046.4016367-1-tabba@google.com> Mime-Version: 1.0 References: <20250318162046.4016367-1-tabba@google.com> X-Mailer: git-send-email 2.49.0.rc1.451.g8f38331e32-goog Message-ID: <20250318162046.4016367-6-tabba@google.com> Subject: [PATCH v6 5/7] KVM: guest_memfd: Restore folio state after 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, 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, peterx@redhat.com, tabba@google.com X-Rspam-User: X-Rspamd-Server: rspam02 X-Rspamd-Queue-Id: 66883160027 X-Stat-Signature: zey4csi8s4d5x77njqgrd141961z6gjp X-HE-Tag: 1742314859-184173 X-HE-Meta: U2FsdGVkX1+VLjzjvunqiG4WqPQpusH4s6L4iQW31auaJ5zGA1h1fk/Q+kDjxGtf8WOzyTg8woeLzcKdIlNBL2TQqd50f3jJuPiLkj33TI7XCnmue+JGVZ+sqj6LXV/jmXiL7inOXqmf1EXCeBSCNBNbPZ6AhWA1LDQR/L5rLN0XyhoTpMD6VAyTJ6hJghV1H67HcH+OevDy1UyAFBHG7OZgxmNUvRxcDcCiInzyUa3hg5CaaXm2BCCTYSfRRmopht3xCc6cldbjl6aNkrJpD12sX1p8oVJl9zrfBbG64kAvDw2KrHF7G4qQwt7yxIv+d7NUHvQwgmeQhyMaFKI3TZ1ZKXoP2QLTNvF4DMfNF0KaUtwSFamO0+skKi3sx42nDOyYsScuLqr4wwwQLxEYi6M3YhC91TzGPdDNlJzn+R9pPbV37liUNpi/IozNq3ZSjIpFOizeJ4sX8TotFsj2sGBI2tejX5ZTlHPS6JBGNZKJvVBwowQ3PiVdieHYxBuH3t3lhxUD2DCjPMJCmObcGyEm+wFIKHsf/mSc03j+1XnGBDCu2HjLtFdD7zH+Q8sFM5rScrCtuh1RK1GOWyLNvCnSLkIeTwbDCBFBU+zorqva9YoEIW1hYCQ7iRQ8pOUfpmifgITuweiO2JCDCyzZICpY4wIp0iIn6C+rZYKBjQQ4zmfYkvgbWDdBF0q4laEvA+dPocJ81CTaTX5NAxCsvIePeu+GT+xnVQZlpBVywcWzir6BV73OyeLyH74nGbRbkrPV2+UoJGLn8ZOxkN2e4xsI92PUJrGLaWBrA3BTmUXDZEC7UOkyrmYMY6Ib2IMUUuiS+rfsnA6bAtOADCQJ4x1SP9chBaWP/2Ybw+ickGFyp0GVLRPYEZh/3OUPTX7EUJct3sjQLAa3H7/NpFPHNfcFurpr6hfECmerW9PvvGn+6x8FzWIbsjLAYUdlhnnITMLwiMw7ySrGx9JP3T7 2PYe2/Jq v1pxEWYYbMtH14SexwXKTEzlQU5UwiWPppHLFVnD6EcGCJs6/7GfMSINd7obSVl9sx9nhOpfdj6xrER1icnj9sGvSxfbXevhtzdW0L5XqXX0rIlL8YuZaW5kDmsTr644uA/08j1QJfv+K4vKiLNPXklvX4FlPncCSJPFLF7cp/qhUtPIqYO7UGokeSHmFZptNvWK/qYRYYVkFYEemBfF4XSYqpYAIznV5XK0MAtxMkAvQEYdy5/IOVGQiI9yNkr/EjorEAG7Q+vf37twvJEpHj/T3jEpJn4UEz0TjN+lTaWNAIOXuxoWkeBTTNyQQLwM5MyYGXOi+eDaZIYAx2eysqmB6Q58nqT6pWRwtKNwaDsqppTU4gI241cKgs2/f+lJmLkCE6RJpvjdM+EMIqHqLxhwaBzP2tHOmiywshXnjSevCbZGWxXN/9vAZ+dLPOgd+ESe2/Q3lnI6w9U3LHd4mnQnjsH0jGhiJlkuO7j2tGnhdlkEN3ECxLrWcx+Q1AoYI2T8pBHJoUUjCvnJ8r26sGGZoXNUDV+SYUAvfdWOg3f2z1RYNjgy/7JlJP3RF69zz9bNBuYKmpTxwgycFosUQWUs4hldHXz9RYaWadJJc2u7QVamIPttNKG4CmGFooN9cfZA0Tlbi6ZqDH1VjcytS5KaOTh6XWB0C+lBYQb+D2F6/1YnzuPisTb75D1ISRnPBTprClyoHPk/yRRk= 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: 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 uses the guest_memfd folio type 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 --- The function kvm_slot_gmem_register_callback() isn't used in this series. It will be used later in code that performs unsharing of memory. I have tested it with pKVM, based on downstream code [*]. It's included in this RFC since it demonstrates the plan to handle unsharing of private folios. [*] https://android-kvm.googlesource.com/linux/+/refs/heads/tabba/guestmem-6.13-v6-pkvm --- include/linux/kvm_host.h | 6 ++ virt/kvm/guest_memfd.c | 142 ++++++++++++++++++++++++++++++++++++++- 2 files changed, 147 insertions(+), 1 deletion(-) diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index bf82faf16c53..d9d9d72d8beb 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h @@ -2607,6 +2607,7 @@ int kvm_gmem_slot_set_shared(struct kvm_memory_slot *slot, gfn_t start, int kvm_gmem_slot_clear_shared(struct kvm_memory_slot *slot, gfn_t start, gfn_t end); bool kvm_gmem_slot_is_guest_shared(struct kvm_memory_slot *slot, gfn_t gfn); +int kvm_gmem_slot_register_callback(struct kvm_memory_slot *slot, gfn_t gfn); void kvm_gmem_handle_folio_put(struct folio *folio); #else static inline int kvm_gmem_set_shared(struct kvm *kvm, gfn_t start, gfn_t end) @@ -2638,6 +2639,11 @@ static inline bool kvm_gmem_slot_is_guest_shared(struct kvm_memory_slot *slot, WARN_ON_ONCE(1); return false; } +static inline int kvm_gmem_slot_register_callback(struct kvm_memory_slot *slot, gfn_t gfn) +{ + WARN_ON_ONCE(1); + return -EINVAL; +} #endif /* CONFIG_KVM_GMEM_SHARED_MEM */ #endif diff --git a/virt/kvm/guest_memfd.c b/virt/kvm/guest_memfd.c index 4b857ab421bf..4fd9e5760503 100644 --- a/virt/kvm/guest_memfd.c +++ b/virt/kvm/guest_memfd.c @@ -391,6 +391,28 @@ enum folio_shareability { KVM_GMEM_NONE_SHARED = 0b11, /* Not shared, transient state. */ }; +/* + * Unregisters the __folio_put() callback from the folio. + * + * Restores a folio's refcount after all pending references have been released, + * and removes the folio type, thereby removing the callback. Now the folio can + * be freed normaly once all actual references have been dropped. + * + * Must be called with the filemap (inode->i_mapping) invalidate_lock held, and + * the folio must be locked. + */ +static void kvm_gmem_restore_pending_folio(struct folio *folio, const struct inode *inode) +{ + rwsem_assert_held_write_nolockdep(&inode->i_mapping->invalidate_lock); + WARN_ON_ONCE(!folio_test_locked(folio)); + + if (WARN_ON_ONCE(folio_mapped(folio) || !folio_test_guestmem(folio))) + return; + + __folio_clear_guestmem(folio); + folio_ref_add(folio, folio_nr_pages(folio)); +} + static int kvm_gmem_offset_set_shared(struct inode *inode, pgoff_t index) { struct xarray *shared_offsets = &kvm_gmem_private(inode)->shared_offsets; @@ -398,6 +420,24 @@ static int kvm_gmem_offset_set_shared(struct inode *inode, pgoff_t index) rwsem_assert_held_write_nolockdep(&inode->i_mapping->invalidate_lock); + /* + * If the folio is NONE_SHARED, it indicates that it is transitioning to + * private (GUEST_SHARED). Transition it to shared (ALL_SHARED) + * immediately, and remove the callback. + */ + if (xa_to_value(xa_load(shared_offsets, index)) == KVM_GMEM_NONE_SHARED) { + struct folio *folio = filemap_lock_folio(inode->i_mapping, index); + + if (WARN_ON_ONCE(IS_ERR(folio))) + return PTR_ERR(folio); + + if (folio_test_guestmem(folio)) + kvm_gmem_restore_pending_folio(folio, inode); + + folio_unlock(folio); + folio_put(folio); + } + return xa_err(xa_store(shared_offsets, index, xval, GFP_KERNEL)); } @@ -498,9 +538,109 @@ static int kvm_gmem_offset_range_clear_shared(struct inode *inode, return r; } +/* + * Registers a callback to __folio_put(), so that gmem knows that the host does + * not have any references to the folio. The callback itself is registered by + * setting the folio type to guestmem. + * + * Returns 0 if a callback was registered or already has been registered, or + * -EAGAIN if the host has references, indicating a callback wasn't registered. + * + * Must be called with the filemap (inode->i_mapping) invalidate_lock held, and + * the folio must be locked. + */ +static int kvm_gmem_register_callback(struct folio *folio, struct inode *inode, pgoff_t index) +{ + struct xarray *shared_offsets = &kvm_gmem_private(inode)->shared_offsets; + void *xval_guest = xa_mk_value(KVM_GMEM_GUEST_SHARED); + int refcount; + int r = 0; + + rwsem_assert_held_write_nolockdep(&inode->i_mapping->invalidate_lock); + WARN_ON_ONCE(!folio_test_locked(folio)); + + if (folio_test_guestmem(folio)) + return 0; + + if (folio_mapped(folio)) + return -EAGAIN; + + refcount = folio_ref_count(folio); + if (!folio_ref_freeze(folio, refcount)) + return -EAGAIN; + + /* + * Register callback by setting the folio type and subtracting gmem's + * references for it to trigger once outstanding references are dropped. + */ + if (refcount > 1) { + __folio_set_guestmem(folio); + refcount -= folio_nr_pages(folio); + } else { + /* No outstanding references, transition it to guest shared. */ + r = WARN_ON_ONCE(xa_err(xa_store(shared_offsets, index, xval_guest, GFP_KERNEL))); + } + + folio_ref_unfreeze(folio, refcount); + return r; +} + +int kvm_gmem_slot_register_callback(struct kvm_memory_slot *slot, gfn_t gfn) +{ + unsigned long pgoff = slot->gmem.pgoff + gfn - slot->base_gfn; + struct inode *inode = file_inode(READ_ONCE(slot->gmem.file)); + struct folio *folio; + int r; + + filemap_invalidate_lock(inode->i_mapping); + + folio = filemap_lock_folio(inode->i_mapping, pgoff); + if (WARN_ON_ONCE(IS_ERR(folio))) { + r = PTR_ERR(folio); + goto out; + } + + r = kvm_gmem_register_callback(folio, inode, pgoff); + + folio_unlock(folio); + folio_put(folio); +out: + filemap_invalidate_unlock(inode->i_mapping); + + return r; +} +EXPORT_SYMBOL_GPL(kvm_gmem_slot_register_callback); + +/* + * Callback function for __folio_put(), i.e., called once all references by the + * host to the folio have been dropped. This allows gmem to transition the state + * of the folio to shared with the guest, and allows the hypervisor to continue + * transitioning its state to private, since the host cannot attempt to access + * it anymore. + */ void kvm_gmem_handle_folio_put(struct folio *folio) { - WARN_ONCE(1, "A placeholder that shouldn't trigger. Work in progress."); + struct address_space *mapping; + struct xarray *shared_offsets; + struct inode *inode; + pgoff_t index; + void *xval; + + mapping = folio->mapping; + if (WARN_ON_ONCE(!mapping)) + return; + + inode = mapping->host; + index = folio->index; + shared_offsets = &kvm_gmem_private(inode)->shared_offsets; + xval = xa_mk_value(KVM_GMEM_GUEST_SHARED); + + filemap_invalidate_lock(inode->i_mapping); + folio_lock(folio); + kvm_gmem_restore_pending_folio(folio, inode); + folio_unlock(folio); + WARN_ON_ONCE(xa_err(xa_store(shared_offsets, index, xval, GFP_KERNEL))); + filemap_invalidate_unlock(inode->i_mapping); } EXPORT_SYMBOL_GPL(kvm_gmem_handle_folio_put); From patchwork Tue Mar 18 16:20:45 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Fuad Tabba X-Patchwork-Id: 14021250 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 34388C28B28 for ; Tue, 18 Mar 2025 16:21:10 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 9EEEB280016; Tue, 18 Mar 2025 12:21:02 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 8FF6228000B; Tue, 18 Mar 2025 12:21:02 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 6B649280016; Tue, 18 Mar 2025 12:21:02 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0014.hostedemail.com [216.40.44.14]) by kanga.kvack.org (Postfix) with ESMTP id 29E9128000B for ; Tue, 18 Mar 2025 12:21:02 -0400 (EDT) Received: from smtpin13.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay02.hostedemail.com (Postfix) with ESMTP id E96781206ED for ; Tue, 18 Mar 2025 16:21:02 +0000 (UTC) X-FDA: 83235185964.13.548A69B Received: from mail-wm1-f73.google.com (mail-wm1-f73.google.com [209.85.128.73]) by imf30.hostedemail.com (Postfix) with ESMTP id 1750A8000F for ; Tue, 18 Mar 2025 16:21:00 +0000 (UTC) Authentication-Results: imf30.hostedemail.com; dkim=pass header.d=google.com header.s=20230601 header.b=Y6yGwOXD; dmarc=pass (policy=reject) header.from=google.com; spf=pass (imf30.hostedemail.com: domain of 3a53ZZwUKCFIDuvvu08805y.w86527EH-664Fuw4.8B0@flex--tabba.bounces.google.com designates 209.85.128.73 as permitted sender) smtp.mailfrom=3a53ZZwUKCFIDuvvu08805y.w86527EH-664Fuw4.8B0@flex--tabba.bounces.google.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1742314861; a=rsa-sha256; cv=none; b=QywdvXu/UjaLHWSoE69A14poU1xJltleiuUBbpO0JgVUd9EdrdY9LohkPlZiMVf2gKxtVC IbrLPDZLq6Gq6lCKKefUdhT3JeOgz4ypqtv75ONV0UNrwJUVM+etjkgYEhqePKZLA5BpYq Gj8SmlQ+CL29kUwl1ITW/2cvuVA5o54= ARC-Authentication-Results: i=1; imf30.hostedemail.com; dkim=pass header.d=google.com header.s=20230601 header.b=Y6yGwOXD; dmarc=pass (policy=reject) header.from=google.com; spf=pass (imf30.hostedemail.com: domain of 3a53ZZwUKCFIDuvvu08805y.w86527EH-664Fuw4.8B0@flex--tabba.bounces.google.com designates 209.85.128.73 as permitted sender) smtp.mailfrom=3a53ZZwUKCFIDuvvu08805y.w86527EH-664Fuw4.8B0@flex--tabba.bounces.google.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1742314861; 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=G9KWHi/KBkZHmOxvUg1u2dLw8hruOCqp8/fshelQJPQ=; b=3p+pTg3B8STv4kcX1XWOl4D1x+Q6FpY/ebJkHUkcoVXVvwztB5XE3oGlFg0y4uNdQpM7ya CBWEoZNkww6meuBqKBj4tMNc6stmH88KOZyRaX4zPKmeDxIbvPPYdvb2kX3ei0Ht9RwiNC mjc5mC7e5eZuN4txOkR1nyfTkzZtAh4= Received: by mail-wm1-f73.google.com with SMTP id 5b1f17b1804b1-43cf172ffe1so30697805e9.3 for ; Tue, 18 Mar 2025 09:21:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1742314860; x=1742919660; darn=kvack.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=G9KWHi/KBkZHmOxvUg1u2dLw8hruOCqp8/fshelQJPQ=; b=Y6yGwOXDp8pTHuXnQnsj2cKP8/TiFv4S7wCxGGWoN6qOs93BL2VCUK6d06yjK0IXuB myfoltkZ1T1wUsxUx1KsmWDVBlCpwuiloJrHb6Dbp4beXn6xMdaVmVj41X2QNof2PO4u KyxZwGyRmjKj77b3izjVJgyjo83rXE7/jRA8fyTicFmgO3TBUkh274A/akjx4zMNeAzA A0J2fXLBLEdnllNAuMsYqHRf46C7Q8/qiul301NigMUOI0f9M2ZHD0PEsnDriXSPfZFn PlHHipcf+ASY327odTyKI4o2nTPYIZZ9ikt4XjM74rnXOZ9+XxbNzeDQpq1T0H4iA+w4 ntAg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1742314860; x=1742919660; 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=G9KWHi/KBkZHmOxvUg1u2dLw8hruOCqp8/fshelQJPQ=; b=QG1uxtcYSF1TYVk57xkgMQBHUYYtFu9sLSAhXZmEhupJZ1e0qfEECOTwEhhjlSQ9tV vT2t5wfqHszeHHQj0VHdymkPHIB3NzsLPn16LRLLB8illMDnZM0t7AdF667PG61auSil VqDBGm93LylwPWgp284i3msz+KWXossNdgJR4KsihKzexrTSpTnMNXlG1gV9olx0TXzk 9aTuAXRxn4uTcFpJIJUUpTBxB3IyiUif7F6Q9VqPfa5/a3Elvcx/Il/7RZGsbnwMSqhG 7QgLBRhwU3tjA6fq8mvIIH+MJ4Y6gQN3aZLU/zkiR9FOHMB0VF0IV5KcGzmchcSbATkt oy8A== X-Forwarded-Encrypted: i=1; AJvYcCVbX7EuoDDzzGnV/SxADV8vHlV9FfL8XqkhqcCVqqzyllNTzOmRv1ie/VFUB4nDCrsrwbJNc0CoQA==@kvack.org X-Gm-Message-State: AOJu0YzjEwzPNt4kN88DWkfrkJzWdzFQcegZ2TSsVfgf7NvrrA4S+5g5 rlpDyH/XRx8YwSMEKSa721zwFlwcLdbhB8TaCIiO47p8O7+RxHkhqcaJ0Ae7ZHDa5PiDgqRVlQ= = X-Google-Smtp-Source: AGHT+IEh2X4kUYxpJwUkKLEJgfMN+mg0RefgQxFOkAM1n9rRoUkko5MREaX9qI+5+A7CeT0+SuksFzPCZg== X-Received: from wmqe11.prod.google.com ([2002:a05:600c:4e4b:b0:43d:4038:9229]) (user=tabba job=prod-delivery.src-stubby-dispatcher) by 2002:a05:600c:848d:b0:43d:94:cff0 with SMTP id 5b1f17b1804b1-43d3b9dc3b0mr24262095e9.19.1742314859735; Tue, 18 Mar 2025 09:20:59 -0700 (PDT) Date: Tue, 18 Mar 2025 16:20:45 +0000 In-Reply-To: <20250318162046.4016367-1-tabba@google.com> Mime-Version: 1.0 References: <20250318162046.4016367-1-tabba@google.com> X-Mailer: git-send-email 2.49.0.rc1.451.g8f38331e32-goog Message-ID: <20250318162046.4016367-7-tabba@google.com> Subject: [PATCH v6 6/7] KVM: guest_memfd: Handle invalidation of 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, 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, peterx@redhat.com, tabba@google.com X-Rspam-User: X-Rspamd-Queue-Id: 1750A8000F X-Stat-Signature: jqexo8fdqwgtf37r7ecyudshna9f3wm3 X-Rspamd-Server: rspam06 X-HE-Tag: 1742314860-272917 X-HE-Meta: U2FsdGVkX19Im7cMT7Oy3LL5uvlGCjYfTlDVZd6pXUOtzeMs0nzlO/otdqE6m6Gp02BGTB89qXG7GkmyzBMtMjN9d2XIQ4CdE44bGzPIEPAK49b6hqshsU5Ir9gzY/2X6VHn//3q4+seGGmxmjj/1QwiftgZzMjXnEpc1HTTzBKiF8PyPw0v5j89fY3c1QPCiQiXcbfmhXgE5eg2ZwE45Z9Kw0efQNQqyKFy+JHwzBzZW1iSjw6R6wcCyNGH6d3W5P2qVx5k8BYMBP7WHi6Q1zKnjOBz1MOx+r4cWFr7+4bbQsN0Q3hZrWmYElGAFCsuvnCr25SPMgEUjJX3JXU+eDvw+WONdoJb0nlcqHXpjXALx33yB6o4BUeuapcDmQT3G0iW84G/Okdo8I9Xht7TmGfFjcmTzlVJ42N7t6aouEHzQCB+QNy84uLGmOQUSYUHhOL0ON18BdRO3KJb7DIOxu/QfWDQYm9tPvcT17TsfPIqkFk//m1CFelx5TReHoda3mAuTib8HaIINb4+/o42ILADu0JSde12l8NUxiYUyraShIhTZdkG+Y+xgMx8Q5nmDWnoOk8t+TbARG0Euxr+oR5yIJudacxMXB7EVvjGEU8gUq7vXrAoBd+OT1kBKCGFvw2czMikdbBy+Jrq+wDEGMoZPq8NFFDLnM3Lpf0KYFUgN5AS5U2vMCxIhoWbothV2ihNG2yxSzV88pU+o8r7hE5O9Phb3LD/HKpu1bD3g4D9pWTC9ZMwq9gqzbVxJlQQUFnDv0FV/NKz7w0ZcFcgCeHUKkkd1Vuo85dX+VqHUfktgTE6b8fAp7apZV2PRqu3vqdywl/VGuaY3ZKBggwZXGVyZfpiw3dTQ9DH8CHc1ecorrXPg6UGFveWxMz9v3VhWWO7iBz/d6eXpkiowTcaIjjctE6EThM8frqRLDfxDImC0c3Gmb5WPcWOel8m80QrkJKEaygD1bLLz37Bl1z OftVLOut +/d03CjMGLgIJT8WzhAqtQFyKWd8H2BL1slXjIF3qF9vscOtp9wG7uMHGwUx11iHvj2DcYgiameI1BbBMsANKeZL/8b8l4Ewt4+JgrbcLGbt2Co3I+UxjqL2E/PUpBbm3CydgarBvsob5qXxmToH6wzaH7f75mwtA3JVhY6PYj1BSprhj8STNDXUwseptTQehhls5Yj6vwxnsaWByCUDSnYl3s2k/vjd4VmTjrVLFe/Isfqo7EeHm9/e0tOcJXtKQvr8Qd/PsGq4dqYe0hVG2dFd7wn1JA0e9O3WByjUY2kV0cGNkJfgvUylEMWCEwUCOXif3pWgKHlS8F9eJ+t4ip+8/77k8ha+pvw9rHsVFlgT28/pYaaYYd8wpGMQL3aJMYknGYwvPCpXd4AuEAa6u8xKUfj/i8/MMrGzZLITR9AtFzXpnD0Dlm4v0N6SAr+v4Wse9Z3id5B1aqRZIRft2HoAUWuiUcV7LG0RMNzU6CIZ+mm4299YIGS8raxlhvtSQNFJmsF8j26yAg+pofaveIg0szLedsRUHGoJ//ksxAE4YDtqLPU0iGw/LmVWOEoA7VoIgUptCp8j3B2Z8DvyBFCycSmFJK99EPTxW9C3QQD+k8WMYx61IiNPxrxk+PXK2+KRhm6HTDBWomneTFfbJpKQO1g== 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: When guest_memfd backed memory is invalidated, e.g., on punching holes, releasing, ensure that the sharing states are updated and that any folios in a transient state are restored to an appropriate state. Signed-off-by: Fuad Tabba --- virt/kvm/guest_memfd.c | 56 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/virt/kvm/guest_memfd.c b/virt/kvm/guest_memfd.c index 4fd9e5760503..0487a08615f0 100644 --- a/virt/kvm/guest_memfd.c +++ b/virt/kvm/guest_memfd.c @@ -117,6 +117,16 @@ static struct folio *kvm_gmem_get_folio(struct inode *inode, pgoff_t index) return filemap_grab_folio(inode->i_mapping, index); } +#ifdef CONFIG_KVM_GMEM_SHARED_MEM +static void kvm_gmem_offset_range_invalidate_shared(struct inode *inode, + pgoff_t start, pgoff_t end); +#else +static inline void kvm_gmem_offset_range_invalidate_shared(struct inode *inode, + pgoff_t start, pgoff_t end) +{ +} +#endif + static void kvm_gmem_invalidate_begin(struct kvm_gmem *gmem, pgoff_t start, pgoff_t end) { @@ -126,6 +136,7 @@ static void kvm_gmem_invalidate_begin(struct kvm_gmem *gmem, pgoff_t start, unsigned long index; xa_for_each_range(&gmem->bindings, index, slot, start, end - 1) { + struct file *file = READ_ONCE(slot->gmem.file); pgoff_t pgoff = slot->gmem.pgoff; struct kvm_gfn_range gfn_range = { @@ -145,6 +156,16 @@ static void kvm_gmem_invalidate_begin(struct kvm_gmem *gmem, pgoff_t start, } flush |= kvm_mmu_unmap_gfn_range(kvm, &gfn_range); + + /* + * If this gets called after kvm_gmem_unbind() it means that all + * in-flight operations are gone, and the file has been closed. + */ + if (file) { + kvm_gmem_offset_range_invalidate_shared(file_inode(file), + gfn_range.start, + gfn_range.end); + } } if (flush) @@ -509,6 +530,41 @@ static int kvm_gmem_offset_clear_shared(struct inode *inode, pgoff_t index) return r; } +/* + * Callback when invalidating memory that is potentially shared. + * + * Must be called with the filemap (inode->i_mapping) invalidate_lock held. + */ +static void kvm_gmem_offset_range_invalidate_shared(struct inode *inode, + pgoff_t start, pgoff_t end) +{ + struct xarray *shared_offsets = &kvm_gmem_private(inode)->shared_offsets; + pgoff_t i; + + rwsem_assert_held_write_nolockdep(&inode->i_mapping->invalidate_lock); + + for (i = start; i < end; i++) { + /* + * If the folio is NONE_SHARED, it indicates that it is + * transitioning to private (GUEST_SHARED). Transition it to + * shared (ALL_SHARED) and remove the callback. + */ + if (xa_to_value(xa_load(shared_offsets, i)) == KVM_GMEM_NONE_SHARED) { + struct folio *folio = folio = filemap_lock_folio(inode->i_mapping, i); + + if (!WARN_ON_ONCE(IS_ERR(folio))) { + if (folio_test_guestmem(folio)) + kvm_gmem_restore_pending_folio(folio, inode); + + folio_unlock(folio); + folio_put(folio); + } + } + + xa_erase(shared_offsets, i); + } +} + /* * Marks the range [start, end) as not shared with the host. If the host doesn't * have any references to a particular folio, then that folio is marked as From patchwork Tue Mar 18 16:20:46 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Fuad Tabba X-Patchwork-Id: 14021251 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 1B9E5C28B2F for ; Tue, 18 Mar 2025 16:21:13 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 7E045280017; Tue, 18 Mar 2025 12:21:05 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 7649E28000B; Tue, 18 Mar 2025 12:21:05 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 592A3280017; Tue, 18 Mar 2025 12:21:05 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0013.hostedemail.com [216.40.44.13]) by kanga.kvack.org (Postfix) with ESMTP id 024B028000B for ; Tue, 18 Mar 2025 12:21:04 -0400 (EDT) Received: from smtpin17.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay05.hostedemail.com (Postfix) with ESMTP id 1783E57490 for ; Tue, 18 Mar 2025 16:21:06 +0000 (UTC) X-FDA: 83235186132.17.038C2EC Received: from mail-wm1-f74.google.com (mail-wm1-f74.google.com [209.85.128.74]) by imf20.hostedemail.com (Postfix) with ESMTP id 485B71C0003 for ; Tue, 18 Mar 2025 16:21:03 +0000 (UTC) Authentication-Results: imf20.hostedemail.com; dkim=pass header.d=google.com header.s=20230601 header.b="hZeAef/4"; spf=pass (imf20.hostedemail.com: domain of 3bZ3ZZwUKCFQFwxxw2AA270.yA8749GJ-886Hwy6.AD2@flex--tabba.bounces.google.com designates 209.85.128.74 as permitted sender) smtp.mailfrom=3bZ3ZZwUKCFQFwxxw2AA270.yA8749GJ-886Hwy6.AD2@flex--tabba.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=1742314863; 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=Rd6be5I6g0Af011AYVWod/OD1lPj9HqVBk4Grxnf+mY=; b=YbFX9q6b5KppmAVJOgy6DErq8Ok53cds3zlEsRa2jm+00ghxi0iq+5lwUFB7zy39+GLaLz R06pDifvkRPhjIKNAhdpDbOvQTkHthhgjqtb3uf/q+i0iydYZZppj8ZRKy7lJwxZKH6Ovw 6BMif9hZfwvX+X3YQqk68zvNxwwnUQk= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1742314863; a=rsa-sha256; cv=none; b=XpLaEiF20tvRvel41r56+qBWaxzxiVl8h37qydFssO3AKIxfpWHyfgM419+7qZZo00saHF C6PRChpzKgXAqnlOFCDdu2fenEn6rWATOv7lzLMa2QZ7SZexv8EAxluRuR77vmKUWAMJZY IPo5nty4terqP39KgFVFF30Polx6x0I= ARC-Authentication-Results: i=1; imf20.hostedemail.com; dkim=pass header.d=google.com header.s=20230601 header.b="hZeAef/4"; spf=pass (imf20.hostedemail.com: domain of 3bZ3ZZwUKCFQFwxxw2AA270.yA8749GJ-886Hwy6.AD2@flex--tabba.bounces.google.com designates 209.85.128.74 as permitted sender) smtp.mailfrom=3bZ3ZZwUKCFQFwxxw2AA270.yA8749GJ-886Hwy6.AD2@flex--tabba.bounces.google.com; dmarc=pass (policy=reject) header.from=google.com Received: by mail-wm1-f74.google.com with SMTP id 5b1f17b1804b1-43d209dc2d3so22015165e9.3 for ; Tue, 18 Mar 2025 09:21:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1742314862; x=1742919662; darn=kvack.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=Rd6be5I6g0Af011AYVWod/OD1lPj9HqVBk4Grxnf+mY=; b=hZeAef/48pFcvBOT8FVjOBXZMZkOhlONK1Fhu4t64W67ox6IfT4Q9i+wxM/uiqtwey ANIJJfKy/sFCfSxKDcD43jWZGYG9BQ7cx+wsEP+4JVJWH9wNaad4kgBeKyFTGjLEs+DC j/aDQtHkDKICJCk3AJFJCOw73dO9mty10V7Y2+llgYr+fRYk9CKcFhxIwpEAbm+mFCmO 2G87LIJKUYrC9AYt7NcsTgjUgNhsZ3LBq7VWOK9OoDf774LIxPX6OWstPQnBJs7xpEHx YfenkCD9sUcWMkxD1WXo7GZo1wpiHE9j4CetrXzp7IXO4nLKplGfxZrLRhuaWf63c6D4 EXYw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1742314862; x=1742919662; 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=Rd6be5I6g0Af011AYVWod/OD1lPj9HqVBk4Grxnf+mY=; b=hKzoCkpIthTeQsQ2h2ma9t7f9Fr76ZsAExEMZIXcagohv0x9nTrP5lgq6xLqYxOWtC 3ibWs0CbA7LaLtemKHOOqBEcohaFBfuXctpMRPFqSI7yfPgUIzYKtooPUH+cssetNGP7 UhCryK+wOELRLhPasQ1okqCCzyUu9YkF4dHQsrphaW1oML30b7wwdHTKkoZANUYe3VUu RFbfqPv0WzF3YHxLZ4nIAzFGLdCsFIPtZF5EnrJlOUCRYErpfsVeqrvWbDuFyL9e6Lgd r/2avyWDDFOZVkjZfZB3uRzlSItfHzzz8V80T5J64ERlhCH22iTySbvlL//UUEIzIjSU 6Eew== X-Forwarded-Encrypted: i=1; AJvYcCXj9qEHwB6rX9kXRDqisjYa09ylCoWdesWe6da5/0SeBHRAzt1kS1QA42luD1yF8qdFAZdMSBaabQ==@kvack.org X-Gm-Message-State: AOJu0YyrMn9u17THqc8EUs9458wgVjQn6oFNTHt57H5WZ4zilYFdSSPa 4E2P8vfTW1RX1qW5rlUueuo0Qm+9ZTpfJJun/4wczSmw5i7vupsSki23q/25Y4Liw8hF/aFR0A= = X-Google-Smtp-Source: AGHT+IFTQwZzOpfOU0EGgsy+KvdlZSjBRDdavIz7oAkVvTl07k3n0vOwWg2N3mGBwzwh7UY/m+wnPF3ykA== X-Received: from wmby26.prod.google.com ([2002:a05:600c:c05a:b0:43d:c77:3fd8]) (user=tabba job=prod-delivery.src-stubby-dispatcher) by 2002:a05:600c:19d2:b0:43d:5ec:b2f4 with SMTP id 5b1f17b1804b1-43d3b98d127mr28080345e9.10.1742314861661; Tue, 18 Mar 2025 09:21:01 -0700 (PDT) Date: Tue, 18 Mar 2025 16:20:46 +0000 In-Reply-To: <20250318162046.4016367-1-tabba@google.com> Mime-Version: 1.0 References: <20250318162046.4016367-1-tabba@google.com> X-Mailer: git-send-email 2.49.0.rc1.451.g8f38331e32-goog Message-ID: <20250318162046.4016367-8-tabba@google.com> Subject: [PATCH v6 7/7] KVM: guest_memfd: Add a guest_memfd() flag to initialize it as 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, 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, peterx@redhat.com, tabba@google.com X-Rspam-User: X-Rspamd-Server: rspam01 X-Rspamd-Queue-Id: 485B71C0003 X-Stat-Signature: iwahf4a4sbor8k7fehj3fn76acupzn4f X-HE-Tag: 1742314862-871049 X-HE-Meta: U2FsdGVkX195f2HYM+oUbK2gqbIjvKWwBfBFLn/kkyz23kdZOcOlsUm8rWZtlzYnSK6y2KzAVIdjnYsI3KJb1xozDblonU4gAE6v19bCYosqiqtX55msZE54TnwvN03c8C4O+GAT0OpmDgbkVtmJy8zqvYQxh3ZEsUzjGNX5Cj/UAuMIZXQkFUdnODUact33saOBBkwxcwbzZATtuzSDYI89Tl/lZnDle6OM9BGhUmfThrX63PSKWxnsM7EpNAFWuQUPA7HNJP0eGBMkd/lUt0uj3b14ZOLYBAUA/P55xN/T4J4zjR+5u3m7w/4Y3mZUauN6i8vAYk8cI1Aun/hLkcvj/VHbjwbFB866+hDnK2GSnE92UAl8vAstKMrb/UCzglXI/Wx/IydozhZ4JYp9lNFjR/QDsYwelFYBiVbxtP7ECabtND3gk4GdXw7FQTyby5Xx8h/9vgz/0joZCjT74vO1LYR60CIwG5Lo6FrQg+/cHwzLgmLxJ/fAbt0qtfD1eMxeW5Hz/ffO6eyspzz/4YzfARApAr6DxzbI70dUbJgS+5ZRMmnD1eg4jPvULYt4jfT6QHzpITy9KeFcYEg7AHjYDxuK5CyR6p96XXHUrREjDOmE1V9S6TDajH0Cv0mPV/tYIcwZHxGOHXqtFzE6D+QYukgmn2kTeHVQpVN7Vs4zmiD3c2SIJaNseO7oKLuooFa3YiRKh88BR/9oBBCvs4ngsMkkj1uITX625XwhRXZtE0alR3V3Z/K7DRgHpe1rNyelNUf1VcH6qp2gMc6dyL6C05ZLSOyiCLtm817dgwGtoBdP1dl8ylrjh04rLhI3V0QgOedZ8DlDN7L2xtUM9JIMDMeSmRnpsHtA+G7Wex9I8iBMk3CreAwJtXbakEmTzII24VhqDX3MchNPuWAoUFvXiAKQfHK+UyHacfckVRALDM7dVkWRDEyJcb57b52KRR9hQfpnkWY/U9v6BoJ OFNTEcZj q0Hxgtr7DKhjWXYzI+uU/6TGHqhLOsNDXfADmXROK4m+g6RfbW0SktvzscSIHrUb2pvGgkk9+evEFt6qoQD5MAPw0I8FgKSIAjlDZSZM1QC/0BGQ/4kBWNzdXTaVXKpViBDfnsK3vaFAtapY7rCr88Y/vISp/C36ZBhcdaK4tr5RkuLmUqFlzonZItg4Pw7EYn0J+ajgkJDLU0sF7NfPaeJcAZmpu47tOkGIlX8JR4+XMrEhfKSaJF787O44vf9M2toM4IlsCWMqZxU3uuZa8rmdYY7l2tcCEzg2nyYM12dtecCAVWAVk8X8lZUZHV73T++wS+eQa/FObJ1/Dn4qA4zQJyhUhPdWOCztAyIn4XvPXpgVs35IzA8sFUdeilpO/cqEaAt3gjU+hA1h7k0/OZcQc4QbJBAY5bi25htsix1eCqm7GT7RA/cLTGSx6gsCiETcdSxDcDaO4WZFF+Pj7hguZFQAshJ+v7iHVMQCtBrUuz0EXzkr8tf7HCc0BQ+d9ysd2qkaLhj3BzQtfoSPKWd0N78RZcydeXxOAdiQbCixgy7mgeyK3jbimy3NWxVPBt2bqbLzpOL38p18C+CP16AnhWzNjMS1TJfny+735XQceN11LKFAhlhKp6oMfHpRYS/tf+5RyJJJrp8TbQQRPPLc+BVfs0/CZJVf3AohoXEFnRgPLQL7GQgXtlg== 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: Not all use cases require guest_memfd() to be shared with the host when first created. Add a new flag, GUEST_MEMFD_FLAG_INIT_SHARED, which when set on KVM_CREATE_GUEST_MEMFD initializes the memory as shared with the host, and therefore mappable by it. Otherwise, memory is private until explicitly shared by the guest with the host. Signed-off-by: Fuad Tabba --- Documentation/virt/kvm/api.rst | 4 ++++ include/uapi/linux/kvm.h | 1 + tools/testing/selftests/kvm/guest_memfd_test.c | 7 +++++-- virt/kvm/guest_memfd.c | 12 ++++++++++++ 4 files changed, 22 insertions(+), 2 deletions(-) diff --git a/Documentation/virt/kvm/api.rst b/Documentation/virt/kvm/api.rst index 2b52eb77e29c..a5496d7d323b 100644 --- a/Documentation/virt/kvm/api.rst +++ b/Documentation/virt/kvm/api.rst @@ -6386,6 +6386,10 @@ most one mapping per page, i.e. binding multiple memory regions to a single guest_memfd range is not allowed (any number of memory regions can be bound to a single guest_memfd file, but the bound ranges must not overlap). +If the capability KVM_CAP_GMEM_SHARED_MEM is supported, then the flags field +supports GUEST_MEMFD_FLAG_INIT_SHARED, which initializes the memory as shared +with the host, and thereby, mappable by it. + See KVM_SET_USER_MEMORY_REGION2 for additional details. 4.143 KVM_PRE_FAULT_MEMORY diff --git a/include/uapi/linux/kvm.h b/include/uapi/linux/kvm.h index 117937a895da..22d7e33bf09c 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_guest_memfd) +#define GUEST_MEMFD_FLAG_INIT_SHARED (1UL << 0) struct kvm_create_guest_memfd { __u64 size; diff --git a/tools/testing/selftests/kvm/guest_memfd_test.c b/tools/testing/selftests/kvm/guest_memfd_test.c index 38c501e49e0e..4a7fcd6aa372 100644 --- a/tools/testing/selftests/kvm/guest_memfd_test.c +++ b/tools/testing/selftests/kvm/guest_memfd_test.c @@ -159,7 +159,7 @@ static void test_invalid_punch_hole(int fd, size_t page_size, size_t total_size) static void test_create_guest_memfd_invalid(struct kvm_vm *vm) { size_t page_size = getpagesize(); - uint64_t flag; + uint64_t flag = BIT(0); size_t size; int fd; @@ -170,7 +170,10 @@ static void test_create_guest_memfd_invalid(struct kvm_vm *vm) size); } - for (flag = BIT(0); flag; flag <<= 1) { + if (kvm_has_cap(KVM_CAP_GMEM_SHARED_MEM)) + flag = GUEST_MEMFD_FLAG_INIT_SHARED << 1; + + for (; flag; flag <<= 1) { fd = __vm_create_guest_memfd(vm, page_size, flag); TEST_ASSERT(fd == -1 && errno == EINVAL, "guest_memfd() with flag '0x%lx' should fail with EINVAL", diff --git a/virt/kvm/guest_memfd.c b/virt/kvm/guest_memfd.c index 0487a08615f0..d7313e11c2cb 100644 --- a/virt/kvm/guest_memfd.c +++ b/virt/kvm/guest_memfd.c @@ -1045,6 +1045,15 @@ static int __kvm_gmem_create(struct kvm *kvm, loff_t size, u64 flags) goto err_gmem; } + if (IS_ENABLED(CONFIG_KVM_GMEM_SHARED_MEM) && + (flags & GUEST_MEMFD_FLAG_INIT_SHARED)) { + err = kvm_gmem_offset_range_set_shared(file_inode(file), 0, size >> PAGE_SHIFT); + if (err) { + fput(file); + goto err_gmem; + } + } + kvm_get_kvm(kvm); gmem->kvm = kvm; xa_init(&gmem->bindings); @@ -1066,6 +1075,9 @@ int kvm_gmem_create(struct kvm *kvm, struct kvm_create_guest_memfd *args) u64 flags = args->flags; u64 valid_flags = 0; + if (IS_ENABLED(CONFIG_KVM_GMEM_SHARED_MEM)) + valid_flags |= GUEST_MEMFD_FLAG_INIT_SHARED; + if (flags & ~valid_flags) return -EINVAL;