lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-ID: <1505877751-26566-1-git-send-email-xuyiping@hisilicon.com>
Date:   Wed, 20 Sep 2017 11:22:31 +0800
From:   Xu Yiping <xuyiping@...ilicon.com>
To:     <a.zummo@...ertech.it>, <alexandre.belloni@...e-electrons.com>,
        <linux-rtc@...r.kernel.org>, <linux-kernel@...r.kernel.org>,
        <roy.chenjun@...ilicon.com>, <colin.king@...onical.com>,
        <wanghao24@...wei.com>
Subject: [PATCH] rtc: interface: set the next alarm event appropriately

From: Xu YiPing  <xuyiping@...ilicon.com>

After commit 2b2f5ff00f63 ("rtc: interface: ignore expired timers when
enqueuing new timers"), the rtc_timer_enqueue will not reprogram the RTC
when there is any non-expired timers in the timerqueue. If we set a
RTC_TIMER between now and the next non-expired timers, it won't go into
effect in time.

So, besides ignoring the expired timers, we should take the next effect
timer into account, and reprogram the RTC timer appropriately.

Signed-off-by: Xu YiPing <xuyiping@...ilicon.com>
Signed-off-by: Chen Jun <roy.chenjun@...ilicon.com>
---
 drivers/rtc/interface.c | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)

diff --git a/drivers/rtc/interface.c b/drivers/rtc/interface.c
index 8cec9a0..e237166 100644
--- a/drivers/rtc/interface.c
+++ b/drivers/rtc/interface.c
@@ -766,20 +766,23 @@ static int rtc_timer_enqueue(struct rtc_device *rtc, struct rtc_timer *timer)
 	struct timerqueue_node *next = timerqueue_getnext(&rtc->timerqueue);
 	struct rtc_time tm;
 	ktime_t now;
+	ktime_t next_effect = KTIME_MAX;

 	timer->enabled = 1;
 	__rtc_read_time(rtc, &tm);
 	now = rtc_tm_to_ktime(tm);

-	/* Skip over expired timers */
+	/* Skip over expired timers, get next effect timer */
 	while (next) {
-		if (next->expires >= now)
+		if (next->expires >= now) {
+			next_effect = next->expires;
 			break;
+		}
 		next = timerqueue_iterate_next(next);
 	}

 	timerqueue_add(&rtc->timerqueue, &timer->node);
-	if (!next) {
+	if (timer->node.expires < next_effect) {
 		struct rtc_wkalrm alarm;
 		int err;
 		alarm.time = rtc_ktime_to_tm(timer->node.expires);
--
2.7.4

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ