• Jia He's avatar
    vhost: vsock: kick send_pkt worker once device is started · 0b841030
    Jia He authored
    Ning Bo reported an abnormal 2-second gap when booting Kata container [1].
    The unconditional timeout was caused by VSOCK_DEFAULT_CONNECT_TIMEOUT of
    connecting from the client side. The vhost vsock client tries to connect
    an initializing virtio vsock server.
    
    The abnormal flow looks like:
    host-userspace           vhost vsock                       guest vsock
    ==============           ===========                       ============
    connect()     -------->  vhost_transport_send_pkt_work()   initializing
       |                     vq->private_data==NULL
       |                     will not be queued
       V
    schedule_timeout(2s)
                             vhost_vsock_start()  <---------   device ready
                             set vq->private_data
    
    wait for 2s and failed
    connect() again          vq->private_data!=NULL         recv connecting pkt
    
    Details:
    1. Host userspace sends a connect pkt, at that time, guest vsock is under
       initializing, hence the vhost_vsock_start has not been called. So
       vq->private_data==NULL, and the pkt is not been queued to send to guest
    2. Then it sleeps for 2s
    3. After guest vsock finishes initializing, vq->private_data is set
    4. When host userspace wakes up after 2s, send connecting pkt again,
       everything is fine.
    
    As suggested by Stefano Garzarella, this fixes it by additional kicking the
    send_pkt worker in vhost_vsock_start once the virtio device is started. This
    makes the pending pkt sent again.
    
    After this patch, kata-runtime (with vsock enabled) boot time is reduced
    from 3s to 1s on a ThunderX2 arm64 server.
    
    [1] https://github.com/kata-containers/runtime/issues/1917Reported-by: default avatarNing Bo <n.b@live.com>
    Suggested-by: default avatarStefano Garzarella <sgarzare@redhat.com>
    Signed-off-by: default avatarJia He <justin.he@arm.com>
    Link: https://lore.kernel.org/r/20200501043840.186557-1-justin.he@arm.comSigned-off-by: default avatarMichael S. Tsirkin <mst@redhat.com>
    Reviewed-by: default avatarStefano Garzarella <sgarzare@redhat.com>
    0b841030
vsock.c 21 KB