summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSergio Lopez2018-06-05 09:54:55 +0200
committerPaolo Bonzini2018-06-28 19:05:30 +0200
commit019288bf137183bf3407c9824655b753bfafc99f (patch)
tree5cc4ca3ee674f30501da25354528b8f158f3111b
parentmain-loop: document IOCanReadHandler (diff)
downloadqemu-019288bf137183bf3407c9824655b753bfafc99f.tar.gz
qemu-019288bf137183bf3407c9824655b753bfafc99f.tar.xz
qemu-019288bf137183bf3407c9824655b753bfafc99f.zip
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>
-rw-r--r--hw/char/serial.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/hw/char/serial.c b/hw/char/serial.c
index 605b0d02f9..6de6c29779 100644
--- a/hw/char/serial.c
+++ b/hw/char/serial.c
@@ -260,7 +260,7 @@ static void serial_xmit(SerialState *s)
if (s->mcr & UART_MCR_LOOP) {
/* 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 &&
+ } else if (qemu_chr_fe_write(&s->chr, &s->tsr, 1) == 0 &&
s->tsr_retry < MAX_XMIT_RETRY) {
assert(s->watch_tag == 0);
s->watch_tag =