rtc-cmos: Workaround unwanted interrupt generation
Subsystems (3)
v2 cover rtc-cmos: Workaround unwanted interrupt generation
We have observed on few machines with rtc-cmos device that hpet_rtc_interrupt() is called before cmos_do_probe() could call hpet_rtc_timer_init(). It has not been observed during normal boot/reboot of machines. It *sometime* happens when system is booted with kdump secondary kernel. So, neither hpet_default_delta nor hpet_t1_cmp is initialized by the time interrupt is raised in the given situation. Therefore while loop of hpet_cnt_ahead() in hpet_rtc_timer_reinit() never completes. This leads to "NMI watchdog: Watchdog detected hard LOCKUP on cpu 0".
These patch set initializes hpet_default_delta and hpet_t1_cmp before interrupt can be raised.
Changes since RFC:
- Commit log of patches has been improved.
- RFCs were here: https://lkml.org/lkml/2016/6/21/35
Pratyush Anand (2):
rtc/hpet: Factorize hpet_rtc_timer_init()
rtc/rtc-cmos: Initialize software counters before irq is registered
arch/x86/include/asm/hpet.h | 2 ++ arch/x86/kernel/hpet.c | 41 +++++++++++++++++++++++++++++++++++------ drivers/rtc/rtc-cmos.c | 13 ++++++++++++- 3 files changed, 49 insertions(+), 7 deletions(-)
Signature · 11 lines
2.5.5 -- You received this message because you are subscribed to "rtc-linux". Membership options at http://groups.google.com/group/rtc-linux . Please read http://groups.google.com/group/rtc-linux/web/checklist before submitting a driver. --- You received this message because you are subscribed to the Google Groups "rtc-linux" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/d/optout.
PATCH v2 1/2 rtc/hpet: Factorize hpet_rtc_timer_init()
We have observed on few machines with rtc-cmos device that hpet_rtc_interrupt() is called before cmos_do_probe() could call hpet_rtc_timer_init(). It has not been observed during normal boot/reboot of machines. It *sometime* happens when system is booted with kdump secondary kernel. So, neither hpet_default_delta nor hpet_t1_cmp is initialized by the time interrupt is raised in the given situation. Therefore while loop of hpet_cnt_ahead() in hpet_rtc_timer_reinit() never completes. This leads to "NMI watchdog: Watchdog detected hard LOCKUP on cpu 0".
This patch factorize hpet_rtc_timer_init(), so that counter can be initialized before irq is registered.
No functional change in this patch.
--- arch/x86/include/asm/hpet.h | 2 ++ arch/x86/kernel/hpet.c | 41 +++++++++++++++++++++++++++++++++++------ 2 files changed, 37 insertions(+), 6 deletions(-)
arch/x86/include/asm/hpet.h +2 -0
@@ -96,6 +96,8 @@ extern int hpet_set_alarm_time(unsigned char hrs, unsigned char min, unsigned char sec);extern int hpet_set_periodic_freq (unsigned long freq);extern int hpet_rtc_dropped_irq (void ); +extern int hpet_rtc_timer_counter_init (void ); +extern int hpet_rtc_timer_enable (void );extern int hpet_rtc_timer_init (void );extern irqreturn_t hpet_rtc_interrupt (int irq,void *dev_id);extern int hpet_register_irq_handler (rtc_irq_handler handler);
arch/x86/kernel/hpet.c +35 -6
61 lines not on this page · raw message
Signature · 11 lines
2.5.5 -- You received this message because you are subscribed to "rtc-linux". Membership options at http://groups.google.com/group/rtc-linux . Please read http://groups.google.com/group/rtc-linux/web/checklist before submitting a driver. --- You received this message because you are subscribed to the Google Groups "rtc-linux" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/d/optout.
PATCH v2 2/2 rtc/rtc-cmos: Initialize software counters before irq is registered
In reply to Pratyush AnandWe have observed on few machines with rtc-cmos device that hpet_rtc_interrupt() is called before cmos_do_probe() could call hpet_rtc_timer_init(). It has not been observed during normal boot/reboot of machines. It *sometime* happens when system is booted with kdump secondary kernel. So, neither hpet_default_delta nor hpet_t1_cmp is initialized by the time interrupt is raised in the given situation. Therefore while loop of hpet_cnt_ahead() in hpet_rtc_timer_reinit() never completes. This leads to "NMI watchdog: Watchdog detected hard LOCKUP on cpu 0".
Software counters are being initialized in this patch so that LOCKUP could be avoided.
--- drivers/rtc/rtc-cmos.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-)
drivers/rtc/rtc-cmos.c +12 -1
@@ -129,6 +129,16 @@ static inline int hpet_rtc_dropped_irq(void)return 0 ; } +static inline int hpet_rtc_timer_counter_init (void ) +{ +return 0 ; +} + +static inline int hpet_rtc_timer_enable (void ) +{ +return 0 ; +} +static inline int hpet_rtc_timer_init (void ) {return 0 ;
@@ -710,6 +720,7 @@ cmos_do_probe(struct device *dev, struct resource *ports, int rtc_irq) goto cleanup1; } +hpet_rtc_timer_counter_init ();if (is_valid_irq (rtc_irq)) {irq_handler_t rtc_cmos_int_handler;
@@ -732,7 +743,7 @@ cmos_do_probe(struct device *dev, struct resource *ports, int rtc_irq) goto cleanup1; } } -hpet_rtc_timer_init (); +hpet_rtc_timer_enable ();/* export at least the first block of NVRAM */ nvram.size = address_space -NVRAM_OFFSET ;
Signature · 11 lines
2.5.5 -- You received this message because you are subscribed to "rtc-linux". Membership options at http://groups.google.com/group/rtc-linux . Please read http://groups.google.com/group/rtc-linux/web/checklist before submitting a driver. --- You received this message because you are subscribed to the Google Groups "rtc-linux" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/d/optout.