mirror of https://gitee.com/openkylin/qemu.git
hw/char/serial: Only retry if qemu_chr_fe_write returns 0
Only retry on serial_xmit if qemu_chr_fe_write returns 0, as this is the only recoverable error. Retrying with any other scenario, in addition to being a waste of CPU cycles, can compromise the Guest stability if by the vCPU issuing the write and the main loop thread are, by chance or explicit pinning, running on the same pCPU. Previous discussion: https://lists.nongnu.org/archive/html/qemu-devel/2018-05/msg06998.html Signed-off-by: Sergio Lopez <slp@redhat.com> Message-Id: <1528185295-14199-1-git-send-email-slp@redhat.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
d29a8a1b07
commit
019288bf13
|
@ -260,7 +260,7 @@ static void serial_xmit(SerialState *s)
|
||||||
if (s->mcr & UART_MCR_LOOP) {
|
if (s->mcr & UART_MCR_LOOP) {
|
||||||
/* in loopback mode, say that we just received a char */
|
/* in loopback mode, say that we just received a char */
|
||||||
serial_receive1(s, &s->tsr, 1);
|
serial_receive1(s, &s->tsr, 1);
|
||||||
} else if (qemu_chr_fe_write(&s->chr, &s->tsr, 1) != 1 &&
|
} else if (qemu_chr_fe_write(&s->chr, &s->tsr, 1) == 0 &&
|
||||||
s->tsr_retry < MAX_XMIT_RETRY) {
|
s->tsr_retry < MAX_XMIT_RETRY) {
|
||||||
assert(s->watch_tag == 0);
|
assert(s->watch_tag == 0);
|
||||||
s->watch_tag =
|
s->watch_tag =
|
||||||
|
|
Loading…
Reference in New Issue