* Re: [PATCH/RFC 2] kvm: fix module refcount issues with anon_inodegetfd [not found] ` <49295F6D.8010200@redhat.com> @ 2008-11-25 8:07 ` Christian Borntraeger 2008-11-25 13:55 ` Avi Kivity 0 siblings, 1 reply; 7+ messages in thread From: Christian Borntraeger @ 2008-11-25 8:07 UTC (permalink / raw) To: Avi Kivity; +Cc: kvm, linux-fsdevel > Messing with module counts is slightly ugly. I changed my patch to be more generic. Instead of messing with the module refcount in the kvm module, I decided to change anon_inode_getfd instead. If the owner field is set, we will try an module_get in anon_inode_getfd, since the VFS release function will do a module_put. This makes the open/release symmetric. What do you think? I also CCed fs-devel, since fs/* is affected From: Christian Borntraeger <borntraeger@de.ibm.com> There is a race between a "close of the file descriptors" and module unload in the kvm module. You can easily trigger this problem by applying this debug patch: >--- kvm.orig/virt/kvm/kvm_main.c >+++ kvm/virt/kvm/kvm_main.c >@@ -648,10 +648,14 @@ void kvm_free_physmem(struct kvm *kvm) > kvm_free_physmem_slot(&kvm->memslots[i], NULL); > } > >+#include <linux/delay.h> > static void kvm_destroy_vm(struct kvm *kvm) > { > struct mm_struct *mm = kvm->mm; > >+ printk("off1\n"); >+ msleep(5000); >+ printk("off2\n"); > spin_lock(&kvm_lock); > list_del(&kvm->vm_list); > spin_unlock(&kvm_lock); and changing userspace to closing the vcpu file descriptors after the vm file descriptors. (killall sometimes also seems to work) kvm_destroy_vm is called, after all kvm file descriptors have entered the release function and kvm_put_kvm was called. The problem is that kvm_destroy_vm can run while the module count is 0. That means, you can remove the module while kvm_destroy_vm is running. But kvm_destroy_vm is part of the module text. This causes a kerneloops. The race exists without the msleep but is much harder to trigger. Nevertheless, the right seems to be a change to anon_inode_getfd. The VFS release function will drop the module ref count if fops->owner is set. Therefore, it makes a lot of sense, that anon_inode_getfd increases the refcount. I have check all existing users of anon_inode_getfs. None of them, sets the owner field. anon inodes should continue to work for them as expected. In addition, the kvm module must set the owner field accordingly. Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com> --- fs/anon_inodes.c | 3 +++ virt/kvm/kvm_main.c | 3 ++- 2 files changed, 5 insertions(+), 1 deletion(-) Index: kvm/fs/anon_inodes.c =================================================================== --- kvm.orig/fs/anon_inodes.c +++ kvm/fs/anon_inodes.c @@ -79,6 +79,9 @@ int anon_inode_getfd(const char *name, c if (IS_ERR(anon_inode_inode)) return -ENODEV; + if (fops->owner && !try_module_get(fops->owner)) + return -ENOENT; + error = get_unused_fd_flags(flags); if (error < 0) return error; Index: kvm/virt/kvm/kvm_main.c =================================================================== --- kvm.orig/virt/kvm/kvm_main.c +++ kvm/virt/kvm/kvm_main.c @@ -1303,7 +1303,7 @@ static int kvm_vcpu_release(struct inode return 0; } -static const struct file_operations kvm_vcpu_fops = { +static struct file_operations kvm_vcpu_fops = { .release = kvm_vcpu_release, .unlocked_ioctl = kvm_vcpu_ioctl, .compat_ioctl = kvm_vcpu_ioctl, @@ -2061,6 +2061,7 @@ int kvm_init(void *opaque, unsigned int } kvm_chardev_ops.owner = module; + kvm_vcpu_fops.owner = module; r = misc_register(&kvm_dev); if (r) { ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH/RFC 2] kvm: fix module refcount issues with anon_inodegetfd 2008-11-25 8:07 ` [PATCH/RFC 2] kvm: fix module refcount issues with anon_inodegetfd Christian Borntraeger @ 2008-11-25 13:55 ` Avi Kivity 2008-11-27 14:01 ` [PATCH/Request for review]: check for fops->owner in anon_inode_getfd Christian Borntraeger 0 siblings, 1 reply; 7+ messages in thread From: Avi Kivity @ 2008-11-25 13:55 UTC (permalink / raw) To: Christian Borntraeger; +Cc: kvm, linux-fsdevel Christian Borntraeger wrote: >> Messing with module counts is slightly ugly. >> > > I changed my patch to be more generic. Instead of messing with the > module refcount in the kvm module, I decided to change > anon_inode_getfd instead. If the owner field is set, we will > try an module_get in anon_inode_getfd, since the VFS release > function will do a module_put. This makes the open/release > symmetric. What do you think? > I agree with your analysis, and also that the anon_inodes change is useful. If it's acceptable to the vfs/anon_inode maintainers, I'll apply the patch. -- error compiling committee.c: too many arguments to function ^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH/Request for review]: check for fops->owner in anon_inode_getfd 2008-11-25 13:55 ` Avi Kivity @ 2008-11-27 14:01 ` Christian Borntraeger 2008-11-27 18:49 ` Davide Libenzi 0 siblings, 1 reply; 7+ messages in thread From: Christian Borntraeger @ 2008-11-27 14:01 UTC (permalink / raw) To: linux-fsdevel; +Cc: Avi Kivity, kvm, Davide Libenzi Am Dienstag, 25. November 2008 schrieb Avi Kivity: > I agree with your analysis, and also that the anon_inodes change is > useful. If it's acceptable to the vfs/anon_inode maintainers, I'll > apply the patch. I think it is a good idea to strip the fs specific changes into a separate patch for easier review: From: Christian Borntraeger <borntraeger@de.ibm.com> There is an imbalance for anonymous inodes. If the fops->owner field is set, the module reference count of owner is decreases on release. ("filp_close" --> "__fput" ---> "fops_put") On the other hand, anon_inode_getfd does not increase the module reference count of owner. This causes two problems: - if owner is set, the module refcount goes negative - if owner is not set, the module can be unloaded while code is running This patch changes anon_inode_getfd to be symmetric regarding fops->owner handling. I have checked all existing users of anon_inode_getfd. Noone sets fops->owner, thats why nobody has seen the module refcount negative. Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com> --- kvm.orig/fs/anon_inodes.c +++ kvm/fs/anon_inodes.c @@ -79,6 +79,9 @@ int anon_inode_getfd(const char *name, c if (IS_ERR(anon_inode_inode)) return -ENODEV; + if (fops->owner && !try_module_get(fops->owner)) + return -ENOENT; + error = get_unused_fd_flags(flags); if (error < 0) return error; ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH/Request for review]: check for fops->owner in anon_inode_getfd 2008-11-27 14:01 ` [PATCH/Request for review]: check for fops->owner in anon_inode_getfd Christian Borntraeger @ 2008-11-27 18:49 ` Davide Libenzi 2008-11-27 19:17 ` [PATCH v2]: " Christian Borntraeger 0 siblings, 1 reply; 7+ messages in thread From: Davide Libenzi @ 2008-11-27 18:49 UTC (permalink / raw) To: Christian Borntraeger; +Cc: linux-fsdevel, Avi Kivity, kvm On Thu, 27 Nov 2008, Christian Borntraeger wrote: > Am Dienstag, 25. November 2008 schrieb Avi Kivity: > > I agree with your analysis, and also that the anon_inodes change is > > useful. If it's acceptable to the vfs/anon_inode maintainers, I'll > > apply the patch. > > I think it is a good idea to strip the fs specific changes into a separate > patch for easier review: > > From: Christian Borntraeger <borntraeger@de.ibm.com> > > There is an imbalance for anonymous inodes. If the fops->owner field is set, > the module reference count of owner is decreases on release. > ("filp_close" --> "__fput" ---> "fops_put") > > On the other hand, anon_inode_getfd does not increase the module reference > count of owner. This causes two problems: > > - if owner is set, the module refcount goes negative > - if owner is not set, the module can be unloaded while code is running > > This patch changes anon_inode_getfd to be symmetric regarding fops->owner > handling. > > I have checked all existing users of anon_inode_getfd. Noone sets fops->owner, > thats why nobody has seen the module refcount negative. > > Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com> > > --- kvm.orig/fs/anon_inodes.c > +++ kvm/fs/anon_inodes.c > @@ -79,6 +79,9 @@ int anon_inode_getfd(const char *name, c > if (IS_ERR(anon_inode_inode)) > return -ENODEV; > > + if (fops->owner && !try_module_get(fops->owner)) > + return -ENOENT; > + > error = get_unused_fd_flags(flags); > if (error < 0) > return error; What if get_unused_fd_flags() (or the following error-returing ops) fails after a successful try_module_get()? - Davide ^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH v2]: check for fops->owner in anon_inode_getfd 2008-11-27 18:49 ` Davide Libenzi @ 2008-11-27 19:17 ` Christian Borntraeger 2008-11-27 19:40 ` Davide Libenzi 0 siblings, 1 reply; 7+ messages in thread From: Christian Borntraeger @ 2008-11-27 19:17 UTC (permalink / raw) To: Davide Libenzi; +Cc: linux-fsdevel, Avi Kivity, kvm > > + if (fops->owner && !try_module_get(fops->owner)) > > + return -ENOENT; > > + > > error = get_unused_fd_flags(flags); > > if (error < 0) > > return error; > > What if get_unused_fd_flags() (or the following error-returing ops) fails > after a successful try_module_get()? Right, well spotted. I have added a fixup label. From: Christian Borntraeger <borntraeger@de.ibm.com> There is an imbalance for anonymous inodes. If the fops->owner field is set, the module reference count of owner is decreases on release. ("filp_close" --> "__fput" ---> "fops_put") On the other hand, anon_inode_getfd does not increase the module reference count of owner. This causes two problems: - if owner is set, the module refcount goes negative - if owner is not set, the module can be unloaded while code is running This patch changes anon_inode_getfd to be symmetric regarding fops->owner handling. I have checked all existing users of anon_inode_getfd. Noone sets fops->owner, thats why nobody has seen the module refcount negative. Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com> From: Christian Borntraeger <borntraeger@de.ibm.com> There is an imbalance for anonymous inodes. If the fops->owner field is set, the module reference count of owner is decreases on release. ("filp_close" --> "__fput" ---> "fops_put") On the other hand, anon_inode_getfd does not increase the module reference count of owner. This causes two problems: - if owner is set, the module refcount goes negative - if owner is not set, the module can be unloaded while code is running This patch changes anon_inode_getfd to be symmetric regarding fops->owner handling. I have checked all existing users of anon_inode_getfd. Noone sets fops->owner, thats why nobody has seen the module refcount negative. Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com> --- fs/anon_inodes.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) Index: kvm/fs/anon_inodes.c =================================================================== --- kvm.orig/fs/anon_inodes.c +++ kvm/fs/anon_inodes.c @@ -79,9 +79,12 @@ int anon_inode_getfd(const char *name, c if (IS_ERR(anon_inode_inode)) return -ENODEV; + if (fops->owner && !try_module_get(fops->owner)) + return -ENOENT; + error = get_unused_fd_flags(flags); if (error < 0) - return error; + goto err_module; fd = error; /* @@ -128,6 +131,8 @@ err_dput: dput(dentry); err_put_unused_fd: put_unused_fd(fd); +err_module: + module_put(fops->owner); return error; } EXPORT_SYMBOL_GPL(anon_inode_getfd); ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v2]: check for fops->owner in anon_inode_getfd 2008-11-27 19:17 ` [PATCH v2]: " Christian Borntraeger @ 2008-11-27 19:40 ` Davide Libenzi 2008-12-01 8:57 ` Christian Borntraeger 0 siblings, 1 reply; 7+ messages in thread From: Davide Libenzi @ 2008-11-27 19:40 UTC (permalink / raw) To: Christian Borntraeger; +Cc: linux-fsdevel, Avi Kivity, kvm On Thu, 27 Nov 2008, Christian Borntraeger wrote: > > > + if (fops->owner && !try_module_get(fops->owner)) > > > + return -ENOENT; > > > + > > > error = get_unused_fd_flags(flags); > > > if (error < 0) > > > return error; > > > > What if get_unused_fd_flags() (or the following error-returing ops) fails > > after a successful try_module_get()? > > Right, well spotted. I have added a fixup label. > > From: Christian Borntraeger <borntraeger@de.ibm.com> > > There is an imbalance for anonymous inodes. If the fops->owner field is set, > the module reference count of owner is decreases on release. > ("filp_close" --> "__fput" ---> "fops_put") > > On the other hand, anon_inode_getfd does not increase the module reference > count of owner. This causes two problems: > > - if owner is set, the module refcount goes negative > - if owner is not set, the module can be unloaded while code is running > > This patch changes anon_inode_getfd to be symmetric regarding fops->owner > handling. > > I have checked all existing users of anon_inode_getfd. Noone sets fops->owner, > thats why nobody has seen the module refcount negative. > > Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com> > > > From: Christian Borntraeger <borntraeger@de.ibm.com> > > There is an imbalance for anonymous inodes. If the fops->owner field is set, > the module reference count of owner is decreases on release. > ("filp_close" --> "__fput" ---> "fops_put") > > On the other hand, anon_inode_getfd does not increase the module reference > count of owner. This causes two problems: > > - if owner is set, the module refcount goes negative > - if owner is not set, the module can be unloaded while code is running > > This patch changes anon_inode_getfd to be symmetric regarding fops->owner > handling. > > I have checked all existing users of anon_inode_getfd. Noone sets fops->owner, > thats why nobody has seen the module refcount negative. > > Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com> > --- > fs/anon_inodes.c | 7 ++++++- > 1 file changed, 6 insertions(+), 1 deletion(-) > > Index: kvm/fs/anon_inodes.c > =================================================================== > --- kvm.orig/fs/anon_inodes.c > +++ kvm/fs/anon_inodes.c > @@ -79,9 +79,12 @@ int anon_inode_getfd(const char *name, c > if (IS_ERR(anon_inode_inode)) > return -ENODEV; > > + if (fops->owner && !try_module_get(fops->owner)) > + return -ENOENT; > + > error = get_unused_fd_flags(flags); > if (error < 0) > - return error; > + goto err_module; > fd = error; > > /* > @@ -128,6 +131,8 @@ err_dput: > dput(dentry); > err_put_unused_fd: > put_unused_fd(fd); > +err_module: > + module_put(fops->owner); > return error; > } > EXPORT_SYMBOL_GPL(anon_inode_getfd); Looks OK to me. - Davide ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v2]: check for fops->owner in anon_inode_getfd 2008-11-27 19:40 ` Davide Libenzi @ 2008-12-01 8:57 ` Christian Borntraeger 0 siblings, 0 replies; 7+ messages in thread From: Christian Borntraeger @ 2008-12-01 8:57 UTC (permalink / raw) To: Davide Libenzi; +Cc: linux-fsdevel, Avi Kivity, kvm Am Donnerstag, 27. November 2008 schrieb Davide Libenzi: > > =================================================================== > > --- kvm.orig/fs/anon_inodes.c > > +++ kvm/fs/anon_inodes.c > > @@ -79,9 +79,12 @@ int anon_inode_getfd(const char *name, c > > if (IS_ERR(anon_inode_inode)) > > return -ENODEV; > > > > + if (fops->owner && !try_module_get(fops->owner)) > > + return -ENOENT; > > + > > error = get_unused_fd_flags(flags); > > if (error < 0) > > - return error; > > + goto err_module; > > fd = error; > > > > /* > > @@ -128,6 +131,8 @@ err_dput: > > dput(dentry); > > err_put_unused_fd: > > put_unused_fd(fd); > > +err_module: > > + module_put(fops->owner); > > return error; > > } > > EXPORT_SYMBOL_GPL(anon_inode_getfd); > > Looks OK to me. Ok. Thanks. I will push this to Avi. Can I add a Reviewed-by: Davide Libenzi <davidel@xmailserver.org> to the patch? Christian ^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2008-12-01 8:57 UTC | newest] Thread overview: 7+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- [not found] <200811202010.00125.borntraeger@de.ibm.com> [not found] ` <49295F6D.8010200@redhat.com> 2008-11-25 8:07 ` [PATCH/RFC 2] kvm: fix module refcount issues with anon_inodegetfd Christian Borntraeger 2008-11-25 13:55 ` Avi Kivity 2008-11-27 14:01 ` [PATCH/Request for review]: check for fops->owner in anon_inode_getfd Christian Borntraeger 2008-11-27 18:49 ` Davide Libenzi 2008-11-27 19:17 ` [PATCH v2]: " Christian Borntraeger 2008-11-27 19:40 ` Davide Libenzi 2008-12-01 8:57 ` Christian Borntraeger
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).