From: John Stultz <john.stultz@linaro.org>
To: lkml <linux-kernel@vger.kernel.org>
Cc: zhuo-hao <zhuo-hao.lee@intel.com>,
Thomas Gleixner <tglx@linutronix.de>,
Ingo Molnar <mingo@kernel.org>,
Miroslav Lichvar <mlichvar@redhat.com>,
Prarit Bhargava <prarit@redhat.com>,
Richard Cochran <richardcochran@gmail.com>,
John Stultz <john.stultz@linaro.org>
Subject: [PATCH 02/11] alarmtimer: Avoid unexpected rtc interrupt when system resume from S3
Date: Fri, 18 Dec 2015 13:39:07 -0800 [thread overview]
Message-ID: <1450474756-10144-3-git-send-email-john.stultz@linaro.org> (raw)
In-Reply-To: <1450474756-10144-1-git-send-email-john.stultz@linaro.org>
From: zhuo-hao <zhuo-hao.lee@intel.com>
Before the system go to suspend (S3), if user create a timer
with clockid CLOCK_REALTIME_ALARM/CLOCK_BOOTTIME_ALARM and set a
"large" timeout value to this timer. The function
alarmtimer_suspend will be called to setup a timeout value to
RTC timer to avoid the system sleep over time. However, if the
system wakeup early than RTC timeout, the RTC timer will not be
cleared. And this will cause the hpet_rtc_interrupt come
unexpectedly until the RTC timeout. To fix this problem, just
adding alarmtimer_resume to cancel the RTC timer.
This was noticed because the HPET RTC emulation fires an
interrupt every 16ms(=1/2^DEFAULT_RTC_SHIFT) up to the point
where the alarm time is reached.
This program always hits this situation
(https://lkml.org/lkml/2015/11/8/326), if system wake up earlier
than alarm time.
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Miroslav Lichvar <mlichvar@redhat.com>
Cc: Prarit Bhargava <prarit@redhat.com>
Cc: Richard Cochran <richardcochran@gmail.com>
Signed-off-by: Zhuo-hao Lee <zhuo-hao.lee@intel.com>
[jstultz: Tweak commit subject & formatting slightly]
Signed-off-by: John Stultz <john.stultz@linaro.org>
---
kernel/time/alarmtimer.c | 17 +++++++++++++++++
1 file changed, 17 insertions(+)
diff --git a/kernel/time/alarmtimer.c b/kernel/time/alarmtimer.c
index 7fbba635..e840ed86 100644
--- a/kernel/time/alarmtimer.c
+++ b/kernel/time/alarmtimer.c
@@ -271,11 +271,27 @@ static int alarmtimer_suspend(struct device *dev)
__pm_wakeup_event(ws, MSEC_PER_SEC);
return ret;
}
+
+static int alarmtimer_resume(struct device *dev)
+{
+ struct rtc_device *rtc;
+
+ rtc = alarmtimer_get_rtcdev();
+ if (rtc)
+ rtc_timer_cancel(rtc, &rtctimer);
+ return 0;
+}
+
#else
static int alarmtimer_suspend(struct device *dev)
{
return 0;
}
+
+static int alarmtimer_resume(struct device *dev)
+{
+ return 0;
+}
#endif
static void alarmtimer_freezerset(ktime_t absexp, enum alarmtimer_type type)
@@ -800,6 +816,7 @@ out:
/* Suspend hook structures */
static const struct dev_pm_ops alarmtimer_pm_ops = {
.suspend = alarmtimer_suspend,
+ .resume = alarmtimer_resume,
};
static struct platform_driver alarmtimer_driver = {
--
1.9.1
next prev parent reply other threads:[~2015-12-18 21:39 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-12-18 21:39 [PATCH 00/11][GIT PULL] Timekeeping items for 4.5 John Stultz
2015-12-18 21:39 ` [PATCH 01/11] MAINTAINERS: Add entry for kernel/time/alarmtimer.c John Stultz
2015-12-18 21:39 ` John Stultz [this message]
2015-12-18 21:39 ` [PATCH 03/11] time: Avoid signed overflow in timekeeping_get_ns() John Stultz
2015-12-18 21:39 ` [PATCH 04/11] clocksource: Add CPU info to clocksource watchdog reporting John Stultz
2015-12-18 21:39 ` [PATCH 05/11] selftests/timers: fix write return value handlng John Stultz
2015-12-18 21:39 ` [PATCH 06/11] ntp: Verify offset doesn't overflow in ntp_update_offset John Stultz
2015-12-18 21:39 ` [PATCH 07/11] time: Verify time values in adjtimex ADJ_SETOFFSET to avoid overflow John Stultz
2015-12-18 21:39 ` [PATCH 08/11] timekeeping: Provide internal function __ktime_get_real_seconds John Stultz
2015-12-18 21:39 ` [PATCH 09/11] ntp: Change time_reftime to time64_t and utilize 64bit __ktime_get_real_seconds John Stultz
2015-12-18 21:39 ` [PATCH 10/11] ntp: Fix second_overflow's input parameter type to be 64bits John Stultz
2015-12-18 21:39 ` [PATCH 11/11] timekeeping: Cap adjustments so they don't exceed the maxadj value John Stultz
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1450474756-10144-3-git-send-email-john.stultz@linaro.org \
--to=john.stultz@linaro.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@kernel.org \
--cc=mlichvar@redhat.com \
--cc=prarit@redhat.com \
--cc=richardcochran@gmail.com \
--cc=tglx@linutronix.de \
--cc=zhuo-hao.lee@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Powered by JetHome