Commit cca3e707 authored by Kay Sievers's avatar Kay Sievers Committed by Rusty Russell

modules: sysfs - export: taint, coresize, initsize

Recent tools do not want to use /proc to retrieve module information. A few
values are currently missing from sysfs to replace the information available
in /proc/modules.

This adds /sys/module/*/{coresize,initsize,taint} attributes.

TAINT_PROPRIETARY_MODULE (P) and TAINT_OOT_MODULE (O) flags are both always
shown now, and do no longer exclude each other, also in /proc/modules.

Replace the open-coded sysfs attribute initializers with the __ATTR() macro.

Add the new attributes to Documentation/ABI.

Cc: Lucas De Marchi <lucas.demarchi@profusion.mobi>
Signed-off-by: default avatarKay Sievers <kay.sievers@vrfy.org>
Signed-off-by: default avatarRusty Russell <rusty@rustcorp.com.au>
parent 8487bfd9
...@@ -33,3 +33,19 @@ Description: Maximum time allowed for periodic transfers per microframe (μs) ...@@ -33,3 +33,19 @@ Description: Maximum time allowed for periodic transfers per microframe (μs)
Beware, non-standard modes are usually not thoroughly tested by Beware, non-standard modes are usually not thoroughly tested by
hardware designers, and the hardware can malfunction when this hardware designers, and the hardware can malfunction when this
setting differ from default 100. setting differ from default 100.
What: /sys/module/*/{coresize,initsize}
Date: Jan 2012
KernelVersion:»·3.3
Contact: Kay Sievers <kay.sievers@vrfy.org>
Description: Module size in bytes.
What: /sys/module/*/taint
Date: Jan 2012
KernelVersion:»·3.3
Contact: Kay Sievers <kay.sievers@vrfy.org>
Description: Module taint flags:
P - proprietary module
O - out-of-tree module
F - force-loaded module
C - staging driver module
...@@ -842,6 +842,26 @@ SYSCALL_DEFINE2(delete_module, const char __user *, name_user, ...@@ -842,6 +842,26 @@ SYSCALL_DEFINE2(delete_module, const char __user *, name_user,
return ret; return ret;
} }
static size_t module_flags_taint(struct module *mod, char *buf)
{
size_t l = 0;
if (mod->taints & (1 << TAINT_PROPRIETARY_MODULE))
buf[l++] = 'P';
if (mod->taints & (1 << TAINT_OOT_MODULE))
buf[l++] = 'O';
if (mod->taints & (1 << TAINT_FORCED_MODULE))
buf[l++] = 'F';
if (mod->taints & (1 << TAINT_CRAP))
buf[l++] = 'C';
/*
* TAINT_FORCED_RMMOD: could be added.
* TAINT_UNSAFE_SMP, TAINT_MACHINE_CHECK, TAINT_BAD_PAGE don't
* apply to modules.
*/
return l;
}
static inline void print_unload_info(struct seq_file *m, struct module *mod) static inline void print_unload_info(struct seq_file *m, struct module *mod)
{ {
struct module_use *use; struct module_use *use;
...@@ -900,10 +920,8 @@ static ssize_t show_refcnt(struct module_attribute *mattr, ...@@ -900,10 +920,8 @@ static ssize_t show_refcnt(struct module_attribute *mattr,
return sprintf(buffer, "%lu\n", module_refcount(mk->mod)); return sprintf(buffer, "%lu\n", module_refcount(mk->mod));
} }
static struct module_attribute refcnt = { static struct module_attribute modinfo_refcnt =
.attr = { .name = "refcnt", .mode = 0444 }, __ATTR(refcnt, 0444, show_refcnt, NULL);
.show = show_refcnt,
};
void module_put(struct module *module) void module_put(struct module *module)
{ {
...@@ -963,10 +981,8 @@ static ssize_t show_initstate(struct module_attribute *mattr, ...@@ -963,10 +981,8 @@ static ssize_t show_initstate(struct module_attribute *mattr,
return sprintf(buffer, "%s\n", state); return sprintf(buffer, "%s\n", state);
} }
static struct module_attribute initstate = { static struct module_attribute modinfo_initstate =
.attr = { .name = "initstate", .mode = 0444 }, __ATTR(initstate, 0444, show_initstate, NULL);
.show = show_initstate,
};
static ssize_t store_uevent(struct module_attribute *mattr, static ssize_t store_uevent(struct module_attribute *mattr,
struct module_kobject *mk, struct module_kobject *mk,
...@@ -979,18 +995,50 @@ static ssize_t store_uevent(struct module_attribute *mattr, ...@@ -979,18 +995,50 @@ static ssize_t store_uevent(struct module_attribute *mattr,
return count; return count;
} }
struct module_attribute module_uevent = { struct module_attribute module_uevent =
.attr = { .name = "uevent", .mode = 0200 }, __ATTR(uevent, 0200, NULL, store_uevent);
.store = store_uevent,
}; static ssize_t show_coresize(struct module_attribute *mattr,
struct module_kobject *mk, char *buffer)
{
return sprintf(buffer, "%u\n", mk->mod->core_size);
}
static struct module_attribute modinfo_coresize =
__ATTR(coresize, 0444, show_coresize, NULL);
static ssize_t show_initsize(struct module_attribute *mattr,
struct module_kobject *mk, char *buffer)
{
return sprintf(buffer, "%u\n", mk->mod->init_size);
}
static struct module_attribute modinfo_initsize =
__ATTR(initsize, 0444, show_initsize, NULL);
static ssize_t show_taint(struct module_attribute *mattr,
struct module_kobject *mk, char *buffer)
{
size_t l;
l = module_flags_taint(mk->mod, buffer);
buffer[l++] = '\n';
return l;
}
static struct module_attribute modinfo_taint =
__ATTR(taint, 0444, show_taint, NULL);
static struct module_attribute *modinfo_attrs[] = { static struct module_attribute *modinfo_attrs[] = {
&module_uevent,
&modinfo_version, &modinfo_version,
&modinfo_srcversion, &modinfo_srcversion,
&initstate, &modinfo_initstate,
&module_uevent, &modinfo_coresize,
&modinfo_initsize,
&modinfo_taint,
#ifdef CONFIG_MODULE_UNLOAD #ifdef CONFIG_MODULE_UNLOAD
&refcnt, &modinfo_refcnt,
#endif #endif
NULL, NULL,
}; };
...@@ -3236,20 +3284,7 @@ static char *module_flags(struct module *mod, char *buf) ...@@ -3236,20 +3284,7 @@ static char *module_flags(struct module *mod, char *buf)
mod->state == MODULE_STATE_GOING || mod->state == MODULE_STATE_GOING ||
mod->state == MODULE_STATE_COMING) { mod->state == MODULE_STATE_COMING) {
buf[bx++] = '('; buf[bx++] = '(';
if (mod->taints & (1 << TAINT_PROPRIETARY_MODULE)) bx += module_flags_taint(mod, buf + bx);
buf[bx++] = 'P';
else if (mod->taints & (1 << TAINT_OOT_MODULE))
buf[bx++] = 'O';
if (mod->taints & (1 << TAINT_FORCED_MODULE))
buf[bx++] = 'F';
if (mod->taints & (1 << TAINT_CRAP))
buf[bx++] = 'C';
/*
* TAINT_FORCED_RMMOD: could be added.
* TAINT_UNSAFE_SMP, TAINT_MACHINE_CHECK, TAINT_BAD_PAGE don't
* apply to modules.
*/
/* Show a - for module-is-being-unloaded */ /* Show a - for module-is-being-unloaded */
if (mod->state == MODULE_STATE_GOING) if (mod->state == MODULE_STATE_GOING)
buf[bx++] = '-'; buf[bx++] = '-';
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment