• Nicholas Piggin's avatar
    tty: hvc: hvc_poll() fix read loop batching · 68b2fc71
    Nicholas Piggin authored
    Commit ec97eaad ("tty: hvc: hvc_poll() break hv read loop")
    removes get_chars batching entirely, which slows down large console
    operations like paste -- virtio console "feels worse than a 9600 baud
    serial line," reports Matteo.
    
    This adds back batching in a more latency friendly way. If the caller
    can sleep then we try to fill the entire flip buffer, releasing the
    lock and scheduling between each iteration. If it can not sleep, then
    batches are limited to 128 bytes. Matteo confirms this fixes the
    performance problem.
    
    Latency testing the powerpc OPAL console with OpenBMC UART with a
    large paste shows about 0.25ms latency, which seems reasonable. 10ms
    latencies were typical for this case before the latency breaking work,
    so we still see most of the benefit.
    
      kopald-1204    0d.h.    5us : hvc_poll <-hvc_handle_interrupt
      kopald-1204    0d.h.    5us : __hvc_poll <-hvc_handle_interrupt
      kopald-1204    0d.h.    5us : _raw_spin_lock_irqsave <-__hvc_poll
      kopald-1204    0d.h.    5us : tty_port_tty_get <-__hvc_poll
      kopald-1204    0d.h.    6us : _raw_spin_lock_irqsave <-tty_port_tty_get
      kopald-1204    0d.h.    6us : _raw_spin_unlock_irqrestore <-tty_port_tty_get
      kopald-1204    0d.h.    6us : tty_buffer_request_room <-__hvc_poll
      kopald-1204    0d.h.    7us : __tty_buffer_request_room <-__hvc_poll
      kopald-1204    0d.h.    7us+: opal_get_chars <-__hvc_poll
      kopald-1204    0d.h.   36us : tty_buffer_request_room <-__hvc_poll
      kopald-1204    0d.h.   36us : __tty_buffer_request_room <-__hvc_poll
      kopald-1204    0d.h.   36us+: opal_get_chars <-__hvc_poll
      kopald-1204    0d.h.   65us : tty_buffer_request_room <-__hvc_poll
      kopald-1204    0d.h.   65us : __tty_buffer_request_room <-__hvc_poll
      kopald-1204    0d.h.   66us+: opal_get_chars <-__hvc_poll
      kopald-1204    0d.h.   94us : tty_buffer_request_room <-__hvc_poll
      kopald-1204    0d.h.   95us : __tty_buffer_request_room <-__hvc_poll
      kopald-1204    0d.h.   95us+: opal_get_chars <-__hvc_poll
      kopald-1204    0d.h.  124us : tty_buffer_request_room <-__hvc_poll
      kopald-1204    0d.h.  124us : __tty_buffer_request_room <-__hvc_poll
      kopald-1204    0d.h.  125us+: opal_get_chars <-__hvc_poll
      kopald-1204    0d.h.  154us : tty_buffer_request_room <-__hvc_poll
      kopald-1204    0d.h.  154us : __tty_buffer_request_room <-__hvc_poll
      kopald-1204    0d.h.  154us+: opal_get_chars <-__hvc_poll
      kopald-1204    0d.h.  183us : tty_buffer_request_room <-__hvc_poll
      kopald-1204    0d.h.  184us : __tty_buffer_request_room <-__hvc_poll
      kopald-1204    0d.h.  184us+: opal_get_chars <-__hvc_poll
      kopald-1204    0d.h.  213us : tty_buffer_request_room <-__hvc_poll
      kopald-1204    0d.h.  213us : __tty_buffer_request_room <-__hvc_poll
      kopald-1204    0d.h.  213us+: opal_get_chars <-__hvc_poll
      kopald-1204    0d.h.  242us : _raw_spin_unlock_irqrestore <-__hvc_poll
      kopald-1204    0d.h.  242us : tty_flip_buffer_push <-__hvc_poll
      kopald-1204    0d.h.  243us : queue_work_on <-tty_flip_buffer_push
      kopald-1204    0d.h.  243us : tty_kref_put <-__hvc_poll
      kopald-1204    0d.h.  243us : hvc_kick <-hvc_handle_interrupt
      kopald-1204    0d.h.  243us : wake_up_process <-hvc_kick
      kopald-1204    0d.h.  244us : try_to_wake_up <-hvc_kick
      kopald-1204    0d.h.  244us : _raw_spin_lock_irqsave <-try_to_wake_up
      kopald-1204    0d.h.  244us : _raw_spin_unlock_irqrestore <-try_to_wake_up
    Reported-by: default avatarMatteo Croce <mcroce@redhat.com>
    Tested-by: default avatarMatteo Croce <mcroce@redhat.com>
    Tested-by: default avatarJason Gunthorpe <jgg@mellanox.com>
    Tested-by: default avatarLeon Romanovsky <leonro@mellanox.com>
    Signed-off-by: default avatarNicholas Piggin <npiggin@gmail.com>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    68b2fc71
hvc_console.c 24.9 KB