From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id A04E7C5AD49 for ; Mon, 2 Jun 2025 19:18:15 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 564B66B0316; Mon, 2 Jun 2025 15:18:14 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 53CB36B0318; Mon, 2 Jun 2025 15:18:14 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 42CF86B0319; Mon, 2 Jun 2025 15:18:14 -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 18FEB6B0316 for ; Mon, 2 Jun 2025 15:18:14 -0400 (EDT) Received: from smtpin24.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay10.hostedemail.com (Postfix) with ESMTP id 82745C1153 for ; Mon, 2 Jun 2025 19:18:13 +0000 (UTC) X-FDA: 83511421266.24.2E59B1D Received: from mail-pg1-f202.google.com (mail-pg1-f202.google.com [209.85.215.202]) by imf19.hostedemail.com (Postfix) with ESMTP id AED021A000D for ; Mon, 2 Jun 2025 19:18:11 +0000 (UTC) Authentication-Results: imf19.hostedemail.com; dkim=pass header.d=google.com header.s=20230601 header.b=eRZAw4g9; spf=pass (imf19.hostedemail.com: domain of 38vg9aAsKCCUBDLFSMFZUOHHPPHMF.DPNMJOVY-NNLWBDL.PSH@flex--ackerleytng.bounces.google.com designates 209.85.215.202 as permitted sender) smtp.mailfrom=38vg9aAsKCCUBDLFSMFZUOHHPPHMF.DPNMJOVY-NNLWBDL.PSH@flex--ackerleytng.bounces.google.com; dmarc=pass (policy=reject) header.from=google.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1748891891; 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=ZnfgUZmf8OAS/bgXEs2qdTQcvNpZfKjnQrP7dUxeEks=; b=Sy/BO9emhKql6v4wJ3KWzuJ1OTF9/V9Wo0NgDXJPtdEOYao5Rg2o/tTC2oyisONBeSUh45 RAkpiSteslbPhB2R6wyOQOrRD9aDaAEs+gJ9fO/g1vSgzcXbskCHXQq+AuYP7cy4okQEHy NpYWpVQuQFEfGHbOc/0vkOuvJSQoBRw= ARC-Authentication-Results: i=1; imf19.hostedemail.com; dkim=pass header.d=google.com header.s=20230601 header.b=eRZAw4g9; spf=pass (imf19.hostedemail.com: domain of 38vg9aAsKCCUBDLFSMFZUOHHPPHMF.DPNMJOVY-NNLWBDL.PSH@flex--ackerleytng.bounces.google.com designates 209.85.215.202 as permitted sender) smtp.mailfrom=38vg9aAsKCCUBDLFSMFZUOHHPPHMF.DPNMJOVY-NNLWBDL.PSH@flex--ackerleytng.bounces.google.com; dmarc=pass (policy=reject) header.from=google.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1748891891; a=rsa-sha256; cv=none; b=qrLt3lPqXN0FSh4B/92iddMpFtDSz3nU+8q4bLMlTnU2743gYIffE9W36ESz8DorVoRr2j Aw4PTLixRPZ0OxknJXt0Q4c5SRk9Gyi5vWXNUDkOxMkSMe5eIbr1moKEAk/6oyMeO46TbJ Ea2heT5HYIEN68XXyugN9C7sEEUKoyE= Received: by mail-pg1-f202.google.com with SMTP id 41be03b00d2f7-b16b35ea570so4662176a12.0 for ; Mon, 02 Jun 2025 12:18:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1748891890; x=1749496690; 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=ZnfgUZmf8OAS/bgXEs2qdTQcvNpZfKjnQrP7dUxeEks=; b=eRZAw4g9AEBftlMwB4Z1MDFTaSC+SI+buPut/W6CLWHx3/qXBlVx4u+b4PBrTzuHAB bFMOYohEXvpEGSc16UOd/wCn7jIR+VP8FruQCpSBYbmbO8YnyiGW4+/iYz9rv3pCmlwB vJBN2/Ide+lY8RO1rNEdvIl46GNCrKiblQthGEHnI2k+qbeMzO0/imo5kaptNAr9Mg9r c5MmCZyKQiu3u8l8DPkK74GMtMwLgMArgw8Da77EKX/+dhrtDf35m+NZ+UWrxd9+dvzO RCHG0eQ20grWkZFCctFe/CkrxVvUQ2Lg0zWZKtpA/Wa5vnA3igMeVZhQgTo4c1oG9xDs DOqw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1748891890; x=1749496690; 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=ZnfgUZmf8OAS/bgXEs2qdTQcvNpZfKjnQrP7dUxeEks=; b=wvaEK17h7T+A/1GX1B51xJMaH6fhCOktOGlLNa76I1uSgR8sdwUXQDf1ZrBzYG35ol sypn4B/kfhltVWP/xBZM7nSQLDjNt+waCUFLdZIx47PpYl0mZS94uPL4y8QpJN1rGDyl 4PJR6eKiFeMA4FQWxJyHTTw5ofMSmr5tTxXZb9GLIvFjG5p+ocS+TKtfMolTET6GWTdn ZL1yyP0mEFcbkkfUZ07pwv0518NhDJY/YYyywIlMM87rgL/xpGaESRyhu45jPj5yRs9K xhKFimqCCucgp+ivC1aKyeg+wno8w5mNOSN/N8BaRjOx74gU3xBNrBKFwps5+TbJfBob y5uw== X-Forwarded-Encrypted: i=1; AJvYcCVH8V/D/skdoRQmzBcVL9HfCtdNAK9LGAGXIGg3J4w7Nv7ovNvz/QXm0b8I/C90sqwVqVsdEMN3DA==@kvack.org X-Gm-Message-State: AOJu0YwgMyBRxsr63+r++bV6vNQFkAp3IGhjmKMMRLIzqR/bBBoAIATc mMpc4HxydqQcCHGM0APK5K34es8v7W0zm3jM7CEH1zUV4Dm+N5u5PqQbcaleH6vdvIMdcgrXcyI L121ThOX6g7eQrcnQ9aT5V2YONg== X-Google-Smtp-Source: AGHT+IH9pb2nOAVzd+tT3ShmCTFFviJ+5ZlU2s7fnOIWaU7dRI+FLtSvZUReomAAqqXsrjcDFUQgssBhev3ROJLBjg== X-Received: from pgct17.prod.google.com ([2002:a05:6a02:5291:b0:af9:8f44:d7ec]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a21:394b:b0:21a:de8e:44a9 with SMTP id adf61e73a8af0-21bad1e8773mr14639083637.37.1748891890493; Mon, 02 Jun 2025 12:18:10 -0700 (PDT) Date: Mon, 2 Jun 2025 12:17:55 -0700 In-Reply-To: Mime-Version: 1.0 References: X-Mailer: git-send-email 2.49.0.1204.g71687c7c1d-goog Message-ID: <425cd410403e8913b42552d892add6ca543ec869.1748890962.git.ackerleytng@google.com> Subject: [PATCH 2/2] KVM: guest_memfd: Use guest mem inodes instead of anonymous inodes From: Ackerley Tng To: kvm@vger.kernel.org, linux-mm@kvack.org, linux-kernel@vger.kernel.org, x86@kernel.org, linux-fsdevel@vger.kernel.org Cc: ackerleytng@google.com, aik@amd.com, ajones@ventanamicro.com, akpm@linux-foundation.org, amoorthy@google.com, anthony.yznaga@oracle.com, anup@brainfault.org, aou@eecs.berkeley.edu, bfoster@redhat.com, binbin.wu@linux.intel.com, brauner@kernel.org, catalin.marinas@arm.com, chao.p.peng@intel.com, chenhuacai@kernel.org, dave.hansen@intel.com, david@redhat.com, dmatlack@google.com, dwmw@amazon.co.uk, erdemaktas@google.com, fan.du@intel.com, fvdl@google.com, graf@amazon.com, haibo1.xu@intel.com, hch@infradead.org, hughd@google.com, ira.weiny@intel.com, isaku.yamahata@intel.com, jack@suse.cz, james.morse@arm.com, jarkko@kernel.org, jgg@ziepe.ca, jgowans@amazon.com, jhubbard@nvidia.com, jroedel@suse.de, jthoughton@google.com, jun.miao@intel.com, kai.huang@intel.com, keirf@google.com, kent.overstreet@linux.dev, kirill.shutemov@intel.com, liam.merwick@oracle.com, maciej.wieczor-retman@intel.com, mail@maciej.szmigiero.name, maz@kernel.org, mic@digikod.net, michael.roth@amd.com, mpe@ellerman.id.au, muchun.song@linux.dev, nikunj@amd.com, nsaenz@amazon.es, oliver.upton@linux.dev, palmer@dabbelt.com, pankaj.gupta@amd.com, paul.walmsley@sifive.com, pbonzini@redhat.com, pdurrant@amazon.co.uk, peterx@redhat.com, pgonda@google.com, pvorel@suse.cz, qperret@google.com, quic_cvanscha@quicinc.com, quic_eberman@quicinc.com, quic_mnalajal@quicinc.com, quic_pderrin@quicinc.com, quic_pheragu@quicinc.com, quic_svaddagi@quicinc.com, quic_tsoni@quicinc.com, richard.weiyang@gmail.com, rick.p.edgecombe@intel.com, rientjes@google.com, roypat@amazon.co.uk, rppt@kernel.org, seanjc@google.com, shuah@kernel.org, steven.price@arm.com, steven.sistare@oracle.com, suzuki.poulose@arm.com, tabba@google.com, thomas.lendacky@amd.com, vannapurve@google.com, vbabka@suse.cz, viro@zeniv.linux.org.uk, vkuznets@redhat.com, wei.w.wang@intel.com, will@kernel.org, willy@infradead.org, xiaoyao.li@intel.com, yan.y.zhao@intel.com, yilun.xu@intel.com, yuzenghui@huawei.com, zhiquan1.li@intel.com Content-Type: text/plain; charset="UTF-8" X-Rspam-User: X-Stat-Signature: hc7h7x3snnoz3gzdzcogkihejzfkifa1 X-Rspamd-Queue-Id: AED021A000D X-Rspamd-Server: rspam11 X-HE-Tag: 1748891891-871742 X-HE-Meta: U2FsdGVkX1+HBlU/8fBuL080XsBbqmIOmsb87WqeCAa5VUutcAVd4Vn6sL9zpu5oa4heRigmew5bxZ81jPnehwnGRM+nqQhlhybUYYQ4jqqWcYRmYEO+iQRSQupgEppCe7hGMXyEsdmaB5IRNrVQWxFXlx/kDOlqab0GnOzJ9OhEDTQv0pV/cxOf8G21yHpsnRXy0s5FFhER+5OEjNBf5Ks2D4MOQ1j98C//2xXBW12dh91h99Jz5m1MXGvvGN9sctfhlSZq4Y2EuxBXy+tPaQZHmvNZuyQ2c+C/1b+osVuiu2CFFfdWtsJmg9NJVHwwry9wWrixL1OAGrR9QOQ7zc4z8fVQAZ0xflmlPPcwIeScJswDcHNe9Na1besmy28eQdseu6c0mxSmhaC4l1sYsARGGGRfYSqT4Jb59gcEmgzImm9K9cTEiiytj8r8hAb0ReUTKu4Tje9kqTfLNBoCN5cn0bc+/wJGVGUUg/NlxILZmtBquB/eXcmvK5MBhAumNRH5o3navMPQfLoBTczMWiShQ31s0VkThjrygQkuWZnSeQhlOgLjT2PZtS1fc30RC6xfLgnvnn2XWYGV5hBYZeHkms1z3fH36QFo6nQ2+sGb+arYJ9db2lurjA6Snn5I922UNa6lz5uoC7S7Rke0lFQwCZdsGUDI5Bw7DyKM+bl6vgJICwwueYX/yI1m2/hzVMVDC4tEs4iToOIr45LPD2+g34oJc91zKy3z2r84q398QuT/GsfDCxotAo7MZu/QelpBuKzHWBNVRq+Cplfwh6sfd7pkotQNASUAdrVEvZOWxoWgSgQiEK3KL/MYOAt/W3g7TaeRGbdRSNAqBRMq1M4tgfxf6Asw+K9rPHCNOp/aQDhESt+LT8SlNaezhAW1Yy7xkSfS07lWBIfoBK3tFs2AvpyBHN2C/eCPjtNmuF0Qv5nXpMlYF7cX/z5hSo9TS3q7YYwwBGBjjazzanx XKz5mIZk aRwB0sIWvBG7EJjq2DrVuB0szswjYXgDnms1NMJQDgJN+BTyNGUWKSBzsTFj96LYqy3eBHiwEh7HlSWBHw8q7PdhHefEXvwqMF180ZAYibWrpUTn0gJARADwEBGz+DpzJxOHGgJPcIzfEqpILb8DouQlnEGH0jeBPBKAEePqsVUdI1gfTCC0wuCmHcVw+g48V2FCdxYs/4gRJ7OZUWbhJAv2C50zWvis7mnWjWFsrjOtCI/AjTWd1oFkcZVVebJOAiu9h78q2XvCd+BLwwBTrKlLYmhBApN5cQanK0gB2M0/6933YAtDSnz/grhNXJ+f+NxI1Hod+6dhk1f5XDwY3FF4pAazLp1+n4Zu4CrD/UMFOPo53hJOvfqT7dir9xkqr7kT4t9gvGcT23l1U39KkiE/eHZ5eRCk6Nh+u8XtN6kEnDBzczzVWiN0fo8RdnkKJW0FTXZat+HOXFNOR9/mCpyfItd9GO6PjOzURvM8ysUpUknvOUNJPsKI5K3QRzJaW7Wl1ZEknukvmzzuMgDcbE+gmu3oG2EymHePt0FCgf9zuv5Mmic8RiI873V1V5iyLPV0AjdeoLMjTj3W2jfZdgGb0IJRwQIXz6Td2wnQrUBt9/0GVciz8Xntt7MdfaaLjFRUzFFQ6uQgL/tW6991LPOB2WGHLlouavcP7JP3PJfe66H12IbhpwToZa8+2A4GwHgfu 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: guest_memfd's inode represents memory the guest_memfd is providing. guest_memfd's file represents a struct kvm's view of that memory. Using a custom inode allows customization of the inode teardown process via callbacks. For example, ->evict_inode() allows customization of the truncation process on file close, and ->destroy_inode() and ->free_inode() allow customization of the inode freeing process. Customizing the truncation process allows flexibility in management of guest_memfd memory and customization of the inode freeing process allows proper cleanup of memory metadata stored on the inode. Memory metadata is more appropriately stored on the inode (as opposed to the file), since the metadata is for the memory and is not unique to a specific binding and struct kvm. Signed-off-by: Ackerley Tng Signed-off-by: Fuad Tabba --- include/uapi/linux/magic.h | 1 + virt/kvm/guest_memfd.c | 134 +++++++++++++++++++++++++++++++------ virt/kvm/kvm_main.c | 7 +- virt/kvm/kvm_mm.h | 9 ++- 4 files changed, 125 insertions(+), 26 deletions(-) diff --git a/include/uapi/linux/magic.h b/include/uapi/linux/magic.h index bb575f3ab45e..638ca21b7a90 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_MEMFD_MAGIC 0x474d454d /* "GMEM" */ #endif /* __LINUX_MAGIC_H__ */ diff --git a/virt/kvm/guest_memfd.c b/virt/kvm/guest_memfd.c index b2aa6bf24d3a..1283b85aeb44 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 #include "kvm_mm.h" +static struct vfsmount *kvm_gmem_mnt; + struct kvm_gmem { struct kvm *kvm; struct xarray bindings; @@ -318,9 +322,51 @@ static struct file_operations kvm_gmem_fops = { .fallocate = kvm_gmem_fallocate, }; -void kvm_gmem_init(struct module *module) +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_MEMFD_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 int kvm_gmem_init_mount(void) +{ + kvm_gmem_mnt = kern_mount(&kvm_gmem_fs); + + if (WARN_ON_ONCE(IS_ERR(kvm_gmem_mnt))) + return PTR_ERR(kvm_gmem_mnt); + + kvm_gmem_mnt->mnt_flags |= MNT_NOEXEC; + return 0; +} + +int kvm_gmem_init(struct module *module) { kvm_gmem_fops.owner = module; + + return kvm_gmem_init_mount(); +} + +void kvm_gmem_exit(void) +{ + kern_unmount(kvm_gmem_mnt); + kvm_gmem_mnt = NULL; } static int kvm_gmem_migrate_folio(struct address_space *mapping, @@ -402,11 +448,71 @@ 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) +{ + struct inode *inode; + + inode = alloc_anon_secure_inode(kvm_gmem_mnt->mnt_sb, name); + if (IS_ERR(inode)) + return inode; + + 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; @@ -420,32 +526,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; diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index e85b33a92624..094cc0ad31fb 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -6420,7 +6420,9 @@ int kvm_init(unsigned vcpu_size, unsigned vcpu_align, struct module *module) if (WARN_ON_ONCE(r)) goto err_vfio; - kvm_gmem_init(module); + r = kvm_gmem_init(module); + if (r) + goto err_gmem; r = kvm_init_virtualization(); if (r) @@ -6441,6 +6443,8 @@ int kvm_init(unsigned vcpu_size, unsigned vcpu_align, struct module *module) err_register: kvm_uninit_virtualization(); err_virt: + kvm_gmem_exit(); +err_gmem: kvm_vfio_ops_exit(); err_vfio: kvm_async_pf_deinit(); @@ -6472,6 +6476,7 @@ void kvm_exit(void) for_each_possible_cpu(cpu) free_cpumask_var(per_cpu(cpu_kick_mask, cpu)); kmem_cache_destroy(kvm_vcpu_cache); + kvm_gmem_exit(); kvm_vfio_ops_exit(); kvm_async_pf_deinit(); kvm_irqfd_exit(); diff --git a/virt/kvm/kvm_mm.h b/virt/kvm/kvm_mm.h index acef3f5c582a..dcacb76b8f00 100644 --- a/virt/kvm/kvm_mm.h +++ b/virt/kvm/kvm_mm.h @@ -68,17 +68,20 @@ static inline void gfn_to_pfn_cache_invalidate_start(struct kvm *kvm, #endif /* HAVE_KVM_PFNCACHE */ #ifdef CONFIG_KVM_PRIVATE_MEM -void kvm_gmem_init(struct module *module); +int kvm_gmem_init(struct module *module); +void kvm_gmem_exit(void); int kvm_gmem_create(struct kvm *kvm, struct kvm_create_guest_memfd *args); int kvm_gmem_bind(struct kvm *kvm, struct kvm_memory_slot *slot, unsigned int fd, loff_t offset); void kvm_gmem_unbind(struct kvm_memory_slot *slot); #else -static inline void kvm_gmem_init(struct module *module) +static inline int kvm_gmem_init(struct module *module) { - + return 0; } +static inline void kvm_gmem_exit(void) {}; + static inline int kvm_gmem_bind(struct kvm *kvm, struct kvm_memory_slot *slot, unsigned int fd, loff_t offset) -- 2.49.0.1204.g71687c7c1d-goog