diff options
author | Geliang Tang <tanggeliang@kylinos.cn> | 2024-04-19 15:46:34 +0800 |
---|---|---|
committer | Geliang Tang <tanggeliang@kylinos.cn> | 2024-04-22 10:56:56 +0800 |
commit | 39d5ce64f2287c4d00d6ac0a5d86f465eaec813b (patch) | |
tree | 2d55cebd0a69454ee4dd3e314073056b038f44b9 | |
parent | 496972b8eab5063c7e9182a17f4ec27b45964efd (diff) | |
download | mptcp_net-next-39d5ce64f2287c4d00d6ac0a5d86f465eaec813b.tar.gz |
Revert "mptcp: drop 'first' in __mptcp_subflow_push_pending"
This reverts commit 9d5b4f8a5fc7951d7d347b72b391eaa7f97e3503.
-rw-r--r-- | net/mptcp/protocol.c | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c index 9265a485d8c796..7598f251a94f6b 100644 --- a/net/mptcp/protocol.c +++ b/net/mptcp/protocol.c @@ -1642,7 +1642,7 @@ void __mptcp_push_pending(struct sock *sk, unsigned int flags) mptcp_check_send_data_fin(sk); } -static void __mptcp_subflow_push_pending(struct sock *sk, struct sock *ssk) +static void __mptcp_subflow_push_pending(struct sock *sk, struct sock *ssk, bool first) { struct mptcp_sock *msk = mptcp_sk(sk); struct mptcp_sendmsg_info info = { @@ -1657,6 +1657,19 @@ static void __mptcp_subflow_push_pending(struct sock *sk, struct sock *ssk) struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk); int ret = 0; + /* check for a different subflow usage only after + * spooling the first chunk of data + */ + if (first) { + mptcp_subflow_set_scheduled(subflow, false); + ret = __subflow_push_pending(sk, ssk, &info); + first = false; + if (ret <= 0) + break; + copied += ret; + continue; + } + if (mptcp_sched_get_send(msk)) goto out; @@ -3404,7 +3417,7 @@ void __mptcp_check_push(struct sock *sk, struct sock *ssk) return; if (!sock_owned_by_user(sk)) - __mptcp_subflow_push_pending(sk, ssk); + __mptcp_subflow_push_pending(sk, ssk, false); else __set_bit(MPTCP_PUSH_PENDING, &mptcp_sk(sk)->cb_flags); } @@ -3502,7 +3515,7 @@ void mptcp_subflow_process_delegated(struct sock *ssk, long status) if (status & BIT(MPTCP_DELEGATE_SEND)) { mptcp_data_lock(sk); if (!sock_owned_by_user(sk)) - __mptcp_subflow_push_pending(sk, ssk); + __mptcp_subflow_push_pending(sk, ssk, true); else __set_bit(MPTCP_PUSH_PENDING, &mptcp_sk(sk)->cb_flags); mptcp_data_unlock(sk); |