From nobody Thu Apr 16 16:30:50 2026 X-Original-To: dev-commits-src-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4fxNmd13MDz6ZCMB for ; Thu, 16 Apr 2026 16:30:57 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R12" (not verified)) by mx1.freebsd.org (Postfix) with ESMTPS id 4fxNmc0HSfz3T49 for ; Thu, 16 Apr 2026 16:30:56 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1776357056; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=3TvRydS0dc7vHO7fxP8OfREY1tHYPngZZooznEmpyA8=; b=gS8M3WjQx6GZqBr2nO78dERBYLauU40R53bWB7JBTtJo0qZ8SbPML+g8QEhBZVosimPKWi 9BlsNfQRLqeNuvI8L4eG2omlGefn+9YH9iRZRG0LPctyRIEeVwIM4dJsB0zPZN9ErfPfBR CUdHdIv6EnDzblJiRuuPW3rjFqrnriY6SlOzvFx8IbSE4FRi8w6hKhFaTQf/CWeCAXtynH 7CVPDSBU6SDKRJ9xPK6vO8IbTU+xwT+pXHqbj59nnYpitbQTVuvf3H+PemnattnU75mUWo rZDFbj6pgb/4KdT0FUn3/lQFGp8PVg/yf5xsCsgJi8GT11C2cjIR8z0W/PdeXQ== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1776357056; a=rsa-sha256; cv=none; b=o38fIZZKtGSy9J97cx2qqOgGscxb0cdM74UWZraBu2G6SDwU7riqxw2f4bpRu/ZLC3r7Ko RmzGnM8UNZrb6SUMGwbk6bVTtXAXxQ0qv7oGOnPyZVck1j9Jxt9B8/hufzl0NzJ1TteTFB 8WjRdIlCC3Wy5q+af+rgj+Pyc/qrJGxe0WZ+eIbK5dEB50/q7TBYJG6CXkHA2gM5qSCJQY ySF26uUAw25D2hXeRo/94OUOlL65Dsvr18eqvbJLfhLrzFwfpgve2Fd817ilXG/Dnrc6JR pkkzYhO9omBcVG0NjDLaB5kc3l9dlalEm1YwU7V4CWHCet4TDXi+77ked3RRxg== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1776357056; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=3TvRydS0dc7vHO7fxP8OfREY1tHYPngZZooznEmpyA8=; b=EpjjBYZ7qQjv3/5Gx+BEnzFKtolV24lqPwd1beELpa8y6i+2feleZ3yjwsqzhiUTRgBUk2 9116U5YxM2lqMCOMAj5Xd0JEVhfqJBsHVt/LNU7Fzb8WirMPd39Pe5TuU0F5v39++PdpCa 8/54yJ1L6KyF9OWCTgaNVJf7oZiYKNChwB54xSwbD7ahN93IASvz+zi/vJkJkZtDiEfagC Oibv5imPPybMBL1CDwWjDYeF1BAAnuplAbG9WUAuYMMXggQU3C2cEYYG+aL/SpC38olj/o uzd/FG+RyzaMKd3EeVaYkED6TLLVkBbQ5w1qkUhAPk6Y/SksQIXh3fA7z43Jqg== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4fxNmb6D68zfk for ; Thu, 16 Apr 2026 16:30:55 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 268b7 by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Thu, 16 Apr 2026 16:30:50 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Andrew Gallatin Subject: git: ce33f96fcf2f - main - mlx5e: Ensure rx timestamps are monotonically increasing List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-all@freebsd.org Sender: owner-dev-commits-src-all@FreeBSD.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: gallatin X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: ce33f96fcf2f2d0d49c406274bcc64df72fe530e Auto-Submitted: auto-generated Date: Thu, 16 Apr 2026 16:30:50 +0000 Message-Id: <69e10eba.268b7.77f6bdc6@gitrepo.freebsd.org> The branch main has been updated by gallatin: URL: https://cgit.FreeBSD.org/src/commit/?id=ce33f96fcf2f2d0d49c406274bcc64df72fe530e commit ce33f96fcf2f2d0d49c406274bcc64df72fe530e Author: Andrew Gallatin AuthorDate: 2026-04-16 16:26:07 +0000 Commit: Andrew Gallatin CommitDate: 2026-04-16 16:27:27 +0000 mlx5e: Ensure rx timestamps are monotonically increasing The clock calibration routine currently can result in rx timestamps jumping backwards, which can confuse the TCP stack. Ensure they are monotonically increasing by estimating what we'd calculate as the next timestamp and clamp the calibration so new timestamps are no earlier in time. Reviewed by: kib, nickbanks_netflix.com Tested by: nickbanks_netflix.com Differential Revision: https://reviews.freebsd.org/D56427 Sponsored by: Netflix --- sys/dev/mlx5/mlx5_en/mlx5_en_main.c | 50 +++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/sys/dev/mlx5/mlx5_en/mlx5_en_main.c b/sys/dev/mlx5/mlx5_en/mlx5_en_main.c index fb8b79c8f787..9bcb0dcf8e16 100644 --- a/sys/dev/mlx5/mlx5_en/mlx5_en_main.c +++ b/sys/dev/mlx5/mlx5_en/mlx5_en_main.c @@ -1134,6 +1134,25 @@ mlx5e_hw_clock(struct mlx5e_priv *priv) return (((uint64_t)hw_h << 32) | hw_l); } +/* + * Seed the first calibration point so that base_prev and clbr_hw_prev + * are always valid. Called once during attach before the first + * calibration callout fires. + */ +static void +mlx5e_seed_calibration(struct mlx5e_priv *priv) +{ + struct mlx5e_clbr_point *cp; + struct timespec ts; + + cp = &priv->clbr_points[0]; + cp->clbr_hw_curr = mlx5e_hw_clock(priv); + nanouptime(&ts); + cp->base_curr = mlx5e_timespec2usec(&ts); + cp->clbr_hw_prev = cp->clbr_hw_curr - 1; + cp->base_prev = cp->base_curr - 1; +} + /* * The calibration callout, it runs either in the context of the * thread which enables calibration, or in callout. It takes the @@ -1147,6 +1166,9 @@ mlx5e_calibration_callout(void *arg) struct mlx5e_priv *priv; struct mlx5e_clbr_point *next, *curr; struct timespec ts; + uint64_t hw_delta_new, hw_delta_old; + uint64_t old_nsec, old_projected, old_sec; + uint64_t res_n, res_s, res_s_mod, rt_delta_old; int clbr_curr_next; priv = arg; @@ -1175,6 +1197,33 @@ mlx5e_calibration_callout(void *arg) nanouptime(&ts); next->base_curr = mlx5e_timespec2usec(&ts); + /* + * Ensure monotonicity across calibration transitions. Compute + * what the old calibration would extrapolate to at the new + * hw_curr. If the new base_curr is less, clamp it so the new + * slope is at least as steep as the old one. This prevents + * packets from seeing time go backwards when the slope drops. + * + * Use the same split-seconds technique as mlx5e_mbuf_tstmp() + * to avoid overflowing uint64_t in the multiplication. + */ + hw_delta_new = next->clbr_hw_curr - curr->clbr_hw_curr; + rt_delta_old = curr->base_curr - curr->base_prev; + hw_delta_old = curr->clbr_hw_curr - curr->clbr_hw_prev; + old_sec = hw_delta_new / priv->cclk; + old_nsec = hw_delta_new % priv->cclk; + res_s = old_sec * rt_delta_old; + res_n = old_nsec * rt_delta_old; + res_s_mod = res_s % hw_delta_old; + res_s /= hw_delta_old; + res_s_mod *= priv->cclk; + res_n += res_s_mod; + res_n /= hw_delta_old; + res_s *= priv->cclk; + old_projected = curr->base_curr + res_s + res_n; + if (next->base_curr < old_projected) + next->base_curr = old_projected; + curr->clbr_gen = 0; atomic_thread_fence_rel(); priv->clbr_curr = clbr_curr_next; @@ -4887,6 +4936,7 @@ mlx5e_create_ifp(struct mlx5_core_dev *mdev) callout_init(&priv->tstmp_clbr, 1); /* Pull out the frequency of the clock in hz */ priv->cclk = (uint64_t)MLX5_CAP_GEN(mdev, device_frequency_khz) * 1000ULL; + mlx5e_seed_calibration(priv); mlx5e_reset_calibration_callout(priv); pa.pa_version = PFIL_VERSION;