• Sowmini Varadhan's avatar
    skbuff: Add pskb_extract() helper function · 6fa01ccd
    Sowmini Varadhan authored
    A pattern of skb usage seen in modules such as RDS-TCP is to
    extract `to_copy' bytes from the received TCP segment, starting
    at some offset `off' into a new skb `clone'. This is done in
    the ->data_ready callback, where the clone skb is queued up for rx on
    the PF_RDS socket, while the parent TCP segment is returned unchanged
    back to the TCP engine.
    
    The existing code uses the sequence
    	clone = skb_clone(..);
    	pskb_pull(clone, off, ..);
    	pskb_trim(clone, to_copy, ..);
    with the intention of discarding the first `off' bytes. However,
    skb_clone() + pskb_pull() implies pksb_expand_head(), which ends
    up doing a redundant memcpy of bytes that will then get discarded
    in __pskb_pull_tail().
    
    To avoid this inefficiency, this commit adds pskb_extract() that
    creates the clone, and memcpy's only the relevant header/frag/frag_list
    to the start of `clone'. pskb_trim() is then invoked to trim clone
    down to the requested to_copy bytes.
    Signed-off-by: default avatarSowmini Varadhan <sowmini.varadhan@oracle.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    6fa01ccd
skbuff.c 120 KB