Skip to content
  • Marc-André Lureau's avatar
    a2dc3c8e
    char/spice: discard write() if backend is disconnected · a2dc3c8e
    Marc-André Lureau authored
    
    
    Most chardev backend handle write() as discarded data if underlying
    system is disconnected. For unknown historical reasons, the Spice
    backend has "reliable" write: it will wait until the client end is
    reconnected to do further successful write().
    
    To decide whether it make sense to wait until the client is
    reconnected (or queue the writes), let's review Spice chardev usage
    and handling of a disconnected client:
    
     * spice vdagent
       The agents reopen the virtio port on disconnect. In qemu side,
       virtio_serial_close() will also discard pending data.
    
     * usb redirection
       A disconnect creates a device disconnection.
    
     * smartcard emulation
       Data is discarded in passthru_apdu_from_guest().
    
       (Spice doesn't explicitly open the smartcard char device until
       upcoming 0.14.2, commit 69a5cfc74131ec0459f2eb5a231139f5a69a8037)
    
     * spice webdavd
       The daemon will restart the service, and reopen the virtio port.
    
     * spice ports (serial console, qemu monitor..)
       Depends on the associated device or usage.
    
       - serial, may be throttled or discarded on write, depending on
         device
    
       - QMP/HMP monitor have some CLOSED event handling, but want to
         flush the write, which will finish when a new client connects.
    
    On disconnect/reconnect, the client starts with fresh sessions. If it
    is a seamless migration, the client disconnects after the source
    migrated. The handling of source disconnect in qemu is thus irrelevant
    for the Spice session migration.
    
    For all these use cases, it is better to discard writes when the
    client is disconnected, and require the vm-side device/agent to behave
    correctly on CHR_EVENT_CLOSED, to stop reading and writing from
    the spice chardev.
    
    Signed-off-by: default avatarMarc-André Lureau <marcandre.lureau@redhat.com>
    Tested-by: default avatarVictor Toso <victortoso@redhat.com>
    Message-id: 20190221110703.5775-3-marcandre.lureau@redhat.com
    Signed-off-by: default avatarGerd Hoffmann <kraxel@redhat.com>
    a2dc3c8e
    char/spice: discard write() if backend is disconnected
    Marc-André Lureau authored
    
    
    Most chardev backend handle write() as discarded data if underlying
    system is disconnected. For unknown historical reasons, the Spice
    backend has "reliable" write: it will wait until the client end is
    reconnected to do further successful write().
    
    To decide whether it make sense to wait until the client is
    reconnected (or queue the writes), let's review Spice chardev usage
    and handling of a disconnected client:
    
     * spice vdagent
       The agents reopen the virtio port on disconnect. In qemu side,
       virtio_serial_close() will also discard pending data.
    
     * usb redirection
       A disconnect creates a device disconnection.
    
     * smartcard emulation
       Data is discarded in passthru_apdu_from_guest().
    
       (Spice doesn't explicitly open the smartcard char device until
       upcoming 0.14.2, commit 69a5cfc74131ec0459f2eb5a231139f5a69a8037)
    
     * spice webdavd
       The daemon will restart the service, and reopen the virtio port.
    
     * spice ports (serial console, qemu monitor..)
       Depends on the associated device or usage.
    
       - serial, may be throttled or discarded on write, depending on
         device
    
       - QMP/HMP monitor have some CLOSED event handling, but want to
         flush the write, which will finish when a new client connects.
    
    On disconnect/reconnect, the client starts with fresh sessions. If it
    is a seamless migration, the client disconnects after the source
    migrated. The handling of source disconnect in qemu is thus irrelevant
    for the Spice session migration.
    
    For all these use cases, it is better to discard writes when the
    client is disconnected, and require the vm-side device/agent to behave
    correctly on CHR_EVENT_CLOSED, to stop reading and writing from
    the spice chardev.
    
    Signed-off-by: default avatarMarc-André Lureau <marcandre.lureau@redhat.com>
    Tested-by: default avatarVictor Toso <victortoso@redhat.com>
    Message-id: 20190221110703.5775-3-marcandre.lureau@redhat.com
    Signed-off-by: default avatarGerd Hoffmann <kraxel@redhat.com>
Loading