qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] [PATCH] Revert "serial: fix retry logic"


From: Michael Tokarev
Subject: Re: [Qemu-devel] [PATCH] Revert "serial: fix retry logic"
Date: Sat, 27 Oct 2012 12:31:03 +0400
User-agent: Mozilla/5.0 (X11; Linux i686 on x86_64; rv:10.0.9) Gecko/20121015 Icedove/10.0.9

Ping?

/mjt

On 19.09.2012 12:08, Michael Tokarev wrote:
> This reverts commit 67c5322d7000fd105a926eec44bc1765b7d70bdd:
> 
>     I'm not sure if the retry logic has ever worked when not using FIFO mode. 
>  I
>     found this while writing a test case although code inspection confirms it 
> is
>     definitely broken.
> 
>     The TSR retry logic will never actually happen because it is guarded by an
>     'if (s->tsr_rety > 0)' but this is the only place that can ever make the
>     variable greater than zero.  That effectively makes the retry logic an 
> 'if (0)
> 
>     I believe this is a typo and the intention was >= 0.  Once this is fixed 
> thoug
>     I see double transmits with my test case.  This is because in the non FIFO
>     case, serial_xmit may get invoked while LSR.THRE is still high because the
>     character was processed but the retransmit timer was still active.
> 
>     We can handle this by simply checking for LSR.THRE and returning early.  
> It's
>     possible that the FIFO paths also need some attention.
> 
>     Cc: Stefano Stabellini <address@hidden>
>     Signed-off-by: Anthony Liguori <address@hidden>
> 
> Even if the previous logic was never worked, new logic breaks stuff -
> namely,
> 
>  qemu -enable-kvm -nographic -kernel /boot/vmlinuz-$(uname -r) -append 
> console=ttyS0 -serial pty
> 
> the above command will cause the virtual machine to stuck at startup
> using 100% CPU till one connects to the pty and sends any char to it.
> 
> Note this is rather typical invocation for various headless virtual
> machines by libvirt.
> 
> So revert this change for now, till a better solution will be found.
> 
> Signed-off-by: Michael Tokarev <address@hidden>
> ---
>  hw/serial.c |    4 +---
>  1 file changed, 1 insertion(+), 3 deletions(-)
> 
> diff --git a/hw/serial.c b/hw/serial.c
> index a421d1e..df54de2 100644
> --- a/hw/serial.c
> +++ b/hw/serial.c
> @@ -327,8 +327,6 @@ static void serial_xmit(void *opaque)
>              s->tsr = fifo_get(s,XMIT_FIFO);
>              if (!s->xmit_fifo.count)
>                  s->lsr |= UART_LSR_THRE;
> -        } else if ((s->lsr & UART_LSR_THRE)) {
> -            return;
>          } else {
>              s->tsr = s->thr;
>              s->lsr |= UART_LSR_THRE;
> @@ -340,7 +338,7 @@ static void serial_xmit(void *opaque)
>          /* in loopback mode, say that we just received a char */
>          serial_receive1(s, &s->tsr, 1);
>      } else if (qemu_chr_fe_write(s->chr, &s->tsr, 1) != 1) {
> -        if ((s->tsr_retry >= 0) && (s->tsr_retry <= MAX_XMIT_RETRY)) {
> +        if ((s->tsr_retry > 0) && (s->tsr_retry <= MAX_XMIT_RETRY)) {
>              s->tsr_retry++;
>              qemu_mod_timer(s->transmit_timer,  new_xmit_ts + 
> s->char_transmit_time);
>              return;




reply via email to

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