aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGeliang Tang <tanggeliang@kylinos.cn>2024-04-19 15:46:34 +0800
committerGeliang Tang <tanggeliang@kylinos.cn>2024-04-22 10:56:56 +0800
commit39d5ce64f2287c4d00d6ac0a5d86f465eaec813b (patch)
tree2d55cebd0a69454ee4dd3e314073056b038f44b9
parent496972b8eab5063c7e9182a17f4ec27b45964efd (diff)
downloadmptcp_net-next-39d5ce64f2287c4d00d6ac0a5d86f465eaec813b.tar.gz
Revert "mptcp: drop 'first' in __mptcp_subflow_push_pending"
This reverts commit 9d5b4f8a5fc7951d7d347b72b391eaa7f97e3503.
-rw-r--r--net/mptcp/protocol.c19
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);