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.g...@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 >