[PATCH] rtc: interface: skip the RTC read in rtc_timer_do_work() on an empty queue

From: lirongqing

Date: Thu Nov 05 2026 - 02:38:10 EST


From: Li RongQing <lirongqing@xxxxxxxxx>

After rtc_set_time(), the RTC core schedules rtc->irqwork to re-read
the clock and reprocess the timer queue.

When the timer queue is empty, there is no timer to expire and no
next alarm to program, so reading the RTC is unnecessary. However,
an RTC read can take up to 3ms on some systems, blocking the CPU for
a significant amount of time. Even on faster systems, it can still
take around 50us.

Check whether the timer queue is empty under ops_lock before reading
the RTC. If it is empty, release the lock and return immediately.

Signed-off-by: Li RongQing <lirongqing@xxxxxxxxx>
---
drivers/rtc/interface.c | 5 +++++
1 file changed, 5 insertions(+)

diff --git a/drivers/rtc/interface.c b/drivers/rtc/interface.c
index 96626f8..a65b594 100644
--- a/drivers/rtc/interface.c
+++ b/drivers/rtc/interface.c
@@ -977,6 +977,11 @@ void rtc_timer_do_work(struct work_struct *work)
container_of(work, struct rtc_device, irqwork);

mutex_lock(&rtc->ops_lock);
+ if (!timerqueue_getnext(&rtc->timerqueue)) {
+ pm_relax(rtc->dev.parent);
+ mutex_unlock(&rtc->ops_lock);
+ return;
+ }
again:
err = __rtc_read_time(rtc, &tm);
if (err) {
--
2.9.4