[PATCH v2 1/1] log: mute messages generated by log drivers

Heinrich Schuchardt xypron.glpk at gmx.de
Mon Oct 5 12:42:23 CEST 2020


On 05.10.20 12:21, Heinrich Schuchardt wrote:
> When a message is written by a log driver (e.g. via the network stack) this
> may result in the generation of further messages. We cannot allow these
> additional messages to be emitted as this might result in an infinite
> recursion.
>
> Up to now only the syslog driver was safeguarded. We should safeguard all
> log drivers instead.
>
> Signed-off-by: Heinrich Schuchardt <xypron.glpk at gmx.de>
> ---
> This patch is based on
>
> [PATCH v3 0/3] doc: global data pointer
> https://lists.denx.de/pipermail/u-boot/2020-October/428475.html
>
> v2:
> 	move processing_msg to global data pointer
> 	(Simon reported a problem with SPL log messages when useing a
> 	static variable)

Hello Simon,

this is what is needed based on origin/master.

In origin/next the first version of the patch was merged.

What should I use as basis?

Best regards

Heinrich
> ---
>  common/log.c                      | 12 +++++++++++-
>  common/log_syslog.c               |  8 --------
>  include/asm-generic/global_data.h |  8 ++++++++
>  3 files changed, 19 insertions(+), 9 deletions(-)
>
> diff --git a/common/log.c b/common/log.c
> index 734d26de4a..54f2fdeb36 100644
> --- a/common/log.c
> +++ b/common/log.c
> @@ -192,11 +192,21 @@ static int log_dispatch(struct log_rec *rec)
>  {
>  	struct log_device *ldev;
>
> +	/*
> +	 * When a log driver writes messages (e.g. via the network stack) this
> +	 * may result in further generated messages. We cannot process them here
> +	 * as this might result in infinite recursion.
> +	 */
> +	if (gd->processing_msg)
> +		return 0;
> +
> +	/* Emit message */
> +	gd->processing_msg = 1;
>  	list_for_each_entry(ldev, &gd->log_head, sibling_node) {
>  		if (log_passes_filters(ldev, rec))
>  			ldev->drv->emit(ldev, rec);
>  	}
> -
> +	gd->processing_msg = 0;
>  	return 0;
>  }
>
> diff --git a/common/log_syslog.c b/common/log_syslog.c
> index 149ff5af31..2ae703fed7 100644
> --- a/common/log_syslog.c
> +++ b/common/log_syslog.c
> @@ -35,16 +35,9 @@ static int log_syslog_emit(struct log_device *ldev, struct log_rec *rec)
>  	char *log_msg;
>  	int eth_hdr_size;
>  	struct in_addr bcast_ip;
> -	static int processing_msg;
>  	unsigned int log_level;
>  	char *log_hostname;
>
> -	/* Fend off messages from the network stack while writing a message */
> -	if (processing_msg)
> -		return 0;
> -
> -	processing_msg = 1;
> -
>  	/* Setup packet buffers */
>  	net_init();
>  	/* Disable hardware and put it into the reset state */
> @@ -108,7 +101,6 @@ static int log_syslog_emit(struct log_device *ldev, struct log_rec *rec)
>  	net_send_packet((uchar *)msg, ptr - msg);
>
>  out:
> -	processing_msg = 0;
>  	return ret;
>  }
>
> diff --git a/include/asm-generic/global_data.h b/include/asm-generic/global_data.h
> index ebb740d34f..6bb7f93678 100644
> --- a/include/asm-generic/global_data.h
> +++ b/include/asm-generic/global_data.h
> @@ -363,6 +363,14 @@ struct global_data {
>  	 * &enum log_fmt defines the bits of the bit mask.
>  	 */
>  	int log_fmt;
> +
> +	/**
> +	 * @processing_msg: a log message is being processed
> +	 *
> +	 * This flag is used to suppress the creation of additional messages
> +	 * while another message is being processed.
> +	 */
> +	int processing_msg;
>  #endif
>  #if CONFIG_IS_ENABLED(BLOBLIST)
>  	/**
> --
> 2.28.0
>



More information about the U-Boot mailing list