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 2F6C4C3ABDA for ; Wed, 14 May 2025 23:43:03 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id E5D696B00AC; Wed, 14 May 2025 19:43:00 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id E0D806B00BA; Wed, 14 May 2025 19:43:00 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id C39726B00C8; Wed, 14 May 2025 19:43:00 -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 A35F46B00BA for ; Wed, 14 May 2025 19:43:00 -0400 (EDT) Received: from smtpin10.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay05.hostedemail.com (Postfix) with ESMTP id 4D6CC5EEFC for ; Wed, 14 May 2025 23:43:01 +0000 (UTC) X-FDA: 83443141362.10.63314DE Received: from mail-pj1-f74.google.com (mail-pj1-f74.google.com [209.85.216.74]) by imf13.hostedemail.com (Postfix) with ESMTP id AC5D220003 for ; Wed, 14 May 2025 23:42:59 +0000 (UTC) Authentication-Results: imf13.hostedemail.com; dkim=pass header.d=google.com header.s=20230601 header.b=HWuXQers; spf=pass (imf13.hostedemail.com: domain of 3giolaAsKCLMTVdXkeXrmgZZhhZeX.Vhfebgnq-ffdoTVd.hkZ@flex--ackerleytng.bounces.google.com designates 209.85.216.74 as permitted sender) smtp.mailfrom=3giolaAsKCLMTVdXkeXrmgZZhhZeX.Vhfebgnq-ffdoTVd.hkZ@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=1747266179; 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=KZmvgYTH+K9kHlJ7hwKtOyUz/0yI5aXWo1zgz6ld0Aw=; b=0ZOljDqoDkFS/EzYQLhTR3v2izs579k7Gh9c4LoFHY12aqehmunTQq+1boAvllnZU1f+V4 uz5IUbbGvApxGgZpIj35iEwiy/y733jFCCHuSX91vDvIDye1TfIIw+Bo2efqur/LvDru4M SESBKTPSnNXXT2fKNGfmozBA3AU9Gqs= ARC-Authentication-Results: i=1; imf13.hostedemail.com; dkim=pass header.d=google.com header.s=20230601 header.b=HWuXQers; spf=pass (imf13.hostedemail.com: domain of 3giolaAsKCLMTVdXkeXrmgZZhhZeX.Vhfebgnq-ffdoTVd.hkZ@flex--ackerleytng.bounces.google.com designates 209.85.216.74 as permitted sender) smtp.mailfrom=3giolaAsKCLMTVdXkeXrmgZZhhZeX.Vhfebgnq-ffdoTVd.hkZ@flex--ackerleytng.bounces.google.com; dmarc=pass (policy=reject) header.from=google.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1747266179; a=rsa-sha256; cv=none; b=kaKiP4dv3OGSm0vTCTnKsEBkFuRNuaj6RDyH1Tp/48bLgGngtZayWPkDf6H3mPfB2DIsOv GZsfysSZnkjbVFHF8CjMvAhzorxYuIhJTwJiwNMpVK81dhJ6lErgYdZk6OJ/Mlc6oJG0LF az/eBAQmO3SsuKxWd2JTHRPeFVN+FmA= Received: by mail-pj1-f74.google.com with SMTP id 98e67ed59e1d1-30c54b4007cso174154a91.3 for ; Wed, 14 May 2025 16:42:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1747266178; x=1747870978; 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=KZmvgYTH+K9kHlJ7hwKtOyUz/0yI5aXWo1zgz6ld0Aw=; b=HWuXQersSh/vgK2XPTLrCQ5FaF1S3mZAy9puJfQBWtbbH7cP4h8PcXIFkMbcGPyQYn AGJLcSYoze/AU98JYrwTot7COdCTj3jexbNCUAk0nybB0kKVOl1R+AdEEDWoYCRJJj8Y 6Q7JA0q9XO2h11VVrmeQjdgMP8QoaMxqgAQdqO9GN/HtEuD+88XYSH/eUGiHWY7txoq5 rZ8g34Yucyg/qxyGvZFK68PvpIkJo0Z5nYUNlpt+8GYI3k1wKP+itUGyHButIDXf2Jnb 3ZDs9qbXIFWszkK7B1wKMHhC7kNRQRlkQb1rpplol/WIzqGwtxG2ok+5lj1i1Yp3q9FB ctvQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1747266178; x=1747870978; 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=KZmvgYTH+K9kHlJ7hwKtOyUz/0yI5aXWo1zgz6ld0Aw=; b=s1urFN9Hb8NexUM6gk0DFTykBGYxOaBIH6w2UgaBN/xIwyqhDjIx1sxuLofxJc9ORr P/Qou28Y9zUtM1ReD4HAfPuqVNANuaSLpae1XwOz6cvuFdiw80H+berNsac0AbfXY9uY Wl3kjdFH2+4Wey5X0cAeSDnVab+Zja1py3aayuVy/xuO+mqJQ7+EVHobu59m5Mi89nev mMuLDctQ9/h82H7EgL+1XjlyyYhUMnZdYajWkdAi+NxEqjMkVQIOehykqP3falZaxaIz btjXFl8Z2zRk/4wGSDgXJMapKPhdlnuaaqlEZw+3sVmZlbjPwS1rv+mdq6RQu7wEu571 74Jw== X-Forwarded-Encrypted: i=1; AJvYcCUv95a1LqF73w43Fm6YqhLmY8NAOnjPZPyBriWboaJGBrZQK5B7cLhM+jkKNodRzQ4F5LH39PpSHA==@kvack.org X-Gm-Message-State: AOJu0Yy/E7QehhMXCZFpEJ/JK7AL1+sDA+1lSg3d9M116rVi/IGdy2ur GAzITuOqx7GF2VNPhD8eXsC/Eyqac82rsVjb6OLjWgmaSibATMtRMGew2rL/Q44jJJCgAp8vvJ0 wRjZSvg5ZOAwa3jxcr7i1Nw== X-Google-Smtp-Source: AGHT+IFFbb8i/sd+A66D+lahsn99vvDx9WnxGpS0pqUZU7qxgHi5C9VACOWp6JM90ib70m9PHQgY1Qlpup+M/X5IOw== X-Received: from pjbee11.prod.google.com ([2002:a17:90a:fc4b:b0:30a:3021:c1af]) (user=ackerleytng job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:560b:b0:2fe:d766:ad8e with SMTP id 98e67ed59e1d1-30e2e59bccamr8372424a91.4.1747266178512; Wed, 14 May 2025 16:42:58 -0700 (PDT) Date: Wed, 14 May 2025 16:41:40 -0700 In-Reply-To: Mime-Version: 1.0 References: X-Mailer: git-send-email 2.49.0.1045.g170613ef41-goog Message-ID: Subject: [RFC PATCH v2 01/51] KVM: guest_memfd: Make guest mem 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, usama.arif@bytedance.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-Rspamd-Server: rspam10 X-Stat-Signature: d3szei9cz1y3g71pmknsiz19hx3oesrw X-Rspamd-Queue-Id: AC5D220003 X-Rspam-User: X-HE-Tag: 1747266179-202489 X-HE-Meta: U2FsdGVkX19/1ZTSsABfxjmDv679h0863eblZYj21l/kIxHCrNeIXw+2UvuPJgOeywQm7o/CEOa7F5l56uAZEyZIBXK1vOBjaPeVy5c0vqPK3Cb6OhhC+BLPdLGLkXOTRN/5Cw55IBNZyh0+I2z2ytxNl97TjLLDf8HlWxGdH51Boy9+C/sJw6fL2Bpa/1Psc/RggzJ2B6QW53tYSlOdht50CuECb47yHNAwIya5v3xeyB1zS0+TmDbBlE8NyQrVH5pqlqZnf7N0McSFwfasfF2jjUtAGDaKWPjQF/JwPrVzd88LagQd9FUN6F4lMwSudxBOL/KARe/8CsIvpC3veSOeVof6riaM9gkAKYHJh6pfHAwUMJRJn6deK/COvoKBAiX6XyoO1Djd+iAvNDOD7+S7D4VPnu2J9nYnJ7LkcoYqz5ir8Wf7A8sT9L0ulXiXhR8+TePdYwlMZbsnjxsYkWL7kdjzrKpZBPDpy4jnZTv3imaeNRDG4ZHA4I2Tpc3QmItKFMU0vhrSdX82Jkeg5Bmkrw/bALP/RPNl8Ax7UYyj6r5oY0gjRete6OjviUU576u4ZzX60/qFls40uHuylui0DJAklBtFELkIgPKdOwTHZAkGKVj4IZ+M5HwcI117hDBKxZuKKD8wtnMXKDE8v2gNeAQQTkEamXegWifdAhXex6k6eaS5wxqpPTZ0wnyOiz0UnvYpEWGY0dq9iuudvB50Win8g20eZO/bcsaZHUoYa1hxEw/umUEtMST//wP3wiZYwWwGwO53NljH0rgN66nUuIMNbRNBC+UmvwLV65sNdJtTQEq+cBxclc3L7fTSILIigpdo/c5C3ZhsTpmrX0IITzN2bmUhYhF1gtI3WvqPptJrmyTP0XTopDkjoVu8EEqnRenuM5Kmfl/oeXpp3M8xB1idvEuJDVifMlUJpd/AweohkOacnEJN7jHoX24OCcXOrr7UGMOb3X+e+70 VVCENgld CG+5o/qth3e9EOGInn3g8yrS/1OIKIz2M8uvHW7ZaF+UF/y4VLDU31VK2uklkCVVU9SjNmzTJmTbDN+/r9cNrbJpJGLcqbpBRXya44EiQm/fhmtoAjRNaj+C7WSQ/fNTOlnakeJaqSJ6B13VdEpEihaJ1enxbd/BooqLDJ2tudS0nOXgt712JCQkfAlakqX8zK79xfxImfJQqQ7s5bBSJdRpEuNmo/mvN4LdTKBY1KJne5Kcj1z5VtUNFGp4vfbC3k4qxWiVgqy51RxdKrjmqwQPjmiv8h1ilVTlHdPs+rMPcQFqMAv+AycksxO7kINWBiRDgMV84E5cAWGV2DfT2WIp5ENtL+6RFKfhVEcpahanTRim14LEpaU9kBLiy1kXPtt91+DcM0+14MOy4DAIbjXKLsH52/5rmOyNr 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: Fuad Tabba Signed-off-by: Ackerley Tng Change-Id: I5c23bce8fefe492b40b8042ece1e81448752da99 --- 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 b8e247063b20..239d0f13dcc1 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; @@ -416,9 +420,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, @@ -500,11 +546,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; @@ -518,32 +624,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 6c75f933bfbe..66dfdafbb3b6 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -6419,7 +6419,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) @@ -6440,6 +6442,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(); @@ -6471,6 +6475,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 ec311c0d6718..be68c29fc4ab 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_GMEM -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.1045.g170613ef41-goog