From nobody Tue Apr 21 15:44:25 2026 X-Original-To: dev-commits-src-branches@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 4g0RVd5nTfz6Wtg4 for ; Tue, 21 Apr 2026 15:44:25 +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 4g0RVd3lV3z3PnW for ; Tue, 21 Apr 2026 15:44:25 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1776786265; 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=nM2P9bEXlg3fhSnOyNCiAxESp3Dd/gNMPunnTlE5RCU=; b=aLoclBjAoSVD7S65Mmod3M4OHVatAzVuINURvm1d3at8ZwjrWI8nI08MvlKqt1dK9EAWsT T5wwMqPUJjpyRYchfTTZMt27FEn4oXum761qe9updmflAkzVJvlhWdTqUufO5BtAZp0RdA 8Rx3X0cgnDp0w3y7LVjz4zlbkdJYv5ANDOlhP/d0tUQLYNV5LFUAxP2TbeJeXqns7WEg5+ LhJgyZP4sSMLNhmzRn4S9jghKburmMAyIUFD+sQ+5iWMqaRZMHSsaeSfe8wIOFUGMdLvrO Z4BN7GEBH6GT25+Qd0gZMrte+wA4UfJQgu1csq3KZbW8d0jWGvrPxEsMrR+T2w== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1776786265; a=rsa-sha256; cv=none; b=CZZCIQoABRT8Jw78BUBsYAb0nkLbpm5sUhZVuHnWHnSBJBELhL96gvAHN0GFETzMLXQfWY AYmeB8C63w3EzXyQ3zC1SouqQXqxlT7uOViEpFiXMaDQJwn8yx7lR6Sk54G94PwO9XtpY+ 4qxnrk9JjqvI+I5pLx1cqH6LVeoJLWz/t0jy6X2Ov4zjEYIBsb5LQH4eLgpxqL2eSAKOcn nEAn3Lz2Ze0sa0EIG/lEwwZGsdLr1aPj7JXEFB9aXFeUn8/GpnsEg5K4m+itQegoO4EKJ+ cUmHMFoKfzrIfs794DyLXZXk6cn0iFPATYdmLcOQ6LL+aCeB1EIU3gl3cPVByw== 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=1776786265; 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=nM2P9bEXlg3fhSnOyNCiAxESp3Dd/gNMPunnTlE5RCU=; b=wnhZIqNpSZnMOeBV4Tjehq5Mf/QDaDU3qg4GhQWPwb3V8F4LvZQ5JQMVQsXwhLfa91aVsx MVtVY3QSDd329vk/ZgfxWpmhQVMnT3q38qylWaMiEVmb4QbSYwFYKKguHf1P7k8AuurH7c ztjFRQzkQHDZqzJjUJ+2gPOIh5gSWhnfdeeLPlrJbYNG948KkYoCe/okTKAllhYViOrrFj sh2bHi15yHuWvWkBDn1CM2zn3WbDHO/g6tlVYDip7JCsjtUtndDxOw5pWXC0cXMsoqY7gg 5rKQMD+V1FIT565nB647OMEQJRl3RjlnWGgtsPL527wbxAoBZyMw39GKTHpTdw== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4g0RVd2bVFzqQ6 for ; Tue, 21 Apr 2026 15:44:25 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 360c8 by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Tue, 21 Apr 2026 15:44:25 +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: b0be1af0c48b - releng/15.0 - timerfd: Fix interval callout scheduling List-Id: Commits to the stable branches of the FreeBSD src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-branches List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-branches@freebsd.org Sender: owner-dev-commits-src-branches@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/15.0 X-Git-Reftype: branch X-Git-Commit: b0be1af0c48b3c326d56fbcb15f57554bf537f53 Auto-Submitted: auto-generated Date: Tue, 21 Apr 2026 15:44:25 +0000 Message-Id: <69e79b59.360c8.1c6f6aa0@gitrepo.freebsd.org> The branch releng/15.0 has been updated by markj: URL: https://cgit.FreeBSD.org/src/commit/?id=b0be1af0c48b3c326d56fbcb15f57554bf537f53 commit b0be1af0c48b3c326d56fbcb15f57554bf537f53 Author: Jake Freeland AuthorDate: 2026-03-20 06:33:03 +0000 Commit: Mark Johnston CommitDate: 2026-04-15 19:02:35 +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. Approved by: so Security: FreeBSD-EN-26:06.timerfd Reviewed by: markj Differential Revision: https://reviews.freebsd.org/D55790 MFC after: 2 weeks (cherry picked from commit 85c0f1a87da1fd1eb3e646e86f70e630c48da91a) (cherry picked from commit 9b785380f307e772eae0df017c982acd81d5879e) --- 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 565ab3ad6ee6..236dfe8bb96a 100644 --- a/sys/kern/sys_timerfd.c +++ b/sys/kern/sys_timerfd.c @@ -393,23 +393,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);