• Keith Busch's avatar
    nvme-tcp: rerun io_work if req_list is not empty · a0fdd141
    Keith Busch authored
    A possible race condition exists where the request to send data is
    enqueued from nvme_tcp_handle_r2t()'s will not be observed by
    nvme_tcp_send_all() if it happens to be running. The driver relies on
    io_work to send the enqueued request when it is runs again, but the
    concurrently running nvme_tcp_send_all() may not have released the
    send_mutex at that time. If no future commands are enqueued to re-kick
    the io_work, the request will timeout in the SEND_H2C state, resulting
    in a timeout error like:
    
      nvme nvme0: queue 1: timeout request 0x3 type 6
    
    Ensure the io_work continues to run as long as the req_list is not empty.
    
    Fixes: db5ad6b7 ("nvme-tcp: try to send request in queue_rq context")
    Signed-off-by: default avatarKeith Busch <kbusch@kernel.org>
    Reviewed-by: default avatarSagi Grimberg <sagi@grimberg.me>
    Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
    a0fdd141
tcp.c 64.9 KB