• John Fastabend's avatar
    bpf, sockmap: Add memory accounting so skbs on ingress lists are visible · 0b17ad25
    John Fastabend authored
    Move skb->sk assignment out of sk_psock_bpf_run() and into individual
    callers. Then we can use proper skb_set_owner_r() call to assign a
    sk to a skb. This improves things by also charging the truesize against
    the sockets sk_rmem_alloc counter. With this done we get some accounting
    in place to ensure the memory associated with skbs on the workqueue are
    still being accounted for somewhere. Finally, by using skb_set_owner_r
    the destructor is setup so we can just let the normal skb_kfree logic
    recover the memory. Combined with previous patch dropping skb_orphan()
    we now can recover from memory pressure and maintain accounting.
    
    Note, we will charge the skbs against their originating socket even
    if being redirected into another socket. Once the skb completes the
    redirect op the kfree_skb will give the memory back. This is important
    because if we charged the socket we are redirecting to (like it was
    done before this series) the sock_writeable() test could fail because
    of the skb trying to be sent is already charged against the socket.
    
    Also TLS case is special. Here we wait until we have decided not to
    simply PASS the packet up the stack. In the case where we PASS the
    packet up the stack we already have an skb which is accounted for on
    the TLS socket context.
    
    For the parser case we continue to just set/clear skb->sk this is
    because the skb being used here may be combined with other skbs or
    turned into multiple skbs depending on the parser logic. For example
    the parser could request a payload length greater than skb->len so
    that the strparser needs to collect multiple skbs. At any rate
    the final result will be handled in the strparser recv callback.
    
    Fixes: 604326b4 ("bpf, sockmap: convert to generic sk_msg interface")
    Signed-off-by: default avatarJohn Fastabend <john.fastabend@gmail.com>
    Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
    Link: https://lore.kernel.org/bpf/160226867513.5692.10579573214635925960.stgit@john-Precision-5820-Tower
    0b17ad25
skmsg.c 21 KB