Messages in this thread Patch in this message | | | Date | Tue, 23 Sep 2008 23:51:11 +0400 | From | Alexey Dobriyan <> | Subject | [PATCH v2] Fix "notes" kobject leak |
| |
> > > > --- a/kernel/module.c > > > > +++ b/kernel/module.c > > > > @@ -1174,6 +1174,7 @@ static void free_notes_attrs(struct module_notes_attrs *notes_attrs, > > > > sysfs_remove_bin_file(notes_attrs->dir, > > > > ¬es_attrs->attrs[i]); > > > > kobject_del(notes_attrs->dir); > > > > + kobject_put(notes_attrs->dir); > > > > > > Hm, no, that should just be a call to kobject_put() instead of > > > kobject_del(), can you try that instead and see if that solves the issue > > > (am at a conference and can't test that at the moment, sorry.) > > > > Why?! kobject_del() puts parent kobject. > > And that's about it (well, it also tears down the sysfs stuff.) > > If you call kobject_put() instead, and it's the last put, it will also > call kobject_del() and do everything else that it needs to do. > > Try it and let me know if I'm right or not :)
OK, this works too.
[PATCH v2] Fix "notes" kobject leak
It happens every rmmod if KALLSYMS=y and SYSFS=y.
# modprobe foo
kobject: 'foo' (ffffffffa00743d0): kobject_add_internal: parent: 'module', set: 'module' kobject: 'holders' (ffff88017e7c5770): kobject_add_internal: parent: 'foo', set: '<NULL>' kobject: 'foo' (ffffffffa00743d0): kobject_uevent_env kobject: 'foo' (ffffffffa00743d0): fill_kobj_path: path = '/module/foo' kobject: 'notes' (ffff88017fa9b668): kobject_add_internal: parent: 'foo', set: '<NULL>' ^^^^^
# rmmod foo
kobject: 'holders' (ffff88017e7c5770): kobject_cleanup kobject: 'holders' (ffff88017e7c5770): auto cleanup kobject_del kobject: 'holders' (ffff88017e7c5770): calling ktype release kobject: (ffff88017e7c5770): dynamic_kobj_release kobject: 'holders': free name kobject: 'foo' (ffffffffa00743d0): kobject_cleanup kobject: 'foo' (ffffffffa00743d0): does not have a release() function, it is broken and must be fixed. kobject: 'foo' (ffffffffa00743d0): auto cleanup 'remove' event kobject: 'foo' (ffffffffa00743d0): kobject_uevent_env kobject: 'foo' (ffffffffa00743d0): fill_kobj_path: path = '/module/foo' kobject: 'foo' (ffffffffa00743d0): auto cleanup kobject_del kobject: 'foo': free name
[whooops]
Signed-off-by: Alexey Dobriyan <adobriyan@gmail.com> ---
kernel/module.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
--- a/kernel/module.c +++ b/kernel/module.c @@ -1173,7 +1173,7 @@ static void free_notes_attrs(struct module_notes_attrs *notes_attrs, while (i-- > 0) sysfs_remove_bin_file(notes_attrs->dir, ¬es_attrs->attrs[i]); - kobject_del(notes_attrs->dir); + kobject_put(notes_attrs->dir); } kfree(notes_attrs); }
| |