aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/rtc/interface.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2012-01-04 10:57:22 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2012-01-04 10:57:22 -0500
commitf423fc627b05f47bc9305f9661630fce30f208f9 (patch)
treef2d9589bc443e99c8843a8ca18c44956d61fcf28 /drivers/rtc/interface.c
parent157e8bf8b4823bfcdefa6c1548002374b61f61df (diff)
Revert "rtc: Expire alarms after the time is set."
This reverts commit 93b2ec0128c431148b216b8f7337c1a52131ef03. The call to "schedule_work()" in rtc_initialize_alarm() happens too early, and can cause oopses at bootup Neil Brown explains why we do it: "If you set an alarm in the future, then shutdown and boot again after that time, then you will end up with a timer_queue node which is in the past. When this happens the queue gets stuck. That entry-in-the-past won't get removed until and interrupt happens and an interrupt won't happen because the RTC only triggers an interrupt when the alarm is "now". So you'll find that e.g. "hwclock" will always tell you that 'select' timed out. So we force the interrupt work to happen at the start just in case." and has a patch that convert it to do things in-process rather than with the worker thread, but right now it's too late to play around with this, so we just revert the patch that caused problems for now. Reported-by: Sander Eikelenboom <linux@eikelenboom.it> Requested-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> Requested-by: John Stultz <john.stultz@linaro.org> Cc: Neil Brown <neilb@suse.de> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'drivers/rtc/interface.c')
-rw-r--r--drivers/rtc/interface.c6
1 files changed, 0 insertions, 6 deletions
diff --git a/drivers/rtc/interface.c b/drivers/rtc/interface.c
index ed35a6b4753f..8e286259a007 100644
--- a/drivers/rtc/interface.c
+++ b/drivers/rtc/interface.c
@@ -73,8 +73,6 @@ int rtc_set_time(struct rtc_device *rtc, struct rtc_time *tm)
73 err = -EINVAL; 73 err = -EINVAL;
74 74
75 mutex_unlock(&rtc->ops_lock); 75 mutex_unlock(&rtc->ops_lock);
76 /* A timer might have just expired */
77 schedule_work(&rtc->irqwork);
78 return err; 76 return err;
79} 77}
80EXPORT_SYMBOL_GPL(rtc_set_time); 78EXPORT_SYMBOL_GPL(rtc_set_time);
@@ -114,8 +112,6 @@ int rtc_set_mmss(struct rtc_device *rtc, unsigned long secs)
114 err = -EINVAL; 112 err = -EINVAL;
115 113
116 mutex_unlock(&rtc->ops_lock); 114 mutex_unlock(&rtc->ops_lock);
117 /* A timer might have just expired */
118 schedule_work(&rtc->irqwork);
119 115
120 return err; 116 return err;
121} 117}
@@ -400,8 +396,6 @@ int rtc_initialize_alarm(struct rtc_device *rtc, struct rtc_wkalrm *alarm)
400 timerqueue_add(&rtc->timerqueue, &rtc->aie_timer.node); 396 timerqueue_add(&rtc->timerqueue, &rtc->aie_timer.node);
401 } 397 }
402 mutex_unlock(&rtc->ops_lock); 398 mutex_unlock(&rtc->ops_lock);
403 /* maybe that was in the past.*/
404 schedule_work(&rtc->irqwork);
405 return err; 399 return err;
406} 400}
407EXPORT_SYMBOL_GPL(rtc_initialize_alarm); 401EXPORT_SYMBOL_GPL(rtc_initialize_alarm);