summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMat Martineau <mathew.j.martineau@linux.intel.com>2020-07-29 01:12:08 +0300
committerDavid S. Miller <davem@davemloft.net>2020-07-29 03:02:42 +0300
commit06827b348b1d43850a63c3e490fe9712c124fa0c (patch)
tree183eefce7826039fd91dd6e8f67db426222e6fb4
parent067a0b3dc52f0f79b9fe64ff8d9bcbb0ffbcf8fc (diff)
downloadlinux-06827b348b1d43850a63c3e490fe9712c124fa0c.tar.xz
mptcp: Skip unnecessary skb extension allocation for bare acks
Bare TCP ack skbs are freed right after MPTCP sees them, so the work to allocate, zero, and populate the MPTCP skb extension is wasted. Detect these skbs and do not add skb extensions to them. Signed-off-by: Mat Martineau <mathew.j.martineau@linux.intel.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--net/mptcp/options.c9
1 files changed, 6 insertions, 3 deletions
diff --git a/net/mptcp/options.c b/net/mptcp/options.c
index b4458ecd01f8..7fa822b55c34 100644
--- a/net/mptcp/options.c
+++ b/net/mptcp/options.c
@@ -868,15 +868,18 @@ void mptcp_incoming_options(struct sock *sk, struct sk_buff *skb,
if (mp_opt.use_ack)
update_una(msk, &mp_opt);
- /* Zero-length packets, like bare ACKs carrying a DATA_FIN, are
- * dropped by the caller and not propagated to the MPTCP layer.
- * Copy the DATA_FIN information now.
+ /* Zero-data-length packets are dropped by the caller and not
+ * propagated to the MPTCP layer, so the skb extension does not
+ * need to be allocated or populated. DATA_FIN information, if
+ * present, needs to be updated here before the skb is freed.
*/
if (TCP_SKB_CB(skb)->seq == TCP_SKB_CB(skb)->end_seq) {
if (mp_opt.data_fin && mp_opt.data_len == 1 &&
mptcp_update_rcv_data_fin(msk, mp_opt.data_seq) &&
schedule_work(&msk->work))
sock_hold(subflow->conn);
+
+ return;
}
mpext = skb_ext_add(skb, SKB_EXT_MPTCP);