Commit 93c95e52 authored by Jessica Yu's avatar Jessica Yu Committed by Masahiro Yamada

modpost: rework and consolidate logging interface

Rework modpost's logging interface by consolidating merror(), warn(), and
fatal() to use a single function, modpost_log(). Introduce different
logging levels (WARN, ERROR, FATAL) as well. The purpose of this cleanup is
to reduce code duplication when deciding whether or not to warn or error
out based on a condition.
Signed-off-by: default avatarJessica Yu <jeyu@kernel.org>
Signed-off-by: default avatarMasahiro Yamada <masahiroy@kernel.org>
parent 9dffecc1
...@@ -51,41 +51,33 @@ enum export { ...@@ -51,41 +51,33 @@ enum export {
#define MODULE_NAME_LEN (64 - sizeof(Elf_Addr)) #define MODULE_NAME_LEN (64 - sizeof(Elf_Addr))
#define PRINTF __attribute__ ((format (printf, 1, 2))) void __attribute__((format(printf, 2, 3)))
modpost_log(enum loglevel loglevel, const char *fmt, ...)
PRINTF void fatal(const char *fmt, ...)
{ {
va_list arglist; va_list arglist;
fprintf(stderr, "FATAL: "); switch (loglevel) {
case LOG_WARN:
va_start(arglist, fmt); fprintf(stderr, "WARNING: ");
vfprintf(stderr, fmt, arglist); break;
va_end(arglist); case LOG_ERROR:
fprintf(stderr, "ERROR: ");
exit(1); break;
} case LOG_FATAL:
fprintf(stderr, "FATAL: ");
PRINTF void warn(const char *fmt, ...) break;
{ default: /* invalid loglevel, ignore */
va_list arglist; break;
}
fprintf(stderr, "WARNING: "); fprintf(stderr, "modpost: ");
va_start(arglist, fmt); va_start(arglist, fmt);
vfprintf(stderr, fmt, arglist); vfprintf(stderr, fmt, arglist);
va_end(arglist); va_end(arglist);
}
PRINTF void merror(const char *fmt, ...)
{
va_list arglist;
fprintf(stderr, "ERROR: ");
va_start(arglist, fmt); if (loglevel == LOG_FATAL)
vfprintf(stderr, fmt, arglist); exit(1);
va_end(arglist);
} }
static inline bool strends(const char *str, const char *postfix) static inline bool strends(const char *str, const char *postfix)
...@@ -113,7 +105,7 @@ static int is_vmlinux(const char *modname) ...@@ -113,7 +105,7 @@ static int is_vmlinux(const char *modname)
void *do_nofail(void *ptr, const char *expr) void *do_nofail(void *ptr, const char *expr)
{ {
if (!ptr) if (!ptr)
fatal("modpost: Memory allocation failure: %s.\n", expr); fatal("Memory allocation failure: %s.\n", expr);
return ptr; return ptr;
} }
...@@ -2021,7 +2013,7 @@ static void read_symbols(const char *modname) ...@@ -2021,7 +2013,7 @@ static void read_symbols(const char *modname)
license = get_modinfo(&info, "license"); license = get_modinfo(&info, "license");
if (!license && !is_vmlinux(modname)) if (!license && !is_vmlinux(modname))
warn("modpost: missing MODULE_LICENSE() in %s\n" warn("missing MODULE_LICENSE() in %s\n"
"see include/linux/module.h for " "see include/linux/module.h for "
"more information\n", modname); "more information\n", modname);
while (license) { while (license) {
...@@ -2152,15 +2144,15 @@ static void check_for_gpl_usage(enum export exp, const char *m, const char *s) ...@@ -2152,15 +2144,15 @@ static void check_for_gpl_usage(enum export exp, const char *m, const char *s)
switch (exp) { switch (exp) {
case export_gpl: case export_gpl:
fatal("modpost: GPL-incompatible module %s%s " fatal("GPL-incompatible module %s%s "
"uses GPL-only symbol '%s'\n", m, e, s); "uses GPL-only symbol '%s'\n", m, e, s);
break; break;
case export_unused_gpl: case export_unused_gpl:
fatal("modpost: GPL-incompatible module %s%s " fatal("GPL-incompatible module %s%s "
"uses GPL-only symbol marked UNUSED '%s'\n", m, e, s); "uses GPL-only symbol marked UNUSED '%s'\n", m, e, s);
break; break;
case export_gpl_future: case export_gpl_future:
warn("modpost: GPL-incompatible module %s%s " warn("GPL-incompatible module %s%s "
"uses future GPL-only symbol '%s'\n", m, e, s); "uses future GPL-only symbol '%s'\n", m, e, s);
break; break;
case export_plain: case export_plain:
...@@ -2178,7 +2170,7 @@ static void check_for_unused(enum export exp, const char *m, const char *s) ...@@ -2178,7 +2170,7 @@ static void check_for_unused(enum export exp, const char *m, const char *s)
switch (exp) { switch (exp) {
case export_unused: case export_unused:
case export_unused_gpl: case export_unused_gpl:
warn("modpost: module %s%s " warn("module %s%s "
"uses symbol '%s' marked UNUSED\n", m, e, s); "uses symbol '%s' marked UNUSED\n", m, e, s);
break; break;
default: default:
...@@ -2197,14 +2189,11 @@ static int check_exports(struct module *mod) ...@@ -2197,14 +2189,11 @@ static int check_exports(struct module *mod)
exp = find_symbol(s->name); exp = find_symbol(s->name);
if (!exp || exp->module == mod) { if (!exp || exp->module == mod) {
if (have_vmlinux && !s->weak) { if (have_vmlinux && !s->weak) {
if (warn_unresolved) { modpost_log(warn_unresolved ? LOG_WARN : LOG_ERROR,
warn("\"%s\" [%s.ko] undefined!\n", "\"%s\" [%s.ko] undefined!\n",
s->name, mod->name); s->name, mod->name);
} else { if (!warn_unresolved)
merror("\"%s\" [%s.ko] undefined!\n",
s->name, mod->name);
err = 1; err = 1;
}
} }
continue; continue;
} }
...@@ -2653,7 +2642,7 @@ int main(int argc, char **argv) ...@@ -2653,7 +2642,7 @@ int main(int argc, char **argv)
if (dump_write) if (dump_write)
write_dump(dump_write); write_dump(dump_write);
if (sec_mismatch_count && sec_mismatch_fatal) if (sec_mismatch_count && sec_mismatch_fatal)
fatal("modpost: Section mismatches detected.\n" fatal("Section mismatches detected.\n"
"Set CONFIG_SECTION_MISMATCH_WARN_ONLY=y to allow them.\n"); "Set CONFIG_SECTION_MISMATCH_WARN_ONLY=y to allow them.\n");
for (n = 0; n < SYMBOL_HASH_SIZE; n++) { for (n = 0; n < SYMBOL_HASH_SIZE; n++) {
struct symbol *s; struct symbol *s;
......
...@@ -198,6 +198,14 @@ void *grab_file(const char *filename, unsigned long *size); ...@@ -198,6 +198,14 @@ void *grab_file(const char *filename, unsigned long *size);
char* get_next_line(unsigned long *pos, void *file, unsigned long size); char* get_next_line(unsigned long *pos, void *file, unsigned long size);
void release_file(void *file, unsigned long size); void release_file(void *file, unsigned long size);
void fatal(const char *fmt, ...); enum loglevel {
void warn(const char *fmt, ...); LOG_WARN,
void merror(const char *fmt, ...); LOG_ERROR,
LOG_FATAL
};
void modpost_log(enum loglevel loglevel, const char *fmt, ...);
#define warn(fmt, args...) modpost_log(LOG_WARN, fmt, ##args)
#define merror(fmt, args...) modpost_log(LOG_ERROR, fmt, ##args)
#define fatal(fmt, args...) modpost_log(LOG_FATAL, fmt, ##args)
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