From nobody Tue Apr 21 15:46:00 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 4g0RXT5Pn7z6Wv8Q for ; Tue, 21 Apr 2026 15:46:01 +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 "R13" (not verified)) by mx1.freebsd.org (Postfix) with ESMTPS id 4g0RXT0j0Tz3SkY for ; Tue, 21 Apr 2026 15:46:01 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1776786361; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=xFdbnRb5g1jAzNDbw0kAoso8M9kyxM6F9bQRbR/S0Vo=; b=d35UjDZhVhtX6gKomkHU4l13OOsj1BhMemNzRAOI/lsqVTYYUCE8dH7yNPCVs39PaR5Ft5 mee4OY/KlExA7uGh3Whh97tbLB1SBPlxvf6mEPKl/bSP7BtsFrN0qMcGkCJeomhmm2FiXg 3rcPK9MWRebxozVab+RLxj9kVPyZNnGgOGHjOpRvwu+dmkgDfQ8wmkoFHkr+oKckYjES2i lJydD+jPqAmse+gJkvadIYMyerK4x5NOTMtwc47bhKotk/abdmc5y19vXWwP9G71h7Fsdk M6T6pOsE+HnKNCd8FfSNNa5wBW7M1Qhln3y1QAwL1/avcRsg1BkDrWTG1/lAJg== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1776786361; a=rsa-sha256; cv=none; b=DXBXF0oKcIaiAYTt+BNtgAnr8zRjw7cSFjh5Cb4OA++cR8MCqa/MAk6toBXO/FteFVZPDr Vof6AmLm0CJ637hn/T2FOF3hsbrLxEhqMoQ0IoEfpBpNn8jQA6ofic86izw1GB43wHDqyE BvB2MaJ5fE3BTMRddIVKG3j8ld9j49nPkdtn7nGKTwH48X1aB6bnfQgUBlOqhQGIIG0UOj TIbItTuz86EabcFDSWtvQjhZk3gdcsaSgm3HppFQxu/R8BEstXmDqauw3EeoYrVflF0n/u d9em1Tcu/UxOWRRk+98dfVhd3S5e5MIFNDog0QTHL7s//Y7x5figcHAJhvjVNw== 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=1776786361; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=xFdbnRb5g1jAzNDbw0kAoso8M9kyxM6F9bQRbR/S0Vo=; b=xUs25m5U99bvBM99D7lczNTCn0nI9MHZrHE5Q6CKadytE7DqP0Kg+/3EgLk6qnrrSZ5p0+ FybkD8qkse6Or8cQyET1qJGHs/YPdlFL7r1URyjmX7r6VO6IEIBjcwnCaWcrz3/4KHHHnh thCCer9Yc2MEdK+zaJkB4otxpmHG67Bp7rkAJQD/q3x4WYQTYC952aN7MCKggvA84/Xilv 9THKpxaGzXf2ma80HJVK5dd+nHzeeQ7h8qIjCvfzGfB4k26kRNCXZ0hFmMveS7tFCNrbl/ 1P54Swht+fo3FIH5n6S/OjQChTzhzHBM/ZuLQjpYeIGK7bDopuj0wdiwhmCeHA== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4g0RXS6jw4zr15 for ; Tue, 21 Apr 2026 15:46:00 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 347c9 by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Tue, 21 Apr 2026 15:46:00 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org Cc: Jake Freeland From: Mark Johnston Subject: git: f37c6e3a133e - releng/14.3 - timerfd: Fix interval callout scheduling 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: markj X-Git-Repository: src X-Git-Refname: refs/heads/releng/14.3 X-Git-Reftype: branch X-Git-Commit: f37c6e3a133e37c742b23ba646b710492603bc51 Auto-Submitted: auto-generated Date: Tue, 21 Apr 2026 15:46:00 +0000 Message-Id: <69e79bb8.347c9.365d6235@gitrepo.freebsd.org> The branch releng/14.3 has been updated by markj: URL: https://cgit.FreeBSD.org/src/commit/?id=f37c6e3a133e37c742b23ba646b710492603bc51 commit f37c6e3a133e37c742b23ba646b710492603bc51 Author: Jake Freeland AuthorDate: 2026-03-20 06:33:03 +0000 Commit: Mark Johnston CommitDate: 2026-04-21 15:45:50 +0000 timerfd: Fix interval callout scheduling When a timerfd interval callout misses its scheduled activation time, a differential is calculated based on the actual activation time and the scheduled activation time. This differential is divided by the timerfd's interval time and the quotient is added to the timerfd's counter. Before this change, the next callout was scheduled to activate at: scheduled activation time + timerfd interval. This change fixes the scheduling of the next callout to activate at: actual activation time + timerfd interval - remainder. Security: FreeBSD-26:06.timerfd Approved by: so Reviewed by: markj Differential Revision: https://reviews.freebsd.org/D55790 MFC after: 2 weeks (cherry picked from commit 85c0f1a87da1fd1eb3e646e86f70e630c48da91a) (cherry picked from commit 3c00f603a2801fd780666f9e94a26f264a887c90) --- sys/kern/sys_timerfd.c | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/sys/kern/sys_timerfd.c b/sys/kern/sys_timerfd.c index ab7e048a2ab1..59c554f2dba8 100644 --- a/sys/kern/sys_timerfd.c +++ b/sys/kern/sys_timerfd.c @@ -394,23 +394,25 @@ static void timerfd_expire(void *arg) { struct timerfd *tfd = (struct timerfd *)arg; - struct timespec uptime; + sbintime_t exp, interval, now, next, diff; ++tfd->tfd_count; tfd->tfd_expired = true; if (timespecisset(&tfd->tfd_time.it_interval)) { + exp = tstosbt(tfd->tfd_time.it_value); + interval = tstosbt(tfd->tfd_time.it_interval); + now = sbinuptime(); + next = now + interval; + /* Count missed events. */ - nanouptime(&uptime); - if (timespeccmp(&uptime, &tfd->tfd_time.it_value, >)) { - timespecsub(&uptime, &tfd->tfd_time.it_value, &uptime); - tfd->tfd_count += tstosbt(uptime) / - tstosbt(tfd->tfd_time.it_interval); + if (now > exp) { + diff = now - exp; + tfd->tfd_count += diff / interval; + next -= diff % interval; } - timespecadd(&tfd->tfd_time.it_value, - &tfd->tfd_time.it_interval, &tfd->tfd_time.it_value); - callout_schedule_sbt(&tfd->tfd_callout, - tstosbt(tfd->tfd_time.it_value), - 0, C_ABSOLUTE); + + callout_schedule_sbt(&tfd->tfd_callout, next, 0, C_ABSOLUTE); + tfd->tfd_time.it_value = sbttots(next); } else { /* Single shot timer. */ callout_deactivate(&tfd->tfd_callout);