aboutsummaryrefslogtreecommitdiff
path: root/net/mptcp/protocol.c
diff options
context:
space:
mode:
authorGravatar Paolo Abeni <pabeni@redhat.com> 2021-01-20 15:39:13 +0100
committerGravatar Jakub Kicinski <kuba@kernel.org> 2021-01-22 19:21:02 -0800
commit40dc9416cc957ac8b74d09550a808fabfd4435f8 (patch)
tree605b349dddcb69114b5a8645726fa3387b48dfeb /net/mptcp/protocol.c
parentmptcp: do not queue excessive data on subflows (diff)
downloadlinux-40dc9416cc957ac8b74d09550a808fabfd4435f8.tar.gz
linux-40dc9416cc957ac8b74d09550a808fabfd4435f8.tar.bz2
linux-40dc9416cc957ac8b74d09550a808fabfd4435f8.zip
mptcp: schedule work for better snd subflow selection
Otherwise the packet scheduler policy will not be enforced when pushing pending data at MPTCP-level ack reception time. Reviewed-by: Mat Martineau <mathew.j.martineau@linux.intel.com> Signed-off-by: Paolo Abeni <pabeni@redhat.com> Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Diffstat (limited to 'net/mptcp/protocol.c')
-rw-r--r--net/mptcp/protocol.c11
1 files changed, 8 insertions, 3 deletions
diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c
index e741201acc98..8cb582eee286 100644
--- a/net/mptcp/protocol.c
+++ b/net/mptcp/protocol.c
@@ -2242,6 +2242,7 @@ static void mptcp_worker(struct work_struct *work)
if (unlikely(state == TCP_CLOSE))
goto unlock;
+ mptcp_push_pending(sk, 0);
mptcp_check_data_fin_ack(sk);
__mptcp_flush_join_list(msk);
@@ -2899,10 +2900,14 @@ void __mptcp_check_push(struct sock *sk, struct sock *ssk)
if (!mptcp_send_head(sk))
return;
- if (!sock_owned_by_user(sk))
- __mptcp_subflow_push_pending(sk, ssk);
- else
+ if (!sock_owned_by_user(sk)) {
+ if (mptcp_subflow_get_send(mptcp_sk(sk)) == ssk)
+ __mptcp_subflow_push_pending(sk, ssk);
+ else
+ mptcp_schedule_work(sk);
+ } else {
set_bit(MPTCP_PUSH_PENDING, &mptcp_sk(sk)->flags);
+ }
}
#define MPTCP_DEFERRED_ALL (TCPF_WRITE_TIMER_DEFERRED)