qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH v2 4/4] char: convert qemu_chr_fe_write to qemu_


From: Paolo Bonzini
Subject: Re: [Qemu-devel] [PATCH v2 4/4] char: convert qemu_chr_fe_write to qemu_chr_fe_write_all
Date: Tue, 6 Sep 2016 17:23:55 +0200
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.2.0


On 06/09/2016 15:56, Daniel P. Berrange wrote:
> The mux chardev was not checking the return value of any
> qemu_chr_fe_write() call so would silently loose data
> on EAGAIN.
> 
> Similarly the qemu_chr_fe_printf method would not check
> errors and was not in a position to retry even if it
> could check.
> 
> Signed-off-by: Daniel P. Berrange <address@hidden>
> ---
>  qemu-char.c | 18 ++++++++++++------
>  1 file changed, 12 insertions(+), 6 deletions(-)
> 
> diff --git a/qemu-char.c b/qemu-char.c
> index 5f82ebb..6104f24 100644
> --- a/qemu-char.c
> +++ b/qemu-char.c
> @@ -440,7 +440,9 @@ void qemu_chr_fe_printf(CharDriverState *s, const char 
> *fmt, ...)
>      va_list ap;
>      va_start(ap, fmt);
>      vsnprintf(buf, sizeof(buf), fmt, ap);
> -    qemu_chr_fe_write(s, (uint8_t *)buf, strlen(buf));
> +    /* XXX this blocks entire thread. Rewrite to use
> +     * qemu_chr_fe_write and background I/O callbacks */
> +    qemu_chr_fe_write_all(s, (uint8_t *)buf, strlen(buf));
>      va_end(ap);
>  }
>  
> @@ -556,7 +558,9 @@ static int mux_chr_write(CharDriverState *chr, const 
> uint8_t *buf, int len)
>                           (secs / 60) % 60,
>                           secs % 60,
>                           (int)(ti % 1000));
> -                qemu_chr_fe_write(d->drv, (uint8_t *)buf1, strlen(buf1));
> +                /* XXX this blocks entire thread. Rewrite to use
> +                 * qemu_chr_fe_write and background I/O callbacks */
> +                qemu_chr_fe_write_all(d->drv, (uint8_t *)buf1, strlen(buf1));
>                  d->linestart = 0;
>              }
>              ret += qemu_chr_fe_write(d->drv, buf+i, 1);
> @@ -594,13 +598,15 @@ static void mux_print_help(CharDriverState *chr)
>                   "\n\rEscape-Char set to Ascii: 0x%02x\n\r\n\r",
>                   term_escape_char);
>      }
> -    qemu_chr_fe_write(chr, (uint8_t *)cbuf, strlen(cbuf));
> +    /* XXX this blocks entire thread. Rewrite to use
> +     * qemu_chr_fe_write and background I/O callbacks */
> +    qemu_chr_fe_write_all(chr, (uint8_t *)cbuf, strlen(cbuf));
>      for (i = 0; mux_help[i] != NULL; i++) {
>          for (j=0; mux_help[i][j] != '\0'; j++) {
>              if (mux_help[i][j] == '%')
> -                qemu_chr_fe_write(chr, (uint8_t *)ebuf, strlen(ebuf));
> +                qemu_chr_fe_write_all(chr, (uint8_t *)ebuf, strlen(ebuf));
>              else
> -                qemu_chr_fe_write(chr, (uint8_t *)&mux_help[i][j], 1);
> +                qemu_chr_fe_write_all(chr, (uint8_t *)&mux_help[i][j], 1);
>          }
>      }
>  }
> @@ -625,7 +631,7 @@ static int mux_proc_byte(CharDriverState *chr, MuxDriver 
> *d, int ch)
>          case 'x':
>              {
>                   const char *term =  "QEMU: Terminated\n\r";
> -                 qemu_chr_fe_write(chr, (uint8_t *)term, strlen(term));
> +                 qemu_chr_fe_write_all(chr, (uint8_t *)term, strlen(term));
>                   exit(0);
>                   break;
>              }
> 

Queued for 2.8, thanks.

Paolo



reply via email to

[Prev in Thread] Current Thread [Next in Thread]