logd: Limit ustream write buffer with configurable value

Hauke Mehrtens hauke at hauke-m.de
Sat Jul 24 09:25:19 PDT 2021


On 7/20/21 11:51 AM, Gocool.. wrote:
> If the "logread" process is blocked in write call or stopped by
> pressing "CTRL+Z", the logd starts to buffer all the messages
> in the write buffer. Since there is no limit in w.max_buffers,
> the logd consumes all the system memory at a point of time which
> triggers Out Of Memory.
> The ustream write max_buffer is limited with a configurable value
> parsed through logd with option "-W" and unlimited if value is '0'.

Instead of providing the limit on the command line, would it make more 
sense to use a reasonable default?

> 
> Similar ticket has been reported in,
> https://github.com/openwrt/packages/issues/5604
> 
> Signed-off-by: gokulnathan <gokulmrt at gmail.com>

Please use your real name.

The patch is whitespace damaged, please use git send-email to sedn the 
patch:
https://openwrt.org/submitting-patches

> 
> diff --git a/log/logd.c b/log/logd.c
> index 5d6c458..7e52820 100644
> --- a/log/logd.c
> +++ b/log/logd.c
> @@ -33,6 +33,8 @@ static struct blob_buf b;
>   static struct ubus_auto_conn conn;
>   static LIST_HEAD(clients);
> 
> +static unsigned int log_ustream_max_buffers = 0;
> +
>   enum {
>          READ_LINES,
>          READ_STREAM,
> @@ -130,6 +132,11 @@ read_log(struct ubus_context *ctx, struct ubus_object *obj,
>                  cl->s.stream.notify_state = client_notify_state;
>                  cl->fd = fds[1];
>                  ustream_fd_init(&cl->s, cl->fd);
> +               /* Limit the ustream write max_buffers to avoid
> infinite memory consumption when no logread happens */
> +               if (0 != log_ustream_max_buffers)
> +               {
> +                       cl->s.stream.w.max_buffers = log_ustream_max_buffers;
> +               }
>                  list_add(&cl->list, &clients);
>                  while ((!tb[READ_LINES] || count) && l) {
>                          blob_buf_init(&b, 0);
> @@ -243,13 +250,18 @@ main(int argc, char **argv)
>          struct passwd *p = NULL;
> 
>          signal(SIGPIPE, SIG_IGN);
> -       while ((ch = getopt(argc, argv, "S:")) != -1) {
> +       while ((ch = getopt(argc, argv, "S:W:")) != -1) {
>                  switch (ch) {
>                  case 'S':
>                          log_size = atoi(optarg);
>                          if (log_size < 1)
>                                  log_size = 16;
>                          break;
> +               case 'W':
> +                       log_ustream_max_buffers = atoi(optarg);
> +                       if (log_ustream_max_buffers < 1)
> +                               log_ustream_max_buffers = 0;
> +                       break;
>                  }
>          }
>          log_size *= 1024;
> 
> _______________________________________________
> openwrt-devel mailing list
> openwrt-devel at lists.openwrt.org
> https://lists.openwrt.org/mailman/listinfo/openwrt-devel
> 




More information about the openwrt-devel mailing list