As tcp_data_queue() function is used just only twice it's better to move out the first check and wrap it with inline. It saves a single call in case the condition evaluated as true.
Signed-off-by: Ilya V. Matveychikov <[email protected]> --- net/ipv4/tcp_input.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index 2920e0c..141a722 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c @@ -4585,16 +4585,12 @@ int tcp_send_rcvq(struct sock *sk, struct msghdr *msg, size_t size) } -static void tcp_data_queue(struct sock *sk, struct sk_buff *skb) +static void __tcp_data_queue(struct sock *sk, struct sk_buff *skb) { struct tcp_sock *tp = tcp_sk(sk); bool fragstolen = false; int eaten = -1; - if (TCP_SKB_CB(skb)->seq == TCP_SKB_CB(skb)->end_seq) { - __kfree_skb(skb); - return; - } skb_dst_drop(skb); __skb_pull(skb, tcp_hdr(skb)->doff * 4); @@ -4703,6 +4699,14 @@ static void tcp_data_queue(struct sock *sk, struct sk_buff *skb) tcp_data_queue_ofo(sk, skb); } +static inline void tcp_data_queue(struct sock *sk, struct sk_buff *skb) +{ + if (TCP_SKB_CB(skb)->seq == TCP_SKB_CB(skb)->end_seq) + __kfree_skb(skb); + else + __tcp_data_queue(sk, skb); +} + static struct sk_buff *tcp_skb_next(struct sk_buff *skb, struct sk_buff_head *list) { if (list) -- 2.7.4
