Skip to content

Commit

Permalink
rtc: fix deadlock
Browse files Browse the repository at this point in the history
if get_rtc_time() is _ever_ called with IRQs off, we deadlock badly
in it, waiting for jiffies to increment.

So make the code more robust by doing an explicit mdelay(20).

This solves a very hard to reproduce/debug hard lockup reported
by Mikael Pettersson.

Reported-by: Mikael Pettersson <mikpe@it.uu.se>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
  • Loading branch information
Ingo Molnar committed Aug 23, 2008
1 parent 3c4fbe5 commit 38c052f
Showing 1 changed file with 4 additions and 8 deletions.
12 changes: 4 additions & 8 deletions include/asm-generic/rtc.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
#include <linux/mc146818rtc.h>
#include <linux/rtc.h>
#include <linux/bcd.h>
#include <linux/delay.h>

#define RTC_PIE 0x40 /* periodic interrupt enable */
#define RTC_AIE 0x20 /* alarm interrupt enable */
Expand Down Expand Up @@ -43,7 +44,6 @@ static inline unsigned char rtc_is_updating(void)

static inline unsigned int get_rtc_time(struct rtc_time *time)
{
unsigned long uip_watchdog = jiffies;
unsigned char ctrl;
unsigned long flags;

Expand All @@ -53,19 +53,15 @@ static inline unsigned int get_rtc_time(struct rtc_time *time)

/*
* read RTC once any update in progress is done. The update
* can take just over 2ms. We wait 10 to 20ms. There is no need to
* can take just over 2ms. We wait 20ms. There is no need to
* to poll-wait (up to 1s - eeccch) for the falling edge of RTC_UIP.
* If you need to know *exactly* when a second has started, enable
* periodic update complete interrupts, (via ioctl) and then
* immediately read /dev/rtc which will block until you get the IRQ.
* Once the read clears, read the RTC time (again via ioctl). Easy.
*/

if (rtc_is_updating() != 0)
while (jiffies - uip_watchdog < 2*HZ/100) {
barrier();
cpu_relax();
}
if (rtc_is_updating())
mdelay(20);

/*
* Only the values that we read from the RTC are set. We leave
Expand Down

0 comments on commit 38c052f

Please sign in to comment.