• Jason Baron's avatar
    tcp: ensure epoll edge trigger wakeup when write queue is empty · ce5ec440
    Jason Baron authored
    We currently rely on the setting of SOCK_NOSPACE in the write()
    path to ensure that we wake up any epoll edge trigger waiters when
    acks return to free space in the write queue. However, if we fail
    to allocate even a single skb in the write queue, we could end up
    waiting indefinitely.
    
    Fix this by explicitly issuing a wakeup when we detect the condition
    of an empty write queue and a return value of -EAGAIN. This allows
    userspace to re-try as we expect this to be a temporary failure.
    
    I've tested this approach by artificially making
    sk_stream_alloc_skb() return NULL periodically. In that case,
    epoll edge trigger waiters will hang indefinitely in epoll_wait()
    without this patch.
    Signed-off-by: default avatarJason Baron <jbaron@akamai.com>
    Acked-by: default avatarEric Dumazet <edumazet@google.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    ce5ec440
tcp.c 82 KB