From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id D5A19C47089 for ; Mon, 5 Dec 2022 18:07:53 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231890AbiLESHv (ORCPT ); Mon, 5 Dec 2022 13:07:51 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:54682 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231810AbiLESHs (ORCPT ); Mon, 5 Dec 2022 13:07:48 -0500 Received: from mx5.didiglobal.com (mx5.didiglobal.com [111.202.70.122]) by lindbergh.monkeyblade.net (Postfix) with SMTP id B57B825CF for ; Mon, 5 Dec 2022 10:07:44 -0800 (PST) Received: from mail.didiglobal.com (unknown [10.79.65.15]) by mx5.didiglobal.com (Maildata Gateway V2.8) with ESMTPS id EF88FB013BE2A; Tue, 6 Dec 2022 02:07:41 +0800 (CST) Received: from zwp-5820-Tower (10.79.65.102) by ZJY02-ACTMBX-05.didichuxing.com (10.79.65.15) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2375.17; Tue, 6 Dec 2022 02:07:41 +0800 Date: Tue, 6 Dec 2022 02:07:36 +0800 X-MD-Sfrom: zhangweiping@didiglobal.com X-MD-SrcIP: 10.79.65.15 From: Weiping Zhang To: , , , , , CC: , Subject: [RFC PATCH] tcp: correct srtt and mdev_us calculation Message-ID: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Disposition: inline X-Originating-IP: [10.79.65.102] X-ClientProxiedBy: ZJY03-PUBMBX-01.didichuxing.com (10.79.71.12) To ZJY02-ACTMBX-05.didichuxing.com (10.79.65.15) Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org >From the comments we can see that, rtt = 7/8 rtt + 1/8 new, but there is an mistake, m -= (srtt >> 3); srtt += m; explain: m -= (srtt >> 3); //use t stands for new m t = m - srtt/8; srtt = srtt + t = srtt + m - srtt/8 = srtt 7/8 + m Test code: #include #define u32 unsigned int static void test_old(u32 srtt, long mrtt_us) { long m = mrtt_us; u32 old = srtt; m -= (srtt >> 3); srtt += m; printf("%s old_srtt: %u mrtt_us: %ld new_srtt: %u\n", __func__, old, mrtt_us, srtt); } static void test_new(u32 srtt, long mrtt_us) { long m = mrtt_us; u32 old = srtt; m = ((m - srtt) >> 3); srtt += m; printf("%s old_srtt: %u mrtt_us: %ld new_srtt: %u\n", __func__, old, mrtt_us, srtt); } int main(int argc, char **argv) { u32 srtt = 100; long mrtt_us = 90; test_old(srtt, mrtt_us); test_new(srtt, mrtt_us); return 0; } ./a.out test_old old_srtt: 100 mrtt_us: 90 new_srtt: 178 test_new old_srtt: 100 mrtt_us: 90 new_srtt: 98 Signed-off-by: Weiping Zhang --- net/ipv4/tcp_input.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index 0640453fce54..0242bb31e1ce 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c @@ -848,7 +848,7 @@ static void tcp_rtt_estimator(struct sock *sk, long mrtt_us) * that VJ failed to avoid. 8) */ if (srtt != 0) { - m -= (srtt >> 3); /* m is now error in rtt est */ + m = (m - srtt >> 3); /* m is now error in rtt est */ srtt += m; /* rtt = 7/8 rtt + 1/8 new */ if (m < 0) { m = -m; /* m is now abs(error) */ @@ -864,7 +864,7 @@ static void tcp_rtt_estimator(struct sock *sk, long mrtt_us) if (m > 0) m >>= 3; } else { - m -= (tp->mdev_us >> 2); /* similar update on mdev */ + m = (m - tp->mdev_us >> 2); /* similar update on mdev */ } tp->mdev_us += m; /* mdev = 3/4 mdev + 1/4 new */ if (tp->mdev_us > tp->mdev_max_us) { -- 2.34.1