Hi Ackerley, Not sure if below nits have been resolved in your latest code. I came across them and felt it's better to report them anyway.
Apologies for any redundancy if you've already addressed them. On Tue, Sep 10, 2024 at 11:43:44PM +0000, Ackerley Tng wrote: > +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; > > +} > > + > > static struct file_operations kvm_gmem_fops = { > > .open = generic_file_open, > > .release = kvm_gmem_release, > > @@ -311,6 +348,8 @@ static struct file_operations kvm_gmem_fops = { > > void kvm_gmem_init(struct module *module) > > { > > kvm_gmem_fops.owner = module; > > + > > + kvm_gmem_init_mount(); > > } When KVM is compiled as a module, looks "kern_unmount(kvm_gmem_mnt)" is missing in the kvm_exit() path. This may lead to kernel oops when executing "sync" after KVM is unloaded or reloaded. BTW, there're lots of symbols not exported under mm. > +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; > + > + if (kvm_gmem_fops.owner && !try_module_get(kvm_gmem_fops.owner)) > + return ERR_PTR(-ENOENT); > + > + inode = kvm_gmem_inode_make_secure_inode(name, size, flags); > + if (IS_ERR(inode)) Missing module_put() here. i.e., - if (IS_ERR(inode)) + if (IS_ERR(inode)) { + if (kvm_gmem_fops.owner) + module_put(kvm_gmem_fops.owner); + return ERR_CAST(inode); + } > + return ERR_CAST(inode); > + > + file = alloc_file_pseudo(inode, kvm_gmem_mnt, name, O_RDWR, > + &kvm_gmem_fops); > + if (IS_ERR(file)) { > + iput(inode); > + return file; > + } > + > + file->f_mapping = inode->i_mapping; > + file->f_flags |= O_LARGEFILE; > + file->private_data = priv; > + > + return file; > +} > + Thanks Yan