net: introduce __skb_header_release()
While profiling TCP stack, I noticed one useless atomic operation in tcp_sendmsg(), caused by skb_header_release(). It turns out all current skb_header_release() users have a fresh skb, that no other user can see, so we can avoid one atomic operation. Introduce __skb_header_release() to clearly document this. This gave me a 1.5 % improvement on TCP_RR workload. Signed-off-by: Eric Dumazet <edumazet@google.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
aebac74493
commit
f4a775d144
@@ -1083,6 +1083,7 @@ static inline int skb_header_cloned(const struct sk_buff *skb)
|
||||
* Drop a reference to the header part of the buffer. This is done
|
||||
* by acquiring a payload reference. You must not read from the header
|
||||
* part of skb->data after this.
|
||||
* Note : Check if you can use __skb_header_release() instead.
|
||||
*/
|
||||
static inline void skb_header_release(struct sk_buff *skb)
|
||||
{
|
||||
@@ -1091,6 +1092,20 @@ static inline void skb_header_release(struct sk_buff *skb)
|
||||
atomic_add(1 << SKB_DATAREF_SHIFT, &skb_shinfo(skb)->dataref);
|
||||
}
|
||||
|
||||
/**
|
||||
* __skb_header_release - release reference to header
|
||||
* @skb: buffer to operate on
|
||||
*
|
||||
* Variant of skb_header_release() assuming skb is private to caller.
|
||||
* We can avoid one atomic operation.
|
||||
*/
|
||||
static inline void __skb_header_release(struct sk_buff *skb)
|
||||
{
|
||||
skb->nohdr = 1;
|
||||
atomic_set(&skb_shinfo(skb)->dataref, 1 + (1 << SKB_DATAREF_SHIFT));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* skb_shared - is the buffer shared
|
||||
* @skb: buffer to check
|
||||
|
||||
Reference in New Issue
Block a user