Skip to content
Snippets Groups Projects
  • Thomas Huth's avatar
    4f7689f0
    chardev/char-pty: Avoid losing bytes when the other side just (re-)connected · 4f7689f0
    Thomas Huth authored
    
    When starting a guest via libvirt with "virsh start --console ...",
    the first second of the console output is missing. This is especially
    annoying on s390x that only has a text console by default and no graphical
    output - if the bios fails to boot here, the information about what went
    wrong is completely lost.
    
    One part of the problem (there is also some things to be done on the
    libvirt side) is that QEMU only checks with a 1 second timer whether
    the other side of the pty is already connected, so the first second of
    the console output is always lost.
    
    This likely used to work better in the past, since the code once checked
    for a re-connection during write, but this has been removed in commit
    f8278c7d ("char-pty: remove the check for connection on write") to avoid
    some locking.
    
    To ease the situation here at least a little bit, let's check with g_poll()
    whether we could send out the data anyway, even if the connection has not
    been marked as "connected" yet. The file descriptor is marked as non-blocking
    anyway since commit fac6688a ("Do not hang on full PTY"), so this should
    not cause any trouble if the other side is not ready for receiving yet.
    
    With this patch applied, I can now successfully see the bios output of
    a s390x guest when running it with "virsh start --console" (with a patched
    version of virsh that fixes the remaining issues there, too).
    
    Reported-by: default avatarMarc Hartmayer <mhartmay@linux.ibm.com>
    Signed-off-by: default avatarThomas Huth <thuth@redhat.com>
    Reviewed-by: default avatarDaniel P. Berrangé <berrange@redhat.com>
    Message-Id: <20230816210743.1319018-1-thuth@redhat.com>
    4f7689f0
    History
    chardev/char-pty: Avoid losing bytes when the other side just (re-)connected
    Thomas Huth authored
    
    When starting a guest via libvirt with "virsh start --console ...",
    the first second of the console output is missing. This is especially
    annoying on s390x that only has a text console by default and no graphical
    output - if the bios fails to boot here, the information about what went
    wrong is completely lost.
    
    One part of the problem (there is also some things to be done on the
    libvirt side) is that QEMU only checks with a 1 second timer whether
    the other side of the pty is already connected, so the first second of
    the console output is always lost.
    
    This likely used to work better in the past, since the code once checked
    for a re-connection during write, but this has been removed in commit
    f8278c7d ("char-pty: remove the check for connection on write") to avoid
    some locking.
    
    To ease the situation here at least a little bit, let's check with g_poll()
    whether we could send out the data anyway, even if the connection has not
    been marked as "connected" yet. The file descriptor is marked as non-blocking
    anyway since commit fac6688a ("Do not hang on full PTY"), so this should
    not cause any trouble if the other side is not ready for receiving yet.
    
    With this patch applied, I can now successfully see the bios output of
    a s390x guest when running it with "virsh start --console" (with a patched
    version of virsh that fixes the remaining issues there, too).
    
    Reported-by: default avatarMarc Hartmayer <mhartmay@linux.ibm.com>
    Signed-off-by: default avatarThomas Huth <thuth@redhat.com>
    Reviewed-by: default avatarDaniel P. Berrangé <berrange@redhat.com>
    Message-Id: <20230816210743.1319018-1-thuth@redhat.com>