Re: [PATCH v2 2/3] log: allow for message continuation

2020-10-28 Thread Tom Rini
On Sat, Oct 17, 2020 at 02:31:58PM +0200, Heinrich Schuchardt wrote:

> Some drivers use macro pr_cont() for continuing a message sent via printk.
> Hence if we want to convert printk messaging to using the logging system,
> we must support continuation of log messages too.
> 
> As pr_cont() does not provide a message level we need a means of
> remembering the last log level.
> 
> With the patch a pseudo log level LOGL_CONT as well as a pseudo log
> category LOGC_CONT are introduced. Using these results in the application
> of the same log level and category as in the previous log message.
> 
> Signed-off-by: Heinrich Schuchardt 
> Reviewed-by: Simon Glass 

Applied to u-boot/master, thanks!

-- 
Tom


signature.asc
Description: PGP signature


Re: [PATCH v2 2/3] log: allow for message continuation

2020-10-26 Thread Simon Glass
On Sat, 17 Oct 2020 at 06:32, Heinrich Schuchardt  wrote:
>
> Some drivers use macro pr_cont() for continuing a message sent via printk.
> Hence if we want to convert printk messaging to using the logging system,
> we must support continuation of log messages too.
>
> As pr_cont() does not provide a message level we need a means of
> remembering the last log level.
>
> With the patch a pseudo log level LOGL_CONT as well as a pseudo log
> category LOGC_CONT are introduced. Using these results in the application
> of the same log level and category as in the previous log message.
>
> Signed-off-by: Heinrich Schuchardt 
> ---
> v2:
> replace static variables by global data
> ---
>  common/log.c  | 23 ++-
>  doc/develop/logging.rst   |  6 ++
>  include/asm-generic/global_data.h | 12 
>  include/log.h |  2 ++
>  4 files changed, 38 insertions(+), 5 deletions(-)
>

Reviewed-by: Simon Glass 


[PATCH v2 2/3] log: allow for message continuation

2020-10-17 Thread Heinrich Schuchardt
Some drivers use macro pr_cont() for continuing a message sent via printk.
Hence if we want to convert printk messaging to using the logging system,
we must support continuation of log messages too.

As pr_cont() does not provide a message level we need a means of
remembering the last log level.

With the patch a pseudo log level LOGL_CONT as well as a pseudo log
category LOGC_CONT are introduced. Using these results in the application
of the same log level and category as in the previous log message.

Signed-off-by: Heinrich Schuchardt 
---
v2:
replace static variables by global data
---
 common/log.c  | 23 ++-
 doc/develop/logging.rst   |  6 ++
 include/asm-generic/global_data.h | 12 
 include/log.h |  2 ++
 4 files changed, 38 insertions(+), 5 deletions(-)

diff --git a/common/log.c b/common/log.c
index f95f09c1b6..58be9f7440 100644
--- a/common/log.c
+++ b/common/log.c
@@ -186,10 +186,12 @@ static bool log_passes_filters(struct log_device *ldev, 
struct log_rec *rec)
  * log_dispatch() - Send a log record to all log devices for processing
  *
  * The log record is sent to each log device in turn, skipping those which have
- * filters which block the record
+ * filters which block the record.
  *
- * @rec: Log record to dispatch
- * @return 0 (meaning success)
+ * All log messages created while processing log record @rec are ignored.
+ *
+ * @rec:   log record to dispatch
+ * Return: 0 msg sent, 1 msg not sent while already dispatching another msg
  */
 static int log_dispatch(struct log_rec *rec)
 {
@@ -201,7 +203,7 @@ static int log_dispatch(struct log_rec *rec)
 * as this might result in infinite recursion.
 */
if (gd->processing_msg)
-   return 0;
+   return 1;

/* Emit message */
gd->processing_msg = true;
@@ -221,6 +223,12 @@ int _log(enum log_category_t cat, enum log_level_t level, 
const char *file,
struct log_rec rec;
va_list args;

+   /* Check for message continuation */
+   if (cat == LOGC_CONT)
+   cat = gd->logc_prev;
+   if (level == LOGL_CONT)
+   level = gd->logl_prev;
+
rec.cat = cat;
rec.level = level & LOGL_LEVEL_MASK;
rec.force_debug = level & LOGL_FORCE_DEBUG;
@@ -236,7 +244,10 @@ int _log(enum log_category_t cat, enum log_level_t level, 
const char *file,
gd->log_drop_count++;
return -ENOSYS;
}
-   log_dispatch(&rec);
+   if (!log_dispatch(&rec)) {
+   gd->logc_prev = cat;
+   gd->logl_prev = level;
+   }

return 0;
 }
@@ -376,6 +387,8 @@ int log_init(void)
if (!gd->default_log_level)
gd->default_log_level = CONFIG_LOG_DEFAULT_LEVEL;
gd->log_fmt = log_get_default_format();
+   gd->logc_prev = LOGC_NONE;
+   gd->logl_prev = LOGL_INFO;

return 0;
 }
diff --git a/doc/develop/logging.rst b/doc/develop/logging.rst
index 7ce8482ab6..c36f6bbbe4 100644
--- a/doc/develop/logging.rst
+++ b/doc/develop/logging.rst
@@ -38,6 +38,9 @@ There are a number logging levels available, in increasing 
order of verbosity:
 * LOGL_DEBUG_CONTENT - Debug message showing full message content
 * LOGL_DEBUG_IO - Debug message showing hardware I/O access

+To continue a log message in a separate call of function log() use
+
+* LOGL_CONT - Use same log level as in previous call

 Logging category
 
@@ -56,6 +59,9 @@ The following main categories are defined:
 * LOGC_DT - Related to device tree control
 * LOGC_EFI - Related to EFI implementation

+To continue a log message in a separate call of function log() use
+
+* LOGC_CONT - Use same category as in previous call

 Enabling logging
 
diff --git a/include/asm-generic/global_data.h 
b/include/asm-generic/global_data.h
index db83f59ceb..0157af1aa4 100644
--- a/include/asm-generic/global_data.h
+++ b/include/asm-generic/global_data.h
@@ -371,6 +371,18 @@ struct global_data {
 * while another message is being processed.
 */
bool processing_msg;
+   /**
+* @logc_prev: logging category of previous message
+*
+* This value is used as logging category for continuation messages.
+*/
+   int logc_prev;
+   /**
+* @logl_pref: logging level of the previous message
+*
+* This value is used as logging level for continuation messages.
+*/
+   int logl_prev;
 #endif
 #if CONFIG_IS_ENABLED(BLOBLIST)
/**
diff --git a/include/log.h b/include/log.h
index 4acc087b2e..73cfb6153c 100644
--- a/include/log.h
+++ b/include/log.h
@@ -38,6 +38,7 @@ enum log_level_t {

LOGL_FIRST = LOGL_EMERG,
LOGL_MAX = LOGL_DEBUG_IO,
+   LOGL_CONT = -1, /* Use same log level as in previous call */
 };

 /**
@@ -63,6 +64,7 @@ enum log_category_t {

LOGC_