Commit 584af1f1d9 ("ui/gtk: add a keyboard fifo to the VTE
consoles") changed the VTE chardev backend code to rely on the
chr_accept_input() callback function. The code expects a
chr_accept_input() call whenever qemu_chr_be_can_write() bytes
were written. It turns out this is wrong. Some chardev
frontends only call this callback after can_write was 0.
Change the code to send data until the keyboard fifo is empty
or qemu_chr_be_can_write() returns 0.
Fixes: 584af1f1d9 ("ui/gtk: add a keyboard fifo to the VTE consoles")
Signed-off-by: Volker Rümelin <vr_qemu@t-online.de>
---
ui/gtk.c | 10 ++++------
1 file changed, 4 insertions(+), 6 deletions(-)
diff --git a/ui/gtk.c b/ui/gtk.c
index 974e4dfc0b..cfb0728d1f 100644
--- a/ui/gtk.c
+++ b/ui/gtk.c
@@ -1646,16 +1646,14 @@ static void gd_vc_send_chars(VirtualConsole *vc)
len = qemu_chr_be_can_write(vc->vte.chr);
avail = fifo8_num_used(&vc->vte.out_fifo);
- if (len > avail) {
- len = avail;
- }
- while (len > 0) {
+ while (len > 0 && avail > 0) {
const uint8_t *buf;
uint32_t size;
- buf = fifo8_pop_buf(&vc->vte.out_fifo, len, &size);
+ buf = fifo8_pop_buf(&vc->vte.out_fifo, MIN(len, avail), &size);
qemu_chr_be_write(vc->vte.chr, (uint8_t *)buf, size);
- len -= size;
+ len = qemu_chr_be_can_write(vc->vte.chr);
+ avail -= size;
}
}
--
2.26.2
On Tue, Aug 10, 2021 at 10:35 AM Volker Rümelin <vr_qemu@t-online.de> wrote: > Commit 584af1f1d9 ("ui/gtk: add a keyboard fifo to the VTE > consoles") changed the VTE chardev backend code to rely on the > chr_accept_input() callback function. The code expects a > chr_accept_input() call whenever qemu_chr_be_can_write() bytes > were written. It turns out this is wrong. Some chardev > frontends only call this callback after can_write was 0. > > Change the code to send data until the keyboard fifo is empty > or qemu_chr_be_can_write() returns 0. > > Fixes: 584af1f1d9 ("ui/gtk: add a keyboard fifo to the VTE consoles") > Signed-off-by: Volker Rümelin <vr_qemu@t-online.de> > Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com> --- > ui/gtk.c | 10 ++++------ > 1 file changed, 4 insertions(+), 6 deletions(-) > > diff --git a/ui/gtk.c b/ui/gtk.c > index 974e4dfc0b..cfb0728d1f 100644 > --- a/ui/gtk.c > +++ b/ui/gtk.c > @@ -1646,16 +1646,14 @@ static void gd_vc_send_chars(VirtualConsole *vc) > > len = qemu_chr_be_can_write(vc->vte.chr); > avail = fifo8_num_used(&vc->vte.out_fifo); > - if (len > avail) { > - len = avail; > - } > - while (len > 0) { > + while (len > 0 && avail > 0) { > const uint8_t *buf; > uint32_t size; > > - buf = fifo8_pop_buf(&vc->vte.out_fifo, len, &size); > + buf = fifo8_pop_buf(&vc->vte.out_fifo, MIN(len, avail), &size); > qemu_chr_be_write(vc->vte.chr, (uint8_t *)buf, size); > - len -= size; > + len = qemu_chr_be_can_write(vc->vte.chr); > + avail -= size; > } > } > > -- > 2.26.2 > > -- Marc-André Lureau
On Tue, Aug 10, 2021 at 08:32:57AM +0200, Volker Rümelin wrote: > Commit 584af1f1d9 ("ui/gtk: add a keyboard fifo to the VTE > consoles") changed the VTE chardev backend code to rely on the > chr_accept_input() callback function. The code expects a > chr_accept_input() call whenever qemu_chr_be_can_write() bytes > were written. It turns out this is wrong. Some chardev > frontends only call this callback after can_write was 0. > > Change the code to send data until the keyboard fifo is empty > or qemu_chr_be_can_write() returns 0. > > Fixes: 584af1f1d9 ("ui/gtk: add a keyboard fifo to the VTE consoles") > Signed-off-by: Volker Rümelin <vr_qemu@t-online.de> Queued. thanks, Gerd
© 2016 - 2024 Red Hat, Inc.