• Stefano Brivio's avatar
    net: Don't copy pfmemalloc flag in __copy_skb_header() · 8b700862
    Stefano Brivio authored
    The pfmemalloc flag indicates that the skb was allocated from
    the PFMEMALLOC reserves, and the flag is currently copied on skb
    copy and clone.
    
    However, an skb copied from an skb flagged with pfmemalloc
    wasn't necessarily allocated from PFMEMALLOC reserves, and on
    the other hand an skb allocated that way might be copied from an
    skb that wasn't.
    
    So we should not copy the flag on skb copy, and rather decide
    whether to allow an skb to be associated with sockets unrelated
    to page reclaim depending only on how it was allocated.
    
    Move the pfmemalloc flag before headers_start[0] using an
    existing 1-bit hole, so that __copy_skb_header() doesn't copy
    it.
    
    When cloning, we'll now take care of this flag explicitly,
    contravening to the warning comment of __skb_clone().
    
    While at it, restore the newline usage introduced by commit
    b1937227 ("net: reorganize sk_buff for faster
    __copy_skb_header()") to visually separate bytes used in
    bitfields after headers_start[0], that was gone after commit
    a9e419dc ("netfilter: merge ctinfo into nfct pointer storage
    area"), and describe the pfmemalloc flag in the kernel-doc
    structure comment.
    
    This doesn't change the size of sk_buff or cacheline boundaries,
    but consolidates the 15 bits hole before tc_index into a 2 bytes
    hole before csum, that could now be filled more easily.
    Reported-by: default avatarPatrick Talbert <ptalbert@redhat.com>
    Fixes: c93bdd0e ("netvm: allow skb allocation to use PFMEMALLOC reserves")
    Signed-off-by: default avatarStefano Brivio <sbrivio@redhat.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    8b700862
skbuff.c 137 KB