On Thu, Nov 10, 2011 at 01:56:49PM +0800, Shaohua Li wrote: > +static struct kobject *hugepage_kobj; It's minor nitpick but we don't need to put this in .bss, passing it as hugepage_init_sysfs(struct kobject **hugepage_kobj) and storing it there in case the error returned by hugepage_init_sysfs is zero should be fine. The feature cannot be unloaded so we can lose the pointer after init is complete. Then I think we can be done with this... and it looks better now. > +static int __init hugepage_init_sysfs(void) > { > int err; > -#ifdef CONFIG_SYSFS > - static struct kobject *hugepage_kobj; > -#endif > > - err = -EINVAL; > - if (!has_transparent_hugepage()) { > - transparent_hugepage_flags = 0; > - goto out; > - } > - > -#ifdef CONFIG_SYSFS > - err = -ENOMEM; > hugepage_kobj = kobject_create_and_add("transparent_hugepage", mm_kobj); > if (unlikely(!hugepage_kobj)) { > printk(KERN_ERR "hugepage: failed kobject create\n"); > - goto out; > + return -ENOMEM; > } > > err = sysfs_create_group(hugepage_kobj, &hugepage_attr_group); > if (err) { > printk(KERN_ERR "hugepage: failed register hugeage group\n"); > - goto out; > + goto delete_obj; > } > > err = sysfs_create_group(hugepage_kobj, &khugepaged_attr_group); > if (err) { > printk(KERN_ERR "hugepage: failed register hugeage group\n"); > - goto out; > + goto remove_hp_group; > } > -#endif > + > + return 0; > + > +remove_hp_group: > + sysfs_remove_group(hugepage_kobj, &hugepage_attr_group); > +delete_obj: > + kobject_put(hugepage_kobj); > + return err; > +} > + > +static void __init hugepage_exit_sysfs(void) > +{ > + sysfs_remove_group(hugepage_kobj, &khugepaged_attr_group); > + sysfs_remove_group(hugepage_kobj, &hugepage_attr_group); > + kobject_put(hugepage_kobj); > +} > +#else > +static inline int hugepage_init_sysfs(void) > +{ > + return 0; > +} > + > +static inline void hugepage_exit_sysfs(void) > +{ > +} > +#endif /* CONFIG_SYSFS */ > + > +static int __init hugepage_init(void) > +{ > + int err; struct kobject *hugepage_kobj; > + > + if (!has_transparent_hugepage()) { > + transparent_hugepage_flags = 0; > + return -EINVAL; > + } > + > + err = hugepage_init_sysfs(); err = hugepage_init_sysfs(&hugepage_kobj); > + if (err) > + return err; > > err = khugepaged_slab_init(); > if (err) > @@ -545,7 +572,9 @@ static int __init hugepage_init(void) > > set_recommended_min_free_kbytes(); > > + return 0; > out: > + hugepage_exit_sysfs(); hugepage_exit_sysfs(hugepage_kobj); > return err; > } > module_init(hugepage_init) > > -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxx. For more info on Linux MM, see: http://www.linux-mm.org/ . Fight unfair telecom internet charges in Canada: sign http://stopthemeter.ca/ Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a>