• John Fastabend's avatar
    bpf, sockmap: Avoid returning unneeded EAGAIN when redirecting to self · 6fa9201a
    John Fastabend authored
    If a socket redirects to itself and it is under memory pressure it is
    possible to get a socket stuck so that recv() returns EAGAIN and the
    socket can not advance for some time. This happens because when
    redirecting a skb to the same socket we received the skb on we first
    check if it is OK to enqueue the skb on the receiving socket by checking
    memory limits. But, if the skb is itself the object holding the memory
    needed to enqueue the skb we will keep retrying from kernel side
    and always fail with EAGAIN. Then userspace will get a recv() EAGAIN
    error if there are no skbs in the psock ingress queue. This will continue
    until either some skbs get kfree'd causing the memory pressure to
    reduce far enough that we can enqueue the pending packet or the
    socket is destroyed. In some cases its possible to get a socket
    stuck for a noticeable amount of time if the socket is only receiving
    skbs from sk_skb verdict programs. To reproduce I make the socket
    memory limits ridiculously low so sockets are always under memory
    pressure. More often though if under memory pressure it looks like
    a spurious EAGAIN error on user space side causing userspace to retry
    and typically enough has moved on the memory side that it works.
    
    To fix skip memory checks and skb_orphan if receiving on the same
    sock as already assigned.
    
    For SK_PASS cases this is easy, its always the same socket so we
    can just omit the orphan/set_owner pair.
    
    For backlog cases we need to check skb->sk and decide if the orphan
    and set_owner pair are needed.
    
    Fixes: 51199405 ("bpf: skb_verdict, support SK_PASS on RX BPF path")
    Signed-off-by: default avatarJohn Fastabend <john.fastabend@gmail.com>
    Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
    Reviewed-by: default avatarJakub Sitnicki <jakub@cloudflare.com>
    Link: https://lore.kernel.org/bpf/160556572660.73229.12566203819812939627.stgit@john-XPS-13-9370
    6fa9201a
skmsg.c 24.1 KB