skbuff: Add pskb_extract() helper function
authorSowmini Varadhan <sowmini.varadhan@oracle.com>
Sat, 23 Apr 2016 01:36:35 +0000 (18:36 -0700)
committerDavid S. Miller <davem@davemloft.net>
Mon, 25 Apr 2016 20:54:14 +0000 (16:54 -0400)
commit6fa01ccd883021105e9f8af7d04b9f156fa3494a
treebb3715e5d0e662ee1e9d285c15033bd7ea5da40c
parent557fc4a098039cf296fe33f118bab99a925fd881
skbuff: Add pskb_extract() helper function

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: Sowmini Varadhan <sowmini.varadhan@oracle.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/linux/skbuff.h
net/core/skbuff.c