From patchwork Sun Sep 27 15:55:34 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Glass X-Patchwork-Id: 1372098 X-Patchwork-Delegate: trini@ti.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de (client-ip=2a01:238:438b:c500:173d:9f52:ddab:ee01; helo=phobos.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=chromium.org header.i=@chromium.org header.a=rsa-sha256 header.s=google header.b=Z2z024UW; dkim-atps=neutral Received: from phobos.denx.de (phobos.denx.de [IPv6:2a01:238:438b:c500:173d:9f52:ddab:ee01]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4Bzqxb0PRbz9sPB for ; Mon, 28 Sep 2020 01:55:47 +1000 (AEST) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id EF19D82359; Sun, 27 Sep 2020 17:55:42 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (1024-bit key; unprotected) header.d=chromium.org header.i=@chromium.org header.b="Z2z024UW"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 4E93382339; Sun, 27 Sep 2020 17:55:41 +0200 (CEST) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de X-Spam-Level: X-Spam-Status: No, score=-3.2 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,SPF_HELO_NONE,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.2 Received: from mail-ot1-x342.google.com (mail-ot1-x342.google.com [IPv6:2607:f8b0:4864:20::342]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id 7370B82339 for ; Sun, 27 Sep 2020 17:55:38 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=sjg@chromium.org Received: by mail-ot1-x342.google.com with SMTP id o8so7196439otl.4 for ; Sun, 27 Sep 2020 08:55:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=TutUXZtmjHG1GI46lWbo3y33LgqSrACy29GIHEhLewo=; b=Z2z024UW5RFWbczWzlQNzWV5ixxgs8uwBt7cak+iV8iuFlYR8zg4l66OT8hBcDdDcI 6MuDf30sqPU4r91RwWYQbO5F6Q0aOyHQp7yb2F2aRYXDxyfuyp9pF5EJPoOSmj+uDSkd 1HdGwATaP/jfCNB2/W2vh8WedhK2bCkFWRhEI= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=TutUXZtmjHG1GI46lWbo3y33LgqSrACy29GIHEhLewo=; b=alDsmXIavuF0TpIZTzbxsWPzm1BXc0ol6UDyZQNyOEL+OAkMMSuInY4D6N5Y4owEcB 43M1jouEsOgBEHbeh+X3CcDcU8ZHeThY9TfM+hv3n5B7/uMSt1V6WevbdV9HR4X0vAxj ZbyYrXnQrD9IdnI0Ryj5EeidS1Ya4RHlVihvy8fEhhgHGjwQa2lUpjohK74LJVJlL3yR 7Ogxc9csaVDvRDD/qKBSNKR0blDzY9ZdpE/IqSP8wFSirMP7Xgvj3hBuHeQdfrstQBc9 ww/m3HcvuZwgduqZWGvOf+Urbjj+F0AKOZMcPHrMdrxnnj5S+K/Rv7O69eLNOsVKzMFi B/BA== X-Gm-Message-State: AOAM532G573ddphSCIXr1hslwOSvCPnyYa/1RNlWJR+zV2BCTujKhK1e YIeiDiDJKpcmYwGBVzwMaune0peC88NvMksm X-Google-Smtp-Source: ABdhPJxUXGgWkHYONsc/1HBatL/l1AAXZCZGpNdKJpbTmyhtBW/wtSSio+fbwj2opLtMdSgweQfxGA== X-Received: by 2002:a9d:3f06:: with SMTP id m6mr5893850otc.173.1601222136795; Sun, 27 Sep 2020 08:55:36 -0700 (PDT) Received: from localhost.localdomain (c-73-14-175-90.hsd1.co.comcast.net. [73.14.175.90]) by smtp.gmail.com with ESMTPSA id c14sm1472630ooi.9.2020.09.27.08.55.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 27 Sep 2020 08:55:36 -0700 (PDT) From: Simon Glass To: U-Boot Mailing List Cc: Simon Glass , Bin Meng , Heinrich Schuchardt , Patrick Delaunay , Sean Anderson , Wolfgang Wallner Subject: [PATCH v2] log: Allow LOG_DEBUG to always enable log output Date: Sun, 27 Sep 2020 09:55:34 -0600 Message-Id: <20200927155534.1560321-1-sjg@chromium.org> X-Mailer: git-send-email 2.28.0.681.g6f77f65b4e-goog MIME-Version: 1.0 X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.34 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.102.3 at phobos.denx.de X-Virus-Status: Clean At present if CONFIG_LOG enabled, putting LOG_DEBUG at the top of a file (before log.h inclusion) causes _log() to be executed for every log() call, regardless of the build- or run-time logging level. However there is no guarantee that the log record will actually be displayed. If the current log level is lower than LOGL_DEBUG then it will not be. Add a way to signal that the log record should always be displayed and update log_passes_filters() to handle this. Signed-off-by: Simon Glass --- Changes in v2: - Avoid clang-10 warning about converting an enum constant to a boolean common/log.c | 11 ++++++++--- doc/README.log | 10 ++++------ include/log.h | 17 +++++++++++++---- test/log/syslog_test.c | 2 +- 4 files changed, 26 insertions(+), 14 deletions(-) diff --git a/common/log.c b/common/log.c index 9a5f100da34..1680a2292a7 100644 --- a/common/log.c +++ b/common/log.c @@ -156,16 +156,20 @@ static bool log_has_file(const char *file_list, const char *file) static bool log_passes_filters(struct log_device *ldev, struct log_rec *rec) { struct log_filter *filt; + int level = rec->level & LOGL_LEVEL_MASK; + + if (rec->force_debug && level <= LOGL_DEBUG) + return true; /* If there are no filters, filter on the default log level */ if (list_empty(&ldev->filter_head)) { - if (rec->level > gd->default_log_level) + if (level > gd->default_log_level) return false; return true; } list_for_each_entry(filt, &ldev->filter_head, sibling_node) { - if (rec->level > filt->max_level) + if (level > filt->max_level) continue; if ((filt->flags & LOGFF_HAS_CAT) && !log_has_cat(filt->cat_list, rec->cat)) @@ -219,7 +223,8 @@ int _log(enum log_category_t cat, enum log_level_t level, const char *file, va_list args; rec.cat = cat; - rec.level = level; + rec.level = level & LOGL_LEVEL_MASK; + rec.force_debug = level & LOGL_FORCE_DEBUG; rec.file = file; rec.line = line; rec.func = func; diff --git a/doc/README.log b/doc/README.log index ba838824a99..554e99ca4ca 100644 --- a/doc/README.log +++ b/doc/README.log @@ -77,12 +77,10 @@ Sometimes it is useful to turn on logging just in one file. You can use this: #define LOG_DEBUG -to enable building in of all logging statements in a single file. Put it at -the top of the file, before any #includes. - -To actually get U-Boot to output this you need to also set the default logging -level - e.g. set CONFIG_LOG_DEFAULT_LEVEL to 7 (LOGL_DEBUG) or more. Otherwise -debug output is suppressed and will not be generated. +to enable building in of all debug logging statements in a single file. Put it +at the top of the file, before any #includes. This overrides any log-level +setting in U-Boot, including CONFIG_LOG_DEFAULT_LEVEL, but just for that file. +All logging statements, up to and including LOGL_DEBUG, will be displayed. Convenience functions diff --git a/include/log.h b/include/log.h index 2859ce1f2e7..de56b73a001 100644 --- a/include/log.h +++ b/include/log.h @@ -33,6 +33,9 @@ enum log_level_t { LOGL_COUNT, LOGL_NONE, + LOGL_LEVEL_MASK = 0xf, /* Mask for valid log levels */ + LOGL_FORCE_DEBUG = 0x10, /* Mask to force output due to LOG_DEBUG */ + LOGL_FIRST = LOGL_EMERG, LOGL_MAX = LOGL_DEBUG_IO, }; @@ -133,7 +136,7 @@ static inline int _log_nop(enum log_category_t cat, enum log_level_t level, #if CONFIG_IS_ENABLED(LOG) #ifdef LOG_DEBUG -#define _LOG_DEBUG 1 +#define _LOG_DEBUG LOGL_FORCE_DEBUG #else #define _LOG_DEBUG 0 #endif @@ -141,9 +144,10 @@ static inline int _log_nop(enum log_category_t cat, enum log_level_t level, /* Emit a log record if the level is less that the maximum */ #define log(_cat, _level, _fmt, _args...) ({ \ int _l = _level; \ - if (CONFIG_IS_ENABLED(LOG) && (_l <= _LOG_MAX_LEVEL || _LOG_DEBUG)) \ - _log((enum log_category_t)(_cat), _l, __FILE__, __LINE__, \ - __func__, \ + if (CONFIG_IS_ENABLED(LOG) && \ + (_LOG_DEBUG != 0 || _l <= _LOG_MAX_LEVEL)) \ + _log((enum log_category_t)(_cat), _l | _LOG_DEBUG, __FILE__, \ + __LINE__, __func__, \ pr_fmt(_fmt), ##_args); \ }) #else @@ -279,8 +283,12 @@ void __assert_fail(const char *assertion, const char *file, unsigned int line, * Memebers marked as 'allocated' are allocated (e.g. via strdup()) by the log * system. * + * TODO(sjg@chromium.org): Compress this struct down a bit to reduce space, e.g. + * a single u32 for cat, level, line and force_debug + * * @cat: Category, representing a uclass or part of U-Boot * @level: Severity level, less severe is higher + * @force_debug: Force output of debug * @file: Name of file where the log record was generated (not allocated) * @line: Line number where the log record was generated * @func: Function where the log record was generated (not allocated) @@ -289,6 +297,7 @@ void __assert_fail(const char *assertion, const char *file, unsigned int line, struct log_rec { enum log_category_t cat; enum log_level_t level; + bool force_debug; const char *file; int line; const char *func; diff --git a/test/log/syslog_test.c b/test/log/syslog_test.c index 120a8b2537b..df239d1e8d7 100644 --- a/test/log/syslog_test.c +++ b/test/log/syslog_test.c @@ -276,7 +276,7 @@ static int log_test_syslog_nodebug(struct unit_test_state *uts) sandbox_eth_set_tx_handler(0, sb_log_tx_handler); /* Used by ut_assert macros in the tx_handler */ sandbox_eth_set_priv(0, &env); - log_debug("testing %s\n", "log_debug"); + log_content("testing %s\n", "log_debug"); sandbox_eth_set_tx_handler(0, NULL); /* Check that the callback function was not called */ ut_assertnonnull(env.expected);