From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail.openvz.org (mail.openvz.org [69.168.225.77]) by lore.virtuozzo.com (Postfix) with ESMTPS id AF70481299 for ; Fri, 6 Nov 2026 03:04:36 +0000 (UTC) Received: from mail.openvz.org (localhost [127.0.0.1]) by mail.openvz.org (8.14.4/8.14.4) with ESMTP id 6A633PNu012757; Fri, 6 Nov 2026 06:03:26 +0300 DKIM-Filter: OpenDKIM Filter v2.11.0 mail.openvz.org 6A633PNu012757 Authentication-Results: mail.openvz.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=virtuozzo.com header.i=@virtuozzo.com header.b="D4jyqATz" Received: from mail-wm1-f70.google.com (mail-wm1-f70.google.com [209.85.128.70]) by mail.openvz.org (8.14.4/8.14.4) with ESMTP id 6A63395C012707 (version=TLSv1/SSLv3 cipher=AES128-GCM-SHA256 bits=128 verify=FAIL) for ; Fri, 6 Nov 2026 06:03:10 +0300 DKIM-Filter: OpenDKIM Filter v2.11.0 mail.openvz.org 6A63395C012707 Received: by mail-wm1-f70.google.com with SMTP id 5b1f17b1804b1-4a80bd45e1cso492395e9.3 for ; Thu, 05 Nov 2026 19:03:10 -0800 (PST) X-Gm-Message-State: APuU4Z8q2slqQGLqHesyg3IzptXi4lBWqm2lxZBg9pBTxCKimnZtODnK 9s3y8Jr7yBUBii8/5EHnb9bKA/kx1dbsOm0SHmhyg6k4gMCRM3/mp/bc3guefDqDyoBVI5iytLe ik4NoRu1rvKuaRUkXKDdHxtze0/6IrJLHQOP6H6zKVbNWcDhXymIS3A== X-Gm-Gg: AYBFou1QXUYYlK5g2xrKiU/bVwoBP+feD6rPyzr1XLXKito5PgErBjhtgZF0Yc7VKH7 YX8P9CqS0S80XCuHOnTPPNE00DBmrBUVfDr8duTkadn4m4tt6UniYZkyc9x6IB3Sy7/i/1bMBNT msfqwfRypXg1oZzCEgot4Pl8HVTzfTQjwsZHgtyWnkzDPFpp+LAHTsaGDysmhw6f5a4dTKTPGkb vAc9sXZdlXj5nMkw1BzbQLcVVPW6yAcVMQoaQttUHra2d+cdNwLasXqnTBD4RcOzBALCx2xV9oC C5edug1/yUc/GMUIhiGCuDZDa9AiLOGmPL3I1EVQGootQlSuAp7cm8MCY5eviJYhHZ6E0kNyEt3 ePnxHIWPjnwTeZgAr29YTp/Bd X-Received: by 2002:a05:600c:1552:b0:4b2:3c81:d1 with SMTP id 5b1f17b1804b1-4b6ddee32eemr14329655e9.5.1793934189685; Thu, 05 Nov 2026 19:03:09 -0800 (PST) X-Received: by 2002:a05:600c:1552:b0:4b2:3c81:d1 with SMTP id 5b1f17b1804b1-4b6ddee32eemr14329445e9.5.1793934189205; Thu, 05 Nov 2026 19:03:09 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1793934189; cv=none; d=google.com; s=arc-20260327; b=STcRBdkcYM8xYF43hzYztW/cT13VVvJ5xGkqoxls9nyXI0iqnVsamds6ttb8tREMN8 BZjxwKbGqAo0PYBXsMcd8hOs9ELUSvvLj+8wky/aA910XJLe6A5HbNTskVHPiv6rukGp +CtH4F9N5sn7pXLr7F0nWJxrDY9D7evQmqRKiEQzEHr/uN3kSH0JSkHRMN9t5So5TLiA NbIMFv7HaP+1phgMbzlTl6T7VxAql6FOZ3Egm+VSoslw0HoKICmqhMSoERe7hjZ8T92z MfGcCebMtXe5cjZQZ9UPPxeMJYKc7k8VZb1DarRyPvMIggtfJhnCN1aNlFk5JwAg/m/K KHjA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20260327; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:dkim-signature; bh=CJNWYrufgz0joxkT+T//saLp59l8Byo3W6EE8O0M3bg=; fh=WpT6aB7RBAGHZeWZzqAr71yzRFbPTYkPWKsRagLn48Q=; b=ZfPwxFinS66Heds5+I7F5EiYxmcxThGFFTkK8bTyJnHhfUM4aBYxibW39FwpeeKOzd C77hm0NzbwXfDd8GhjCHy2Fp28tnNP+DtlwfmcWHj0DG6o7patL0eLdTvMonVRvkgGbl nKfCbovp1rggXAZz0aH8+2F1exUIQc4tw/AZVsNjHrmJEySUjK5k0RUCYmN6oOGP7V6a LT4h6JIszZpTg1PH9woRaV3bjFiKb95oOr24TGm80aBG8YwpVT+KGuFI388H7wfH8enU /LJs8wcn4dFZmyi3yESrJLZei6OsNhIlvqn18Hx+VIOb0Fbn078mlclLNM1I5jyfbRMW qxkw==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@virtuozzo.com header.s=relay header.b=D4jyqATz; spf=pass (google.com: domain of eva.kurchatova@virtuozzo.com designates 130.117.225.111 as permitted sender) smtp.mailfrom=eva.kurchatova@virtuozzo.com; dmarc=pass (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=virtuozzo.com Received: from relay.virtuozzo.com (relay.virtuozzo.com. [130.117.225.111]) by mx.google.com with ESMTPS id ffacd0b85a97d-492d7eb14f1si963319f8f.373.2026.11.05.19.03.09 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 05 Nov 2026 19:03:09 -0800 (PST) Received-SPF: pass (google.com: domain of eva.kurchatova@virtuozzo.com designates 130.117.225.111 as permitted sender) client-ip=130.117.225.111; Authentication-Results: mx.google.com; dkim=pass header.i=@virtuozzo.com header.s=relay header.b=D4jyqATz; spf=pass (google.com: domain of eva.kurchatova@virtuozzo.com designates 130.117.225.111 as permitted sender) smtp.mailfrom=eva.kurchatova@virtuozzo.com; dmarc=pass (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=virtuozzo.com DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=virtuozzo.com; s=relay; h=MIME-Version:Message-ID:Date:Subject:From: Content-Type; bh=CJNWYrufgz0joxkT+T//saLp59l8Byo3W6EE8O0M3bg=; b=D4jyqATzcRne wsXabpWJ9ui0gSpdS+ZUBk+hu8zP82lA15eA053kKswW5uN6uW1pgEuls/caCcV0YF+cvB6IUaiJa meBs64bu7mG2MwQfbLzYlhDW6Kdi6YECaTAp0wfMBt5I6zkr1GupFNlv16inuoHxMQdXfKBdxvSlN M6yfRNZoXMBCavauv1YwNJ5Z94UoAZQuBPX4OzN1Ggkx/GdzUtLz0K2dPG5PVrnD77B4dOJ5cltbq DtWaqXE/x/Xlt5a2YUdvS3iluv8FA2iLjZryFkVOPxctBf1f7HvCPppoesXT4TeV02Jioh3OdWgpM 50db5zIyRWJ3JXk/FnR8fw==; Received: from ch-vpn.virtuozzo.com ([130.117.225.6] helo=LekKit-T14) by relay.virtuozzo.com with esmtp (Exim 4.96) (envelope-from ) id 1xPAAP-00Gfia-2I; Fri, 06 Nov 2026 04:03:05 +0100 From: Eva Kurchatova To: khorenko@virtuozzo.com Date: Fri, 6 Nov 2026 05:02:12 +0200 Message-ID: <20261106030306.16014-5-eva.kurchatova@virtuozzo.com> X-Mailer: git-send-email 2.56.0 In-Reply-To: <20261106030306.16014-1-eva.kurchatova@virtuozzo.com> References: <20261106030306.16014-1-eva.kurchatova@virtuozzo.com> MIME-Version: 1.0 X-OZ-Fwd: true Cc: devel@openvz.org Subject: [Devel] [PATCH hci-8.1 4/8] ms/mptcp: let the retrans scheduler do its job X-BeenThere: devel@openvz.org X-Mailman-Version: 2.1.12 Precedence: list List-Id: OpenVZ development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: devel-bounces@openvz.org Errors-To: devel-bounces@openvz.org From: Paolo Abeni Currently the MPTCP core enforces that when MPTCP-level retrans timer fires, at most a single dfrag is retransmitted. In some corner-cases, it may be necessary to retransmit multiple dfrags, and the MPTCP socket will need to wait multiple retrans timeout to accomplish that. Remove the mentioned constraint, allowing to transmit multiple dfrags per retrans period, as long as the scheduler keeps selecting subflows for retransmissions and pending data is available in the rtx queue. The default scheduler will transmit a dfrag per available subflow. Tested-by: Gang Yan Tested-by: Geliang Tang Acked-by: Geliang Tang Signed-off-by: Paolo Abeni Signed-off-by: Matthieu Baerts (NGI0) Link: https://patch.msgid.link/20260807-net-next-mptcp-oooq-pruning-v3-3-dbc1eb853cc3@kernel.org Signed-off-by: Jakub Kicinski (cherry picked from commit 96d846e3e2a7ea01ff8a584a0b5e2a42fa9ccc1e) https://virtuozzo.atlassian.net/browse/VSTOR-153491 Feature: fix ms/net Signed-off-by: Eva Kurchatova --- net/mptcp/protocol.c | 106 ++++++++++++++++++++++++++++++------------- 1 file changed, 75 insertions(+), 31 deletions(-) diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c index 838b18bc19c9..2dcce47a1ef7 100644 --- a/net/mptcp/protocol.c +++ b/net/mptcp/protocol.c @@ -1000,13 +1000,6 @@ static void __mptcp_clean_una_wakeup(struct sock *sk) mptcp_write_space(sk); } -static void mptcp_clean_una_wakeup(struct sock *sk) -{ - mptcp_data_lock(sk); - __mptcp_clean_una_wakeup(sk); - mptcp_data_unlock(sk); -} - static void mptcp_enter_memory_pressure(struct sock *sk) { struct mptcp_subflow_context *subflow; @@ -2577,8 +2570,12 @@ static void mptcp_check_fastclose(struct mptcp_sock *msk) sk_error_report(sk); } -/* Retransmit the specified data fragment on all the selected subflows. */ -static int __mptcp_push_retrans(struct sock *sk, struct mptcp_data_frag *dfrag) +/* + * Retransmit the specified data fragment on all the selected subflows, + * starting from the specified sequence + */ +static int __mptcp_push_retrans(struct sock *sk, struct mptcp_data_frag *dfrag, + u64 sent_seq) { struct mptcp_sendmsg_info info = { .data_lock_held = true, }; struct mptcp_sock *msk = mptcp_sk(sk); @@ -2588,6 +2585,7 @@ static int __mptcp_push_retrans(struct sock *sk, struct mptcp_data_frag *dfrag) mptcp_for_each_subflow(msk, subflow) { if (READ_ONCE(subflow->scheduled)) { + u16 offset = sent_seq - dfrag->data_seq; u16 copied = 0; mptcp_subflow_set_scheduled(subflow, false); @@ -2597,7 +2595,7 @@ static int __mptcp_push_retrans(struct sock *sk, struct mptcp_data_frag *dfrag) lock_sock(ssk); /* limit retransmission to the bytes already sent on some subflows */ - info.sent = 0; + info.sent = offset; info.limit = READ_ONCE(msk->csum_enabled) ? dfrag->data_len : dfrag->already_sent; @@ -2643,45 +2641,91 @@ static void __mptcp_retrans(struct sock *sk) struct mptcp_sock *msk = mptcp_sk(sk); struct mptcp_subflow_context *subflow; struct mptcp_data_frag *dfrag; + u64 retrans_seq, sent_seq; + bool need_retrans; int err, len; mptcp_pm_chk_stale(msk); - mptcp_clean_una_wakeup(sk); - - err = mptcp_sched_get_retrans(msk); + /* Get an updated and consistent rtx queue status. */ + mptcp_data_lock(sk); + __mptcp_clean_una_wakeup(sk); + retrans_seq = msk->snd_una; dfrag = mptcp_rtx_head(sk); - if (!dfrag) { + need_retrans = !!dfrag; + mptcp_data_unlock(sk); + + for (;;) { + bool already_acked; + + err = mptcp_sched_get_retrans(msk); + if (err) + break; + + /* `already_sent` can be 0 for `dfrag` belonging to the RTX + * queue due to __mptcp_retransmit_pending_data(). + */ + if (!dfrag || !dfrag->already_sent) + break; + + /* Can fail only in case of fallback. */ + len = __mptcp_push_retrans(sk, dfrag, retrans_seq); + if (len < 0) + goto clear_scheduled; + + retrans_seq += len; + msk->bytes_retrans += len; + dfrag->already_sent = max_t(u16, dfrag->already_sent, + retrans_seq - dfrag->data_seq); + + /* With csum enabled, retransmission can send new data. */ + sent_seq = dfrag->already_sent + dfrag->data_seq; + if (after64(sent_seq, msk->snd_nxt)) + WRITE_ONCE(msk->snd_nxt, sent_seq); + + /* Attempt the next fragment only if the current one is + * completely retransmitted. + */ + if (before64(retrans_seq, dfrag->data_seq + dfrag->data_len)) + break; + + dfrag = list_is_last(&dfrag->list, &msk->rtx_queue) ? + NULL : list_next_entry(dfrag, list); + if (!dfrag) + break; + + /* Incoming acks can move snd_una after the current dfrag + * across loop iterations, if so start again from RTX head. + */ + mptcp_data_lock(sk); + already_acked = !before64(msk->snd_una, dfrag->data_seq + + dfrag->already_sent); + if (already_acked) { + __mptcp_clean_una_wakeup(sk); + retrans_seq = msk->snd_una; + dfrag = mptcp_rtx_head(sk); + need_retrans = !!dfrag; + } else if (after64(msk->snd_una, retrans_seq)) { + retrans_seq = msk->snd_una; + } + mptcp_data_unlock(sk); + } + + /* Attempt data-fin retransmission only when the RTX queue is empty. */ + if (!need_retrans) { if (mptcp_data_fin_enabled(msk)) { struct inet_connection_sock *icsk = inet_csk(sk); icsk->icsk_retransmits++; mptcp_set_datafin_timeout(sk); mptcp_send_ack(msk); - goto reset_timer; } if (!mptcp_send_head(sk)) goto clear_scheduled; - - goto reset_timer; } - if (err) - goto reset_timer; - - len = __mptcp_push_retrans(sk, dfrag); - if (len < 0) - goto clear_scheduled; - - msk->bytes_retrans += len; - dfrag->already_sent = max(dfrag->already_sent, len); - - /* With csum enabled retransmission can send new data. */ - if (after64(dfrag->already_sent + dfrag->data_seq, msk->snd_nxt)) - WRITE_ONCE(msk->snd_nxt, dfrag->already_sent + dfrag->data_seq); - reset_timer: mptcp_check_and_set_pending(sk); -- 2.56.0 _______________________________________________ Devel mailing list Devel@openvz.org https://lists.openvz.org/mailman/listinfo/devel