• John Fastabend's avatar
    bpf, sockmap: Handle memory acct if skb_verdict prog redirects to self · 2443ca66
    John Fastabend authored
    If the skb_verdict_prog redirects an skb knowingly to itself, fix your
    BPF program this is not optimal and an abuse of the API please use
    SK_PASS. That said there may be cases, such as socket load balancing,
    where picking the socket is hashed based or otherwise picks the same
    socket it was received on in some rare cases. If this happens we don't
    want to confuse userspace giving them an EAGAIN error if we can avoid
    it.
    
    To avoid double accounting in these cases. At the moment even if the
    skb has already been charged against the sockets rcvbuf and forward
    alloc we check it again and do set_owner_r() causing it to be orphaned
    and recharged. For one this is useless work, but more importantly we
    can have a case where the skb could be put on the ingress queue, but
    because we are under memory pressure we return EAGAIN. The trouble
    here is the skb has already been accounted for so any rcvbuf checks
    include the memory associated with the packet already. This rolls
    up and can result in unnecessary EAGAIN errors in userspace read()
    calls.
    
    Fix by doing an unlikely check and skipping checks if skb->sk == sk.
    
    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/160556574804.73229.11328201020039674147.stgit@john-XPS-13-9370
    2443ca66
skmsg.c 24.4 KB