net: add __pskb_copy_fclone and pskb_copy_for_clone
There are several instances where a pskb_copy or __pskb_copy is immediately followed by an skb_clone. Add a couple of new functions to allow the copy skb to be allocated from the fclone cache and thus speed up subsequent skb_clone calls. Cc: Alexander Smirnov <alex.bluesman.smirnov@gmail.com> Cc: Dmitry Eremin-Solenikov <dbaryshkov@gmail.com> Cc: Marek Lindner <mareklindner@neomailbox.ch> Cc: Simon Wunderlich <sw@simonwunderlich.de> Cc: Antonio Quartulli <antonio@meshcoding.com> Cc: Marcel Holtmann <marcel@holtmann.org> Cc: Gustavo Padovan <gustavo@padovan.org> Cc: Johan Hedberg <johan.hedberg@gmail.com> Cc: Arvid Brodin <arvid.brodin@alten.se> Cc: Patrick McHardy <kaber@trash.net> Cc: Pablo Neira Ayuso <pablo@netfilter.org> Cc: Jozsef Kadlecsik <kadlec@blackhole.kfki.hu> Cc: Lauro Ramos Venancio <lauro.venancio@openbossa.org> Cc: Aloisio Almeida Jr <aloisio.almeida@openbossa.org> Cc: Samuel Ortiz <sameo@linux.intel.com> Cc: Jon Maloy <jon.maloy@ericsson.com> Cc: Allan Stephens <allan.stephens@windriver.com> Cc: Andrew Hendry <andrew.hendry@gmail.com> Cc: Eric Dumazet <edumazet@google.com> Reviewed-by: Christoph Paasch <christoph.paasch@uclouvain.be> Signed-off-by: Octavian Purdila <octavian.purdila@intel.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:

committed by
David S. Miller

parent
1a0b20b257
commit
bad93e9d4e
@@ -951,10 +951,13 @@ struct sk_buff *skb_copy(const struct sk_buff *skb, gfp_t gfp_mask)
|
||||
EXPORT_SYMBOL(skb_copy);
|
||||
|
||||
/**
|
||||
* __pskb_copy - create copy of an sk_buff with private head.
|
||||
* __pskb_copy_fclone - create copy of an sk_buff with private head.
|
||||
* @skb: buffer to copy
|
||||
* @headroom: headroom of new skb
|
||||
* @gfp_mask: allocation priority
|
||||
* @fclone: if true allocate the copy of the skb from the fclone
|
||||
* cache instead of the head cache; it is recommended to set this
|
||||
* to true for the cases where the copy will likely be cloned
|
||||
*
|
||||
* Make a copy of both an &sk_buff and part of its data, located
|
||||
* in header. Fragmented data remain shared. This is used when
|
||||
@@ -964,11 +967,12 @@ EXPORT_SYMBOL(skb_copy);
|
||||
* The returned buffer has a reference count of 1.
|
||||
*/
|
||||
|
||||
struct sk_buff *__pskb_copy(struct sk_buff *skb, int headroom, gfp_t gfp_mask)
|
||||
struct sk_buff *__pskb_copy_fclone(struct sk_buff *skb, int headroom,
|
||||
gfp_t gfp_mask, bool fclone)
|
||||
{
|
||||
unsigned int size = skb_headlen(skb) + headroom;
|
||||
struct sk_buff *n = __alloc_skb(size, gfp_mask,
|
||||
skb_alloc_rx_flag(skb), NUMA_NO_NODE);
|
||||
int flags = skb_alloc_rx_flag(skb) | (fclone ? SKB_ALLOC_FCLONE : 0);
|
||||
struct sk_buff *n = __alloc_skb(size, gfp_mask, flags, NUMA_NO_NODE);
|
||||
|
||||
if (!n)
|
||||
goto out;
|
||||
@@ -1008,7 +1012,7 @@ struct sk_buff *__pskb_copy(struct sk_buff *skb, int headroom, gfp_t gfp_mask)
|
||||
out:
|
||||
return n;
|
||||
}
|
||||
EXPORT_SYMBOL(__pskb_copy);
|
||||
EXPORT_SYMBOL(__pskb_copy_fclone);
|
||||
|
||||
/**
|
||||
* pskb_expand_head - reallocate header of &sk_buff
|
||||
|
Reference in New Issue
Block a user