diff options
author | Sowmini Varadhan <sowmini.varadhan@oracle.com> | 2016-04-22 18:36:35 -0700 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2016-04-25 16:54:14 -0400 |
commit | 6fa01ccd883021105e9f8af7d04b9f156fa3494a (patch) | |
tree | bb3715e5d0e662ee1e9d285c15033bd7ea5da40c /net/rds | |
parent | 557fc4a098039cf296fe33f118bab99a925fd881 (diff) |
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>
Diffstat (limited to 'net/rds')
0 files changed, 0 insertions, 0 deletions