APPLIED: [VIVID][PATCH] UBUNTU: SAUCE: drivers/rtc/interface.c: ignore exprired times when enqueing new timers (LP: #1333569)
Leann Ogasawara
leann.ogasawara at canonical.com
Tue Jan 6 18:48:34 UTC 2015
Applied to Vivid master-next.
Thanks,
Leann
On Tue, Jan 6, 2015 at 6:05 AM, Colin Ian King <colin.king at canonical.com>
wrote:
> On 06/01/15 12:48, Colin King wrote:
> > From: Colin Ian King <colin.king at canonical.com>
> >
> > The current enqueuing does not trigger an alarm if any expired timers
> > already exist on the timerqueue. This can occur when a RTC wake alarm
> > is used to wake a machine out of hibernate and the resumed state has
> > old expired timers that have not been removed from the timer queue.
> > This fix skips over any expired timers and triggers an alarm if there
> > are no pending timers on the timerqueue.
> >
> > The bug was found running the example RTC timer program from
> > Documentation/rtc.txt; it runs fine before a hibernate but will block
> > forever on RTC reads after a resume from a hibernate that is woken
> > up using a RTC wakealarm.
>
> BugLink: http://bugs.launchpad.net/bugs/1333569
>
> >
> > Signed-off-by: Colin Ian King <colin.king at canonical.com>
> > ---
> > drivers/rtc/interface.c | 16 +++++++++++++++-
> > 1 file changed, 15 insertions(+), 1 deletion(-)
> >
> > diff --git a/drivers/rtc/interface.c b/drivers/rtc/interface.c
> > index 5b2717f..ca9d9fc 100644
> > --- a/drivers/rtc/interface.c
> > +++ b/drivers/rtc/interface.c
> > @@ -780,9 +780,23 @@ EXPORT_SYMBOL_GPL(rtc_irq_set_freq);
> > */
> > 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;
> > +
> > timer->enabled = 1;
> > + __rtc_read_time(rtc, &tm);
> > + now = rtc_tm_to_ktime(tm);
> > +
> > + /* Skip over expired timers */
> > + while (next) {
> > + if (next->expires.tv64 >= now.tv64)
> > + break;
> > + next = timerqueue_iterate_next(next);
> > + }
> > +
> > timerqueue_add(&rtc->timerqueue, &timer->node);
> > - if (&timer->node == timerqueue_getnext(&rtc->timerqueue)) {
> > + if (!next) {
> > struct rtc_wkalrm alarm;
> > int err;
> > alarm.time = rtc_ktime_to_tm(timer->node.expires);
> >
>
>
> --
> kernel-team mailing list
> kernel-team at lists.ubuntu.com
> https://lists.ubuntu.com/mailman/listinfo/kernel-team
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.ubuntu.com/archives/kernel-team/attachments/20150106/100bd2af/attachment.html>
More information about the kernel-team
mailing list