Skip to content

Commit 0f7e60a

Browse files
bonzinisean-jc
authored andcommitted
kvm: guestmem: do not use a file system
Use a run-of-the-mill anonymous inode, there is nothing useful being provided by kvm_gmem_fs. Fixes: 1d46f95 ("KVM: Add KVM_CREATE_GUEST_MEMFD ioctl() for guest-specific backing memory") Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> Link: https://lore.kernel.org/r/20230928180651.1525674-1-pbonzini@redhat.com [sean: add gmem to list using inode, not file] Signed-off-by: Sean Christopherson <seanjc@google.com>
1 parent e2bbfd5 commit 0f7e60a

File tree

3 files changed

+25
-82
lines changed

3 files changed

+25
-82
lines changed

include/uapi/linux/magic.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,5 @@
101101
#define DMA_BUF_MAGIC 0x444d4142 /* "DMAB" */
102102
#define DEVMEM_MAGIC 0x454d444d /* "DMEM" */
103103
#define SECRETMEM_MAGIC 0x5345434d /* "SECM" */
104-
#define KVM_GUEST_MEMORY_MAGIC 0x474d454d /* "GMEM" */
105104

106105
#endif /* __LINUX_MAGIC_H__ */

virt/kvm/guest_memfd.c

Lines changed: 25 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,10 @@
33
#include <linux/falloc.h>
44
#include <linux/kvm_host.h>
55
#include <linux/pagemap.h>
6-
#include <linux/pseudo_fs.h>
7-
8-
#include <uapi/linux/magic.h>
6+
#include <linux/anon_inodes.h>
97

108
#include "kvm_mm.h"
119

12-
static struct vfsmount *kvm_gmem_mnt;
13-
1410
struct kvm_gmem {
1511
struct kvm *kvm;
1612
struct xarray bindings;
@@ -364,23 +360,35 @@ static const struct inode_operations kvm_gmem_iops = {
364360
.setattr = kvm_gmem_setattr,
365361
};
366362

367-
static int __kvm_gmem_create(struct kvm *kvm, loff_t size, u64 flags,
368-
struct vfsmount *mnt)
363+
static int __kvm_gmem_create(struct kvm *kvm, loff_t size, u64 flags)
369364
{
370365
const char *anon_name = "[kvm-gmem]";
371-
const struct qstr qname = QSTR_INIT(anon_name, strlen(anon_name));
372366
struct kvm_gmem *gmem;
373367
struct inode *inode;
374368
struct file *file;
375369
int fd, err;
376370

377-
inode = alloc_anon_inode(mnt->mnt_sb);
378-
if (IS_ERR(inode))
379-
return PTR_ERR(inode);
371+
fd = get_unused_fd_flags(0);
372+
if (fd < 0)
373+
return fd;
380374

381-
err = security_inode_init_security_anon(inode, &qname, NULL);
382-
if (err)
383-
goto err_inode;
375+
gmem = kzalloc(sizeof(*gmem), GFP_KERNEL);
376+
if (!gmem) {
377+
err = -ENOMEM;
378+
goto err_fd;
379+
}
380+
381+
file = anon_inode_getfile(anon_name, &kvm_gmem_fops, gmem,
382+
O_RDWR);
383+
if (IS_ERR(file)) {
384+
err = PTR_ERR(file);
385+
goto err_gmem;
386+
}
387+
388+
file->f_flags |= O_LARGEFILE;
389+
390+
inode = file->f_inode;
391+
WARN_ON(file->f_mapping != inode->i_mapping);
384392

385393
inode->i_private = (void *)(unsigned long)flags;
386394
inode->i_op = &kvm_gmem_iops;
@@ -393,44 +401,18 @@ static int __kvm_gmem_create(struct kvm *kvm, loff_t size, u64 flags,
393401
/* Unmovable mappings are supposed to be marked unevictable as well. */
394402
WARN_ON_ONCE(!mapping_unevictable(inode->i_mapping));
395403

396-
fd = get_unused_fd_flags(0);
397-
if (fd < 0) {
398-
err = fd;
399-
goto err_inode;
400-
}
401-
402-
file = alloc_file_pseudo(inode, mnt, "kvm-gmem", O_RDWR, &kvm_gmem_fops);
403-
if (IS_ERR(file)) {
404-
err = PTR_ERR(file);
405-
goto err_fd;
406-
}
407-
408-
file->f_flags |= O_LARGEFILE;
409-
file->f_mapping = inode->i_mapping;
410-
411-
gmem = kzalloc(sizeof(*gmem), GFP_KERNEL);
412-
if (!gmem) {
413-
err = -ENOMEM;
414-
goto err_file;
415-
}
416-
417404
kvm_get_kvm(kvm);
418405
gmem->kvm = kvm;
419406
xa_init(&gmem->bindings);
420-
421-
file->private_data = gmem;
422-
423407
list_add(&gmem->entry, &inode->i_mapping->private_list);
424408

425409
fd_install(fd, file);
426410
return fd;
427411

428-
err_file:
429-
fput(file);
412+
err_gmem:
413+
kfree(gmem);
430414
err_fd:
431415
put_unused_fd(fd);
432-
err_inode:
433-
iput(inode);
434416
return err;
435417
}
436418

@@ -455,7 +437,7 @@ int kvm_gmem_create(struct kvm *kvm, struct kvm_create_guest_memfd *args)
455437
return -EINVAL;
456438
#endif
457439

458-
return __kvm_gmem_create(kvm, size, flags, kvm_gmem_mnt);
440+
return __kvm_gmem_create(kvm, size, flags);
459441
}
460442

461443
int kvm_gmem_bind(struct kvm *kvm, struct kvm_memory_slot *slot,
@@ -611,35 +593,3 @@ int kvm_gmem_get_pfn(struct kvm *kvm, struct kvm_memory_slot *slot,
611593
return r;
612594
}
613595
EXPORT_SYMBOL_GPL(kvm_gmem_get_pfn);
614-
615-
static int kvm_gmem_init_fs_context(struct fs_context *fc)
616-
{
617-
if (!init_pseudo(fc, KVM_GUEST_MEMORY_MAGIC))
618-
return -ENOMEM;
619-
620-
return 0;
621-
}
622-
623-
static struct file_system_type kvm_gmem_fs = {
624-
.name = "kvm_guest_memory",
625-
.init_fs_context = kvm_gmem_init_fs_context,
626-
.kill_sb = kill_anon_super,
627-
};
628-
629-
int kvm_gmem_init(void)
630-
{
631-
kvm_gmem_mnt = kern_mount(&kvm_gmem_fs);
632-
if (IS_ERR(kvm_gmem_mnt))
633-
return PTR_ERR(kvm_gmem_mnt);
634-
635-
/* For giggles. Userspace can never map this anyways. */
636-
kvm_gmem_mnt->mnt_flags |= MNT_NOEXEC;
637-
638-
return 0;
639-
}
640-
641-
void kvm_gmem_exit(void)
642-
{
643-
kern_unmount(kvm_gmem_mnt);
644-
kvm_gmem_mnt = NULL;
645-
}

virt/kvm/kvm_main.c

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6448,10 +6448,6 @@ int kvm_init(unsigned vcpu_size, unsigned vcpu_align, struct module *module)
64486448
if (r)
64496449
goto err_async_pf;
64506450

6451-
r = kvm_gmem_init();
6452-
if (r)
6453-
goto err_gmem;
6454-
64556451
kvm_chardev_ops.owner = module;
64566452

64576453
kvm_preempt_ops.sched_in = kvm_sched_in;
@@ -6478,8 +6474,6 @@ int kvm_init(unsigned vcpu_size, unsigned vcpu_align, struct module *module)
64786474
err_register:
64796475
kvm_vfio_ops_exit();
64806476
err_vfio:
6481-
kvm_gmem_exit();
6482-
err_gmem:
64836477
kvm_async_pf_deinit();
64846478
err_async_pf:
64856479
kvm_irqfd_exit();

0 commit comments

Comments
 (0)