diff options
-rw-r--r-- | net/ipv4/tcp_input.c | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index a5934c4c8cd4..70b892db9901 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c | |||
@@ -4461,6 +4461,12 @@ coalesce_done: | |||
4461 | skb = NULL; | 4461 | skb = NULL; |
4462 | goto add_sack; | 4462 | goto add_sack; |
4463 | } | 4463 | } |
4464 | /* Can avoid an rbtree lookup if we are adding skb after ooo_last_skb */ | ||
4465 | if (!before(seq, TCP_SKB_CB(tp->ooo_last_skb)->end_seq)) { | ||
4466 | parent = &tp->ooo_last_skb->rbnode; | ||
4467 | p = &parent->rb_right; | ||
4468 | goto insert; | ||
4469 | } | ||
4464 | 4470 | ||
4465 | /* Find place to insert this segment. Handle overlaps on the way. */ | 4471 | /* Find place to insert this segment. Handle overlaps on the way. */ |
4466 | parent = NULL; | 4472 | parent = NULL; |
@@ -4503,7 +4509,7 @@ coalesce_done: | |||
4503 | } | 4509 | } |
4504 | p = &parent->rb_right; | 4510 | p = &parent->rb_right; |
4505 | } | 4511 | } |
4506 | 4512 | insert: | |
4507 | /* Insert segment into RB tree. */ | 4513 | /* Insert segment into RB tree. */ |
4508 | rb_link_node(&skb->rbnode, parent, p); | 4514 | rb_link_node(&skb->rbnode, parent, p); |
4509 | rb_insert_color(&skb->rbnode, &tp->out_of_order_queue); | 4515 | rb_insert_color(&skb->rbnode, &tp->out_of_order_queue); |