From b86ab02803095190d6b72bcc18dcf620bf378df9 Mon Sep 17 00:00:00 2001 From: Tejun Heo Date: Mon, 20 Dec 2004 18:36:03 -0800 Subject: [PATCH] module sysfs: make module.mkobj inline Make module.mkobj inline. As this is simpler and what's usually done with kobjs when it's representing an entity. Signed-off-by: Tejun Heo Signed-off-by: Greg Kroah-Hartman --- include/linux/module.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'include/linux/module.h') diff --git a/include/linux/module.h b/include/linux/module.h index c8dd7b8495c6..c1d709a317fd 100644 --- a/include/linux/module.h +++ b/include/linux/module.h @@ -250,7 +250,7 @@ struct module char name[MODULE_NAME_LEN]; /* Sysfs stuff. */ - struct module_kobject *mkobj; + struct module_kobject mkobj; struct param_kobject *params_kobject; /* Exported symbols */ -- cgit v1.2.3 From 6239c1cfe8b95d18533ca82d9b6d7cf7c55028a1 Mon Sep 17 00:00:00 2001 From: Tejun Heo Date: Mon, 20 Dec 2004 18:36:20 -0800 Subject: [PATCH] module sysfs: expand module_attribute methods Modify module_attribute show/store methods to accept self argument to enable further extensions. Signed-off-by: Tejun Heo Signed-off-by: Greg Kroah-Hartman --- include/linux/module.h | 5 +++-- kernel/module.c | 3 ++- kernel/params.c | 2 +- 3 files changed, 6 insertions(+), 4 deletions(-) (limited to 'include/linux/module.h') diff --git a/include/linux/module.h b/include/linux/module.h index c1d709a317fd..a93281edc978 100644 --- a/include/linux/module.h +++ b/include/linux/module.h @@ -48,8 +48,9 @@ struct module; struct module_attribute { struct attribute attr; - ssize_t (*show)(struct module *, char *); - ssize_t (*store)(struct module *, const char *, size_t count); + ssize_t (*show)(struct module_attribute *, struct module *, char *); + ssize_t (*store)(struct module_attribute *, struct module *, + const char *, size_t count); }; struct module_kobject diff --git a/kernel/module.c b/kernel/module.c index 16208a97aadf..ad0e00e01ddd 100644 --- a/kernel/module.c +++ b/kernel/module.c @@ -651,7 +651,8 @@ void symbol_put_addr(void *addr) } EXPORT_SYMBOL_GPL(symbol_put_addr); -static ssize_t show_refcnt(struct module *mod, char *buffer) +static ssize_t show_refcnt(struct module_attribute *mattr, + struct module *mod, char *buffer) { /* sysfs holds a reference */ return sprintf(buffer, "%u\n", module_refcount(mod)-1); diff --git a/kernel/params.c b/kernel/params.c index 70d0868255e7..3fc1c9a805a3 100644 --- a/kernel/params.c +++ b/kernel/params.c @@ -693,7 +693,7 @@ static ssize_t module_attr_show(struct kobject *kobj, if (!try_module_get(mk->mod)) return -ENODEV; - ret = attribute->show(mk->mod, buf); + ret = attribute->show(attribute, mk->mod, buf); module_put(mk->mod); -- cgit v1.2.3 From 064840485854ee9deb170fd40b33cfdd1de7fa1a Mon Sep 17 00:00:00 2001 From: Tejun Heo Date: Mon, 20 Dec 2004 18:36:35 -0800 Subject: [PATCH] module sysfs: sections attr reimplemented using attr group Reimplement section attributes using attribute group. This makes more sense, for, while they reside in a separate subdirectory, they belong to the ownig module and their lifetime exactly equals the lifetime of the owning module, and it's simpler. Signed-off-by: Tejun Heo Signed-off-by: Greg Kroah-Hartman --- include/linux/module.h | 8 +++--- kernel/module.c | 75 +++++++++++++++++++++++--------------------------- 2 files changed, 39 insertions(+), 44 deletions(-) (limited to 'include/linux/module.h') diff --git a/include/linux/module.h b/include/linux/module.h index a93281edc978..a3f3117574dd 100644 --- a/include/linux/module.h +++ b/include/linux/module.h @@ -227,14 +227,14 @@ enum module_state #define MODULE_SECT_NAME_LEN 32 struct module_sect_attr { - struct attribute attr; + struct module_attribute mattr; char name[MODULE_SECT_NAME_LEN]; unsigned long address; }; -struct module_sections +struct module_sect_attrs { - struct kobject kobj; + struct attribute_group grp; struct module_sect_attr attrs[0]; }; @@ -313,7 +313,7 @@ struct module char *strtab; /* Section attributes */ - struct module_sections *sect_attrs; + struct module_sect_attrs *sect_attrs; #endif /* Per-cpu data. */ diff --git a/kernel/module.c b/kernel/module.c index ad0e00e01ddd..6247bf4ab003 100644 --- a/kernel/module.c +++ b/kernel/module.c @@ -937,76 +937,71 @@ static unsigned long resolve_symbol(Elf_Shdr *sechdrs, * J. Corbet */ #ifdef CONFIG_KALLSYMS -static void module_sect_attrs_release(struct kobject *kobj) -{ - kfree(container_of(kobj, struct module_sections, kobj)); -} - -static ssize_t module_sect_show(struct kobject *kobj, struct attribute *attr, - char *buf) +static ssize_t module_sect_show(struct module_attribute *mattr, + struct module *mod, char *buf) { struct module_sect_attr *sattr = - container_of(attr, struct module_sect_attr, attr); + container_of(mattr, struct module_sect_attr, mattr); return sprintf(buf, "0x%lx\n", sattr->address); } -static struct sysfs_ops module_sect_ops = { - .show = module_sect_show, -}; - -static struct kobj_type module_sect_ktype = { - .sysfs_ops = &module_sect_ops, - .release = module_sect_attrs_release, -}; - static void add_sect_attrs(struct module *mod, unsigned int nsect, char *secstrings, Elf_Shdr *sechdrs) { - unsigned int nloaded = 0, i; + unsigned int nloaded = 0, i, size[2]; + struct module_sect_attrs *sect_attrs; struct module_sect_attr *sattr; + struct attribute **gattr; /* Count loaded sections and allocate structures */ for (i = 0; i < nsect; i++) if (sechdrs[i].sh_flags & SHF_ALLOC) nloaded++; - mod->sect_attrs = kmalloc(sizeof(struct module_sections) + - nloaded*sizeof(mod->sect_attrs->attrs[0]), GFP_KERNEL); - if (! mod->sect_attrs) + size[0] = ALIGN(sizeof(*sect_attrs) + + nloaded * sizeof(sect_attrs->attrs[0]), + sizeof(sect_attrs->grp.attrs[0])); + size[1] = (nloaded + 1) * sizeof(sect_attrs->grp.attrs[0]); + if (! (sect_attrs = kmalloc(size[0] + size[1], GFP_KERNEL))) return; - /* sections entry setup */ - memset(mod->sect_attrs, 0, sizeof(struct module_sections)); - if (kobject_set_name(&mod->sect_attrs->kobj, "sections")) - goto out; - mod->sect_attrs->kobj.parent = &mod->mkobj.kobj; - mod->sect_attrs->kobj.ktype = &module_sect_ktype; - if (kobject_register(&mod->sect_attrs->kobj)) - goto out; + /* Setup section attributes. */ + sect_attrs->grp.name = "sections"; + sect_attrs->grp.attrs = (void *)sect_attrs + size[0]; - /* And the section attributes. */ - sattr = &mod->sect_attrs->attrs[0]; + sattr = §_attrs->attrs[0]; + gattr = §_attrs->grp.attrs[0]; for (i = 0; i < nsect; i++) { if (! (sechdrs[i].sh_flags & SHF_ALLOC)) continue; sattr->address = sechdrs[i].sh_addr; strlcpy(sattr->name, secstrings + sechdrs[i].sh_name, - MODULE_SECT_NAME_LEN); - sattr->attr.name = sattr->name; - sattr->attr.owner = mod; - sattr->attr.mode = S_IRUGO; - (void) sysfs_create_file(&mod->sect_attrs->kobj, &sattr->attr); - sattr++; + MODULE_SECT_NAME_LEN); + sattr->mattr.show = module_sect_show; + sattr->mattr.store = NULL; + sattr->mattr.attr.name = sattr->name; + sattr->mattr.attr.owner = mod; + sattr->mattr.attr.mode = S_IRUGO; + *(gattr++) = &(sattr++)->mattr.attr; } + *gattr = NULL; + + if (sysfs_create_group(&mod->mkobj.kobj, §_attrs->grp)) + goto out; + + mod->sect_attrs = sect_attrs; return; out: - kfree(mod->sect_attrs); - mod->sect_attrs = NULL; + kfree(sect_attrs); } static void remove_sect_attrs(struct module *mod) { if (mod->sect_attrs) { - kobject_unregister(&mod->sect_attrs->kobj); + sysfs_remove_group(&mod->mkobj.kobj, + &mod->sect_attrs->grp); + /* We are positive that no one is using any sect attrs + * at this point. Deallocate immediately. */ + kfree(mod->sect_attrs); mod->sect_attrs = NULL; } } -- cgit v1.2.3 From fcf7104e3c6e9a4b2db96204e8f06efbe14cf258 Mon Sep 17 00:00:00 2001 From: Tejun Heo Date: Mon, 20 Dec 2004 18:36:52 -0800 Subject: [PATCH] module sysfs: module parameters reimplemented using attr group Reimplement parameter attributes using attribute group. This makes more sense, for, while they reside in a separate subdirectory, they belong to the ownig module and their lifetime exactly equals the lifetime of the owning module, and it's simpler. Signed-off-by: Tejun Heo Signed-off-by: Greg Kroah-Hartman --- include/linux/module.h | 4 +- kernel/params.c | 179 +++++++++++++++---------------------------------- 2 files changed, 56 insertions(+), 127 deletions(-) (limited to 'include/linux/module.h') diff --git a/include/linux/module.h b/include/linux/module.h index a3f3117574dd..159e8b9daa11 100644 --- a/include/linux/module.h +++ b/include/linux/module.h @@ -238,7 +238,7 @@ struct module_sect_attrs struct module_sect_attr attrs[0]; }; -struct param_kobject; +struct module_param_attrs; struct module { @@ -252,7 +252,7 @@ struct module /* Sysfs stuff. */ struct module_kobject mkobj; - struct param_kobject *params_kobject; + struct module_param_attrs *param_attrs; /* Exported symbols */ const struct kernel_symbol *syms; diff --git a/kernel/params.c b/kernel/params.c index 3fc1c9a805a3..a4888d7860ae 100644 --- a/kernel/params.c +++ b/kernel/params.c @@ -357,26 +357,23 @@ extern struct kernel_param __start___param[], __stop___param[]; struct param_attribute { - struct attribute attr; + struct module_attribute mattr; struct kernel_param *param; }; -struct param_kobject +struct module_param_attrs { - struct kobject kobj; - - unsigned int num_attributes; - struct param_attribute attr[0]; + struct attribute_group grp; + struct param_attribute attrs[0]; }; -#define to_param_attr(n) container_of(n, struct param_attribute, attr); +#define to_param_attr(n) container_of(n, struct param_attribute, mattr); -static ssize_t param_attr_show(struct kobject *kobj, - struct attribute *attr, - char *buf) +static ssize_t param_attr_show(struct module_attribute *mattr, + struct module *mod, char *buf) { int count; - struct param_attribute *attribute = to_param_attr(attr); + struct param_attribute *attribute = to_param_attr(mattr); if (!attribute->param->get) return -EPERM; @@ -390,12 +387,12 @@ static ssize_t param_attr_show(struct kobject *kobj, } /* sysfs always hands a nul-terminated string in buf. We rely on that. */ -static ssize_t param_attr_store(struct kobject *kobj, - struct attribute *attr, +static ssize_t param_attr_store(struct module_attribute *mattr, + struct module *owner, const char *buf, size_t len) { int err; - struct param_attribute *attribute = to_param_attr(attr); + struct param_attribute *attribute = to_param_attr(mattr); if (!attribute->param->set) return -EPERM; @@ -406,81 +403,12 @@ static ssize_t param_attr_store(struct kobject *kobj, return err; } - -static struct sysfs_ops param_sysfs_ops = { - .show = param_attr_show, - .store = param_attr_store, -}; - -static void param_kobj_release(struct kobject *kobj) -{ - kfree(container_of(kobj, struct param_kobject, kobj)); -} - -static struct kobj_type param_ktype = { - .sysfs_ops = ¶m_sysfs_ops, - .release = ¶m_kobj_release, -}; - -static struct kset param_kset = { - .subsys = &module_subsys, - .ktype = ¶m_ktype, -}; - #ifdef CONFIG_MODULES #define __modinit #else #define __modinit __init #endif -/* - * param_add_attribute - actually adds an parameter to sysfs - * @mod: owner of parameter - * @pk: param_kobject the attribute shall be assigned to. - * One per module, one per KBUILD_MODNAME. - * @kp: kernel_param to be added - * @skip: offset where the parameter name start in kp->name. - * Needed for built-in modules - * - * Fill in data into appropriate &pk->attr[], and create sysfs file. - */ -static __modinit int param_add_attribute(struct module *mod, - struct param_kobject *pk, - struct kernel_param *kp, - unsigned int skip) -{ - struct param_attribute *a; - int err; - - a = &pk->attr[pk->num_attributes]; - a->attr.name = (char *) &kp->name[skip]; - a->attr.owner = mod; - a->attr.mode = kp->perm; - a->param = kp; - err = sysfs_create_file(&pk->kobj, &a->attr); - if (!err) - pk->num_attributes++; - return err; -} - -/* - * param_sysfs_remove - remove sysfs support for one module or KBUILD_MODNAME - * @pk: struct param_kobject which is to be removed - * - * Called when an error in registration occurs or a module is removed - * from the system. - */ -static __modinit void param_sysfs_remove(struct param_kobject *pk) -{ - unsigned int i; - for (i = 0; i < pk->num_attributes; i++) - sysfs_remove_file(&pk->kobj,&pk->attr[i].attr); - - /* Calls param_kobj_release */ - kobject_unregister(&pk->kobj); -} - - /* * param_sysfs_setup - setup sysfs support for one module or KBUILD_MODNAME * @mk: struct module_kobject (contains parent kobject) @@ -492,15 +420,17 @@ static __modinit void param_sysfs_remove(struct param_kobject *pk) * in sysfs. A pointer to the param_kobject is returned on success, * NULL if there's no parameter to export, or other ERR_PTR(err). */ -static __modinit struct param_kobject * +static __modinit struct module_param_attrs * param_sysfs_setup(struct module_kobject *mk, struct kernel_param *kparam, unsigned int num_params, unsigned int name_skip) { - struct param_kobject *pk; + struct module_param_attrs *mp; unsigned int valid_attrs = 0; - unsigned int i; + unsigned int i, size[2]; + struct param_attribute *pattr; + struct attribute **gattr; int err; for (i=0; iattrs[0]), + sizeof(mp->grp.attrs[0])); + size[1] = (valid_attrs + 1) * sizeof(mp->grp.attrs[0]); - err = kobject_set_name(&pk->kobj, "parameters"); - if (err) - goto out; + mp = kmalloc(size[0] + size[1], GFP_KERNEL); + if (!mp) + return ERR_PTR(-ENOMEM); - pk->kobj.kset = ¶m_kset; - pk->kobj.parent = &mk->kobj; - err = kobject_register(&pk->kobj); - if (err) - goto out; + mp->grp.name = "parameters"; + mp->grp.attrs = (void *)mp + size[0]; + pattr = &mp->attrs[0]; + gattr = &mp->grp.attrs[0]; for (i = 0; i < num_params; i++) { - if (kparam[i].perm) { - err = param_add_attribute(mk->mod, pk, - &kparam[i], name_skip); - if (err) - goto out_unreg; + struct kernel_param *kp = &kparam[i]; + if (kp->perm) { + pattr->param = kp; + pattr->mattr.show = param_attr_show; + pattr->mattr.store = param_attr_store; + pattr->mattr.attr.name = (char *)&kp->name[name_skip]; + pattr->mattr.attr.owner = mk->mod; + pattr->mattr.attr.mode = kp->perm; + *(gattr++) = &(pattr++)->mattr.attr; } } + *gattr = NULL; - return pk; - -out_unreg: - param_sysfs_remove(pk); - return ERR_PTR(err); - -out: - kfree(pk); - return ERR_PTR(err); + if ((err = sysfs_create_group(&mk->kobj, &mp->grp))) { + kfree(mp); + return ERR_PTR(err); + } + return mp; } @@ -565,13 +492,13 @@ int module_param_sysfs_setup(struct module *mod, struct kernel_param *kparam, unsigned int num_params) { - struct param_kobject *pk; + struct module_param_attrs *mp; - pk = param_sysfs_setup(&mod->mkobj, kparam, num_params, 0); - if (IS_ERR(pk)) - return PTR_ERR(pk); + mp = param_sysfs_setup(&mod->mkobj, kparam, num_params, 0); + if (IS_ERR(mp)) + return PTR_ERR(mp); - mod->params_kobject = pk; + mod->param_attrs = mp; return 0; } @@ -584,9 +511,13 @@ int module_param_sysfs_setup(struct module *mod, */ void module_param_sysfs_remove(struct module *mod) { - if (mod->params_kobject) { - param_sysfs_remove(mod->params_kobject); - mod->params_kobject = NULL; + if (mod->param_attrs) { + sysfs_remove_group(&mod->mkobj.kobj, + &mod->param_attrs->grp); + /* We are positive that no one is using any param + * attrs at this point. Deallocate immediately. */ + kfree(mod->param_attrs); + mod->param_attrs = NULL; } } #endif @@ -724,8 +655,6 @@ decl_subsys(module, &module_ktype, NULL); static int __init param_sysfs_init(void) { subsystem_register(&module_subsys); - kobject_set_name(¶m_kset.kobj, "parameters"); - kset_init(¶m_kset); param_sysfs_builtin(); -- cgit v1.2.3 From 7d2b870243bef6003b4fd57bba8f9fc80894072f Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Fri, 7 Jan 2005 22:02:44 -0800 Subject: [PATCH] Remove EXPORT_SYMBOL_NOVERS Vadim Lobanov points out that EXPORT_SYMBOL_NOVERS is no longer used; in fact, SH still uses it, but once we fix that, the kernel is clean. Remove it. Signed-off-by: Rusty Russell Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds --- Makefile | 2 +- arch/sh/kernel/sh_ksyms.c | 4 ++-- include/linux/module.h | 5 ----- 3 files changed, 3 insertions(+), 8 deletions(-) (limited to 'include/linux/module.h') diff --git a/Makefile b/Makefile index 2338eecc5171..3c7e1afc4a5b 100644 --- a/Makefile +++ b/Makefile @@ -1168,7 +1168,7 @@ cmd_TAGS = $(all-sources) | etags - quiet_cmd_tags = MAKE $@ define cmd_tags rm -f $@; \ - CTAGSF=`ctags --version | grep -i exuberant >/dev/null && echo "-I __initdata,__exitdata,EXPORT_SYMBOL,EXPORT_SYMBOL_NOVERS"`; \ + CTAGSF=`ctags --version | grep -i exuberant >/dev/null && echo "-I __initdata,__exitdata,EXPORT_SYMBOL,EXPORT_SYMBOL_GPL"`; \ $(all-sources) | xargs ctags $$CTAGSF -a endef diff --git a/arch/sh/kernel/sh_ksyms.c b/arch/sh/kernel/sh_ksyms.c index 46969861091c..4f371f6470a3 100644 --- a/arch/sh/kernel/sh_ksyms.c +++ b/arch/sh/kernel/sh_ksyms.c @@ -89,7 +89,7 @@ EXPORT_SYMBOL(__const_udelay); EXPORT_SYMBOL(__div64_32); -#define DECLARE_EXPORT(name) extern void name(void);EXPORT_SYMBOL_NOVERS(name) +#define DECLARE_EXPORT(name) extern void name(void);EXPORT_SYMBOL(name) /* These symbols are generated by the compiler itself */ DECLARE_EXPORT(__udivsi3); @@ -100,7 +100,7 @@ DECLARE_EXPORT(__ashldi3); DECLARE_EXPORT(__lshrdi3); DECLARE_EXPORT(__movstr); -EXPORT_SYMBOL_NOVERS(strcpy); +EXPORT_SYMBOL(strcpy); #ifdef CONFIG_CPU_SH4 DECLARE_EXPORT(__movstr_i4_even); diff --git a/include/linux/module.h b/include/linux/module.h index c8dd7b8495c6..f49654225267 100644 --- a/include/linux/module.h +++ b/include/linux/module.h @@ -206,10 +206,6 @@ void *__symbol_get_gpl(const char *symbol); #endif -/* We don't mangle the actual symbol anymore, so no need for - * special casing EXPORT_SYMBOL_NOVERS. FIXME: Deprecated */ -#define EXPORT_SYMBOL_NOVERS(sym) EXPORT_SYMBOL(sym) - struct module_ref { local_t count; @@ -449,7 +445,6 @@ void module_remove_driver(struct device_driver *); #else /* !CONFIG_MODULES... */ #define EXPORT_SYMBOL(sym) #define EXPORT_SYMBOL_GPL(sym) -#define EXPORT_SYMBOL_NOVERS(sym) /* Given an address, look for it in the exception tables. */ static inline const struct exception_table_entry * -- cgit v1.2.3