From nobody Thu Apr 16 16:30:50 2026 X-Original-To: dev-commits-src-main@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 4fxNmW0WYTz6ZC39 for ; Thu, 16 Apr 2026 16:30:51 +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 4fxNmV5vwcz3SgN for ; Thu, 16 Apr 2026 16:30:50 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1776357050; 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=WRves781H409y4Ju7yKsaMoTt0LjpgEHCXjE+qcg5DmW5KHKAc5rSt+ILiRngMWrxvgWyA FNTPHHwD7/wYnVOndQnu/QDVxCXxstHBBD4zxx5DkHOOLGGRLmeHTeTFU00mXI+b4wXa7m IiskwbXLzhOxn6O43bS3r3vovE8tbhOsjb0CWgSiY/beET1OPoZljdQThXjWDidmOubMTs ywn8taB+DAMZ39I+7KvKjuJskkoEtDXsC4ZZLNBbcKKA4Ok/6cJ1hTm9SIkFpSuZcM4ZDA GTW7wVfMFp7nvYNcvKO1k0/kRklmeI+jCorvUbWk+jAzicjHOdvt5y75Lfq64A== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1776357050; a=rsa-sha256; cv=none; b=Duv+7YifJvB7sOwZ6THHh4mJ5tqu8ZEuEhQhoVhYhC9ko/KuCXqksiuFoeO3rUbU26Us1T Y32XUxghNCzEkklTF4s06kBDXAiFDnXapVVROUbDBACemSNNhwzv6IsNwKZ4K2hTgyCFNr ANHyoOPHx1B7zSfn8ttvCM23f+zbaY7ZZMqgFfLiFdVpInoM0YyTzhjHT58D4V+823lKCB W4QD/rqzaBIzjDuqjyHUXHbH4jUF9Xpbc5FIHCuXd3pN1nTF1iX/eJq584Y0ymDPu++Lj1 yf9oV+8iycgTuebUN+jIDss4ADMxVp6TmTW9DXp8vaCi1KBQrFVn71MVGY+rHA== 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=1776357050; 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=kbRw9/78YVohrWczvdzc/dBsTI1zJZYfstlgWEayicHX8/50Rjhr8n0A/LbOPOXoGCiyac lPKsbq2fR5HUlar/QW1RCULDVW/amdI8l8nRTOIhVNgVhq+zOH1PQjZkhXfPE8UNHXMccD GeTq4rQcmBKtxXFRsk+nQcxYRHhNQEw0iPbcJ07XGpmJlR5IubZx7aF5BWj7IEuTuTt/jt 364Fn+oqoksla6QVV8X64FSNHZYZoihXJbf7K5PzKzMdLix9Wg+WZlITeUoPtITzYVTMFX XS5c65FnFHUpa7sdR9RZbE3WkUYp/MbF41m84AXvgssr0GgHUFgMsrbhQIe7Uw== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4fxNmV5LB4z14Z for ; Thu, 16 Apr 2026 16:30:50 +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 the main branch of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-main List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-main@freebsd.org Sender: owner-dev-commits-src-main@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;