Two interfaces keep reporting the remaining time of the previous
setting after a timer was disarmed with a zero it_value, until the old
expiry time has passed:

 - timerfd_gettime() for timerfds on CLOCK_REALTIME_ALARM and
   CLOCK_BOOTTIME_ALARM (patch 1). The timerfds on the hrtimer based
   clocks report zero.

 - timer_gettime() for SIGEV_NONE timers on CLOCK_MONOTONIC,
   CLOCK_BOOTTIME, CLOCK_REALTIME and the alarm clocks (patch 2).
   Timers with signal delivery and the CPU time clocks report zero.

In both cases the stale expiry time of a timer which is not queued is
used to compute the remaining time. Patch 1 resets it in alarm_init(),
patch 2 moves it into the past when a SIGEV_NONE timer is disarmed.
Patch 3 adds a test for the second case to the posix_timers selftest.

The first problem was found by reading fs/timerfd.c, the second one
when the test program for the first was extended to POSIX timers.
Both are old: the first exists since timerfd got alarm clock support,
the second is also there in a v6.8 based distribution kernel.

Patch 2 uses the timer_arm() callback with an expiry time of 0 to
reset the stored expiry time, because that needs no new callback. If
a dedicated callback or a different place is preferred, I can redo it
that way.

Tested in qemu (x86_64) on top of mainline a5ebb76233b7 (v7.3-rc6+)
with a program which runs the arm/disarm/gettime sequence on all five
clocks for timerfd and for POSIX timers with SIGEV_SIGNAL and
SIGEV_NONE: 9 wrong results without the series, none with it. The
posix_timers selftest with patch 3 fails the new CLOCK_MONOTONIC test
without patch 2 and passes all 21 tests with it. The patches also
apply to next-20261009.

Shashank Mohan Jain (3):
  alarmtimer: Reset the expiry time in alarm_init()
  posix-timers: Report a disarmed SIGEV_NONE timer as disarmed
  selftests/timers: Test timer_gettime() on a disarmed SIGEV_NONE timer

 kernel/time/alarmtimer.c                      |  1 +
 kernel/time/posix-timers.c                    | 12 +++++-
 tools/testing/selftests/timers/posix_timers.c | 38 ++++++++++++++++++-
 3 files changed, 48 insertions(+), 3 deletions(-)


base-commit: a5ebb76233b79db01e82e061173cb73c6d2b5c6b
-- 
2.43.0


Reply via email to