Received: by 2002:a25:1506:0:0:0:0:0 with SMTP id 6csp3924631ybv; Tue, 25 Feb 2020 09:45:07 -0800 (PST) X-Google-Smtp-Source: APXvYqzykI0/9a+/s824s3u8c1/org9caqgenw+aDC7MJzcbaxLtvyOtrBKwoyzayxScjY9unkf1 X-Received: by 2002:a05:6830:12d5:: with SMTP id a21mr46843257otq.296.1582652707809; Tue, 25 Feb 2020 09:45:07 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1582652707; cv=none; d=google.com; s=arc-20160816; b=FbYMAilQ63UXBm2UByTwsfaoMjaAc8Dw8YGN+n0DaCIHfjbNGzbIn9OBIeIrrlRr9J QJwI9Dtwww3zys8BrWBWZXVIr62guLaZ8OpzeSejHvqkoB3uVI0Oudz/mOz3d50HHakF Y4G0IEqwycz650qKGEODEu/5S4z/GDIrngsUGpZp7i3I4i1nm4cf+xpiZlo04gcM173K mSpGIr7IAfsF4yGuYyj6FgZVqn7qKENvOi3oq7Fz92QLcHv6r3LBsIPe5fgyVL9O5GFM +ADZ4lD/Ok62u5yQTMGozcS8YSk9cKegraZr4lhUpJaET89yMea/1Dvv3yZ+nf6S6SYI lDQA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:message-id:date:subject:cc:to:from :dkim-signature; bh=AuGhT2s1AWzXa8g+op0zJo1+0ndZGxnIZJd8xYSeVKI=; b=Neb7f6+E9Z4kv4y0Av1SgLDxYcfbAJIET9na2j1C1XBTiu9FK1eokKWfdPLPlhCKB3 c0XFM8VyIFWbdogloce6v5GgJeaBxp/QBKX0i2eXfxFMvMqF9kWm0DfcMFwz1kMp9ge1 wC7NLaxLpZfLGVoKBKnnKXw1R3sbujeVC0yl12on1u4zz4uOdOohCxUFI1shzIcf5CTr IDx8HxhxC+01vrlGRjZvO3NICZ4fpbG29IJA93mq2u/547BZQHX5Nq2ESLYoL6E3TEXh bHYDgbZVkvppM7Pql52ZQhKpONSbbno3zRrcg0/OnlxgCvgQqQwO/KkpWmn2AlYHPFjE sRlQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=zrGFrm97; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id v13si8254006otp.273.2020.02.25.09.44.55; Tue, 25 Feb 2020 09:45:07 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=zrGFrm97; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730278AbgBYRfc (ORCPT + 99 others); Tue, 25 Feb 2020 12:35:32 -0500 Received: from mail.kernel.org ([198.145.29.99]:41424 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728515AbgBYRfc (ORCPT ); Tue, 25 Feb 2020 12:35:32 -0500 Received: from linux-8ccs.suse.de (p5B2812F9.dip0.t-ipconnect.de [91.40.18.249]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id A7CD02084E; Tue, 25 Feb 2020 17:35:30 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1582652131; bh=gj1yIfg8bcja5Jkwg4ZUG4M7lskF6SDye1QbQQOdm+4=; h=From:To:Cc:Subject:Date:From; b=zrGFrm97ucudbeiQxg0re0H2jNOyDt1hmnAWDNn0eIXLYzKNac2SxervJj4G/lpR+ 5v70iKFlJOgXwUXDve/vqiiuJKf7VCgxhMX1p/8m5X6tIFSl8O+X/C4Xl/ntbe0Yv6 mubokDoioExtElDIJyZ9nNXN7nESif44+8UvFJYc= From: Jessica Yu To: Masahiro Yamada , Matthias Maennich Cc: linux-kernel@vger.kernel.org, Jessica Yu Subject: [PATCH 1/2] modpost: rework and consolidate logging interface Date: Tue, 25 Feb 2020 18:35:25 +0100 Message-Id: <20200225173526.9617-1-jeyu@kernel.org> X-Mailer: git-send-email 2.16.4 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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 as a conditional warn (warn_unless()). The conditional warn is useful in determining whether to use merror() or warn() based on a condition. This reduces code duplication overall. Signed-off-by: Jessica Yu --- Hi, This patch was added in response to the code duplication comments in the first version of "modpost: return error if module is missing ns imports and MODULE_ALLOW_MISSING_NAMESPACE_IMPORTS=n" [1] [1] See 20200214143709.6490-1-jeyu@kernel.org scripts/mod/modpost.c | 69 ++++++++++++++++++++++++--------------------------- scripts/mod/modpost.h | 22 +++++++++++++--- 2 files changed, 51 insertions(+), 40 deletions(-) diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c index 7edfdb2f4497..e2805fbeb99f 100644 --- a/scripts/mod/modpost.c +++ b/scripts/mod/modpost.c @@ -51,41 +51,39 @@ enum export { #define MODULE_NAME_LEN (64 - sizeof(Elf_Addr)) -#define PRINTF __attribute__ ((format (printf, 1, 2))) +#define PRINTF __attribute__ ((format (printf, 2, 3))) -PRINTF void fatal(const char *fmt, ...) +PRINTF void modpost_log(enum loglevel loglevel, const char *fmt, ...) { + char *level = NULL; va_list arglist; - fprintf(stderr, "FATAL: "); + switch(loglevel) { + case(LOG_WARN): + level = "WARNING: "; + break; + case(LOG_ERROR): + level = "ERROR: "; + break; + case(LOG_FATAL): + level = "FATAL: "; + break; + default: /* invalid loglevel, ignore */ + break; + } - va_start(arglist, fmt); - vfprintf(stderr, fmt, arglist); - va_end(arglist); + if (level) + fprintf(stderr, level); - exit(1); -} - -PRINTF void warn(const char *fmt, ...) -{ - va_list arglist; - - fprintf(stderr, "WARNING: "); + fprintf(stderr, "modpost: "); va_start(arglist, fmt); vfprintf(stderr, fmt, arglist); va_end(arglist); -} - -PRINTF void merror(const char *fmt, ...) -{ - va_list arglist; - fprintf(stderr, "ERROR: "); + if (loglevel == LOG_FATAL) + exit(1); - va_start(arglist, fmt); - vfprintf(stderr, fmt, arglist); - va_end(arglist); } static inline bool strends(const char *str, const char *postfix) @@ -113,7 +111,7 @@ static int is_vmlinux(const char *modname) void *do_nofail(void *ptr, const char *expr) { if (!ptr) - fatal("modpost: Memory allocation failure: %s.\n", expr); + fatal("Memory allocation failure: %s.\n", expr); return ptr; } @@ -2021,7 +2019,7 @@ static void read_symbols(const char *modname) license = get_modinfo(&info, "license"); 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 " "more information\n", modname); while (license) { @@ -2152,15 +2150,15 @@ static void check_for_gpl_usage(enum export exp, const char *m, const char *s) switch (exp) { 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); break; 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); break; 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); break; case export_plain: @@ -2178,7 +2176,7 @@ static void check_for_unused(enum export exp, const char *m, const char *s) switch (exp) { case export_unused: case export_unused_gpl: - warn("modpost: module %s%s " + warn("module %s%s " "uses symbol '%s' marked UNUSED\n", m, e, s); break; default: @@ -2197,14 +2195,11 @@ static int check_exports(struct module *mod) exp = find_symbol(s->name); if (!exp || exp->module == mod) { if (have_vmlinux && !s->weak) { - if (warn_unresolved) { - warn("\"%s\" [%s.ko] undefined!\n", - s->name, mod->name); - } else { - merror("\"%s\" [%s.ko] undefined!\n", - s->name, mod->name); + warn_unless(!warn_unresolved, + "\"%s\" [%s.ko] undefined!\n", + s->name, mod->name); + if (!warn_unresolved) err = 1; - } } continue; } @@ -2653,7 +2648,7 @@ int main(int argc, char **argv) if (dump_write) write_dump(dump_write); 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"); for (n = 0; n < SYMBOL_HASH_SIZE; n++) { struct symbol *s; diff --git a/scripts/mod/modpost.h b/scripts/mod/modpost.h index 64a82d2d85f6..631d07714f7a 100644 --- a/scripts/mod/modpost.h +++ b/scripts/mod/modpost.h @@ -198,6 +198,22 @@ void *grab_file(const char *filename, unsigned long *size); char* get_next_line(unsigned long *pos, void *file, unsigned long size); void release_file(void *file, unsigned long size); -void fatal(const char *fmt, ...); -void warn(const char *fmt, ...); -void merror(const char *fmt, ...); +enum loglevel { + LOG_WARN, + 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) +/* Warn unless condition is true, then use merror() */ +#define warn_unless(condition, fmt, args...) \ +do { \ + if (condition) \ + merror(fmt, ##args); \ + else \ + warn(fmt, ##args); \ +} while (0) -- 2.16.4