mirror of https://gitee.com/openkylin/linux.git
Merge git://git.kernel.org/pub/scm/linux/kernel/git/rusty/linux-2.6-for-linus
* git://git.kernel.org/pub/scm/linux/kernel/git/rusty/linux-2.6-for-linus: module: fix missing semicolons in MODULE macro usage param: add null statement to compiled-in module params module: fix linker error for MODULE_VERSION when !MODULE and CONFIG_SYSFS=n module: show version information for built-in modules in sysfs
This commit is contained in:
commit
5a05a6d7a5
|
@ -1644,7 +1644,7 @@ ks8695_cleanup(void)
|
||||||
module_init(ks8695_init);
|
module_init(ks8695_init);
|
||||||
module_exit(ks8695_cleanup);
|
module_exit(ks8695_cleanup);
|
||||||
|
|
||||||
MODULE_AUTHOR("Simtec Electronics")
|
MODULE_AUTHOR("Simtec Electronics");
|
||||||
MODULE_DESCRIPTION("Micrel KS8695 (Centaur) Ethernet driver");
|
MODULE_DESCRIPTION("Micrel KS8695 (Centaur) Ethernet driver");
|
||||||
MODULE_LICENSE("GPL");
|
MODULE_LICENSE("GPL");
|
||||||
MODULE_ALIAS("platform:" MODULENAME);
|
MODULE_ALIAS("platform:" MODULENAME);
|
||||||
|
|
|
@ -364,6 +364,13 @@
|
||||||
VMLINUX_SYMBOL(__start___param) = .; \
|
VMLINUX_SYMBOL(__start___param) = .; \
|
||||||
*(__param) \
|
*(__param) \
|
||||||
VMLINUX_SYMBOL(__stop___param) = .; \
|
VMLINUX_SYMBOL(__stop___param) = .; \
|
||||||
|
} \
|
||||||
|
\
|
||||||
|
/* Built-in module versions. */ \
|
||||||
|
__modver : AT(ADDR(__modver) - LOAD_OFFSET) { \
|
||||||
|
VMLINUX_SYMBOL(__start___modver) = .; \
|
||||||
|
*(__modver) \
|
||||||
|
VMLINUX_SYMBOL(__stop___modver) = .; \
|
||||||
. = ALIGN((align)); \
|
. = ALIGN((align)); \
|
||||||
VMLINUX_SYMBOL(__end_rodata) = .; \
|
VMLINUX_SYMBOL(__end_rodata) = .; \
|
||||||
} \
|
} \
|
||||||
|
|
|
@ -58,6 +58,12 @@ struct module_attribute {
|
||||||
void (*free)(struct module *);
|
void (*free)(struct module *);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct module_version_attribute {
|
||||||
|
struct module_attribute mattr;
|
||||||
|
const char *module_name;
|
||||||
|
const char *version;
|
||||||
|
};
|
||||||
|
|
||||||
struct module_kobject
|
struct module_kobject
|
||||||
{
|
{
|
||||||
struct kobject kobj;
|
struct kobject kobj;
|
||||||
|
@ -161,7 +167,28 @@ extern struct module __this_module;
|
||||||
Using this automatically adds a checksum of the .c files and the
|
Using this automatically adds a checksum of the .c files and the
|
||||||
local headers in "srcversion".
|
local headers in "srcversion".
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#if defined(MODULE) || !defined(CONFIG_SYSFS)
|
||||||
#define MODULE_VERSION(_version) MODULE_INFO(version, _version)
|
#define MODULE_VERSION(_version) MODULE_INFO(version, _version)
|
||||||
|
#else
|
||||||
|
#define MODULE_VERSION(_version) \
|
||||||
|
extern ssize_t __modver_version_show(struct module_attribute *, \
|
||||||
|
struct module *, char *); \
|
||||||
|
static struct module_version_attribute __modver_version_attr \
|
||||||
|
__used \
|
||||||
|
__attribute__ ((__section__ ("__modver"),aligned(sizeof(void *)))) \
|
||||||
|
= { \
|
||||||
|
.mattr = { \
|
||||||
|
.attr = { \
|
||||||
|
.name = "version", \
|
||||||
|
.mode = S_IRUGO, \
|
||||||
|
}, \
|
||||||
|
.show = __modver_version_show, \
|
||||||
|
}, \
|
||||||
|
.module_name = KBUILD_MODNAME, \
|
||||||
|
.version = _version, \
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Optional firmware file (or files) needed by the module
|
/* Optional firmware file (or files) needed by the module
|
||||||
* format is simply firmware file name. Multiple firmware
|
* format is simply firmware file name. Multiple firmware
|
||||||
|
|
|
@ -16,15 +16,17 @@
|
||||||
/* Chosen so that structs with an unsigned long line up. */
|
/* Chosen so that structs with an unsigned long line up. */
|
||||||
#define MAX_PARAM_PREFIX_LEN (64 - sizeof(unsigned long))
|
#define MAX_PARAM_PREFIX_LEN (64 - sizeof(unsigned long))
|
||||||
|
|
||||||
#ifdef MODULE
|
|
||||||
#define ___module_cat(a,b) __mod_ ## a ## b
|
#define ___module_cat(a,b) __mod_ ## a ## b
|
||||||
#define __module_cat(a,b) ___module_cat(a,b)
|
#define __module_cat(a,b) ___module_cat(a,b)
|
||||||
|
#ifdef MODULE
|
||||||
#define __MODULE_INFO(tag, name, info) \
|
#define __MODULE_INFO(tag, name, info) \
|
||||||
static const char __module_cat(name,__LINE__)[] \
|
static const char __module_cat(name,__LINE__)[] \
|
||||||
__used __attribute__((section(".modinfo"), unused, aligned(1))) \
|
__used __attribute__((section(".modinfo"), unused, aligned(1))) \
|
||||||
= __stringify(tag) "=" info
|
= __stringify(tag) "=" info
|
||||||
#else /* !MODULE */
|
#else /* !MODULE */
|
||||||
#define __MODULE_INFO(tag, name, info)
|
/* This struct is here for syntactic coherency, it is not used */
|
||||||
|
#define __MODULE_INFO(tag, name, info) \
|
||||||
|
struct __module_cat(name,__LINE__) {}
|
||||||
#endif
|
#endif
|
||||||
#define __MODULE_PARM_TYPE(name, _type) \
|
#define __MODULE_PARM_TYPE(name, _type) \
|
||||||
__MODULE_INFO(parmtype, name##type, #name ":" _type)
|
__MODULE_INFO(parmtype, name##type, #name ":" _type)
|
||||||
|
|
|
@ -719,9 +719,7 @@ void destroy_params(const struct kernel_param *params, unsigned num)
|
||||||
params[i].ops->free(params[i].arg);
|
params[i].ops->free(params[i].arg);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __init kernel_add_sysfs_param(const char *name,
|
static struct module_kobject * __init locate_module_kobject(const char *name)
|
||||||
struct kernel_param *kparam,
|
|
||||||
unsigned int name_skip)
|
|
||||||
{
|
{
|
||||||
struct module_kobject *mk;
|
struct module_kobject *mk;
|
||||||
struct kobject *kobj;
|
struct kobject *kobj;
|
||||||
|
@ -729,10 +727,7 @@ static void __init kernel_add_sysfs_param(const char *name,
|
||||||
|
|
||||||
kobj = kset_find_obj(module_kset, name);
|
kobj = kset_find_obj(module_kset, name);
|
||||||
if (kobj) {
|
if (kobj) {
|
||||||
/* We already have one. Remove params so we can add more. */
|
|
||||||
mk = to_module_kobject(kobj);
|
mk = to_module_kobject(kobj);
|
||||||
/* We need to remove it before adding parameters. */
|
|
||||||
sysfs_remove_group(&mk->kobj, &mk->mp->grp);
|
|
||||||
} else {
|
} else {
|
||||||
mk = kzalloc(sizeof(struct module_kobject), GFP_KERNEL);
|
mk = kzalloc(sizeof(struct module_kobject), GFP_KERNEL);
|
||||||
BUG_ON(!mk);
|
BUG_ON(!mk);
|
||||||
|
@ -743,15 +738,36 @@ static void __init kernel_add_sysfs_param(const char *name,
|
||||||
"%s", name);
|
"%s", name);
|
||||||
if (err) {
|
if (err) {
|
||||||
kobject_put(&mk->kobj);
|
kobject_put(&mk->kobj);
|
||||||
printk(KERN_ERR "Module '%s' failed add to sysfs, "
|
printk(KERN_ERR
|
||||||
"error number %d\n", name, err);
|
"Module '%s' failed add to sysfs, error number %d\n",
|
||||||
printk(KERN_ERR "The system will be unstable now.\n");
|
name, err);
|
||||||
return;
|
printk(KERN_ERR
|
||||||
|
"The system will be unstable now.\n");
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
/* So that exit path is even. */
|
|
||||||
|
/* So that we hold reference in both cases. */
|
||||||
kobject_get(&mk->kobj);
|
kobject_get(&mk->kobj);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return mk;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void __init kernel_add_sysfs_param(const char *name,
|
||||||
|
struct kernel_param *kparam,
|
||||||
|
unsigned int name_skip)
|
||||||
|
{
|
||||||
|
struct module_kobject *mk;
|
||||||
|
int err;
|
||||||
|
|
||||||
|
mk = locate_module_kobject(name);
|
||||||
|
if (!mk)
|
||||||
|
return;
|
||||||
|
|
||||||
|
/* We need to remove old parameters before adding more. */
|
||||||
|
if (mk->mp)
|
||||||
|
sysfs_remove_group(&mk->kobj, &mk->mp->grp);
|
||||||
|
|
||||||
/* These should not fail at boot. */
|
/* These should not fail at boot. */
|
||||||
err = add_sysfs_param(mk, kparam, kparam->name + name_skip);
|
err = add_sysfs_param(mk, kparam, kparam->name + name_skip);
|
||||||
BUG_ON(err);
|
BUG_ON(err);
|
||||||
|
@ -796,6 +812,32 @@ static void __init param_sysfs_builtin(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ssize_t __modver_version_show(struct module_attribute *mattr,
|
||||||
|
struct module *mod, char *buf)
|
||||||
|
{
|
||||||
|
struct module_version_attribute *vattr =
|
||||||
|
container_of(mattr, struct module_version_attribute, mattr);
|
||||||
|
|
||||||
|
return sprintf(buf, "%s\n", vattr->version);
|
||||||
|
}
|
||||||
|
|
||||||
|
extern struct module_version_attribute __start___modver[], __stop___modver[];
|
||||||
|
|
||||||
|
static void __init version_sysfs_builtin(void)
|
||||||
|
{
|
||||||
|
const struct module_version_attribute *vattr;
|
||||||
|
struct module_kobject *mk;
|
||||||
|
int err;
|
||||||
|
|
||||||
|
for (vattr = __start___modver; vattr < __stop___modver; vattr++) {
|
||||||
|
mk = locate_module_kobject(vattr->module_name);
|
||||||
|
if (mk) {
|
||||||
|
err = sysfs_create_file(&mk->kobj, &vattr->mattr.attr);
|
||||||
|
kobject_uevent(&mk->kobj, KOBJ_ADD);
|
||||||
|
kobject_put(&mk->kobj);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* module-related sysfs stuff */
|
/* module-related sysfs stuff */
|
||||||
|
|
||||||
|
@ -875,6 +917,7 @@ static int __init param_sysfs_init(void)
|
||||||
}
|
}
|
||||||
module_sysfs_initialized = 1;
|
module_sysfs_initialized = 1;
|
||||||
|
|
||||||
|
version_sysfs_builtin();
|
||||||
param_sysfs_builtin();
|
param_sysfs_builtin();
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -428,7 +428,7 @@ static void __exit dsa_cleanup_module(void)
|
||||||
}
|
}
|
||||||
module_exit(dsa_cleanup_module);
|
module_exit(dsa_cleanup_module);
|
||||||
|
|
||||||
MODULE_AUTHOR("Lennert Buytenhek <buytenh@wantstofly.org>")
|
MODULE_AUTHOR("Lennert Buytenhek <buytenh@wantstofly.org>");
|
||||||
MODULE_DESCRIPTION("Driver for Distributed Switch Architecture switch chips");
|
MODULE_DESCRIPTION("Driver for Distributed Switch Architecture switch chips");
|
||||||
MODULE_LICENSE("GPL");
|
MODULE_LICENSE("GPL");
|
||||||
MODULE_ALIAS("platform:dsa");
|
MODULE_ALIAS("platform:dsa");
|
||||||
|
|
Loading…
Reference in New Issue