Skip to content

Commit

Permalink
CRISv32: Better handling of watchdog bite
Browse files Browse the repository at this point in the history
Don't enter watchdog handling if we're already in watchdog handling.

Also some minor formatting tweaks.

Signed-off-by: Jesper Nilsson <[email protected]>
  • Loading branch information
Jesper Nilsson committed Dec 19, 2014
1 parent dbd3c7e commit d6517c4
Showing 1 changed file with 17 additions and 11 deletions.
28 changes: 17 additions & 11 deletions arch/cris/arch-v32/kernel/time.c
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,6 @@ static int __init etrax_init_cont_rotime(void)
}
arch_initcall(etrax_init_cont_rotime);


unsigned long timer_regs[NR_CPUS] =
{
regi_timer0,
Expand All @@ -69,9 +68,8 @@ unsigned long timer_regs[NR_CPUS] =
extern int set_rtc_mmss(unsigned long nowtime);

#ifdef CONFIG_CPU_FREQ
static int
cris_time_freq_notifier(struct notifier_block *nb, unsigned long val,
void *data);
static int cris_time_freq_notifier(struct notifier_block *nb,
unsigned long val, void *data);

static struct notifier_block cris_time_freq_notifier_block = {
.notifier_call = cris_time_freq_notifier,
Expand All @@ -88,7 +86,6 @@ unsigned long get_ns_in_jiffie(void)
return ns;
}


/* From timer MDS describing the hardware watchdog:
* 4.3.1 Watchdog Operation
* The watchdog timer is an 8-bit timer with a configurable start value.
Expand All @@ -110,11 +107,18 @@ static short int watchdog_key = 42; /* arbitrary 7 bit number */
* is used though, so set this really low. */
#define WATCHDOG_MIN_FREE_PAGES 8

/* for reliable NICE_DOGGY behaviour */
static int bite_in_progress;

void reset_watchdog(void)
{
#if defined(CONFIG_ETRAX_WATCHDOG)
reg_timer_rw_wd_ctrl wd_ctrl = { 0 };

#if defined(CONFIG_ETRAX_WATCHDOG_NICE_DOGGY)
if (unlikely(bite_in_progress))
return;
#endif
/* Only keep watchdog happy as long as we have memory left! */
if(nr_free_pages() > WATCHDOG_MIN_FREE_PAGES) {
/* Reset the watchdog with the inverse of the old key */
Expand Down Expand Up @@ -149,7 +153,9 @@ void handle_watchdog_bite(struct pt_regs *regs)
#if defined(CONFIG_ETRAX_WATCHDOG)
extern int cause_of_death;

nmi_enter();
oops_in_progress = 1;
bite_in_progress = 1;
printk(KERN_WARNING "Watchdog bite\n");

/* Check if forced restart or unexpected watchdog */
Expand All @@ -171,6 +177,7 @@ void handle_watchdog_bite(struct pt_regs *regs)
printk(KERN_WARNING "Oops: bitten by watchdog\n");
show_registers(regs);
oops_in_progress = 0;
printk("\n"); /* Flush mtdoops. */
#ifndef CONFIG_ETRAX_WATCHDOG_NICE_DOGGY
reset_watchdog();
#endif
Expand Down Expand Up @@ -203,7 +210,7 @@ static inline irqreturn_t timer_interrupt(int irq, void *dev_id)
/* Reset watchdog otherwise it resets us! */
reset_watchdog();

/* Update statistics. */
/* Update statistics. */
update_process_times(user_mode(regs));

cris_do_profile(regs); /* Save profiling information */
Expand All @@ -214,7 +221,7 @@ static inline irqreturn_t timer_interrupt(int irq, void *dev_id)

/* Call the real timer interrupt handler */
xtime_update(1);
return IRQ_HANDLED;
return IRQ_HANDLED;
}

/* Timer is IRQF_SHARED so drivers can add stuff to the timer irq chain. */
Expand Down Expand Up @@ -294,14 +301,13 @@ void __init time_init(void)

#ifdef CONFIG_CPU_FREQ
cpufreq_register_notifier(&cris_time_freq_notifier_block,
CPUFREQ_TRANSITION_NOTIFIER);
CPUFREQ_TRANSITION_NOTIFIER);
#endif
}

#ifdef CONFIG_CPU_FREQ
static int
cris_time_freq_notifier(struct notifier_block *nb, unsigned long val,
void *data)
static int cris_time_freq_notifier(struct notifier_block *nb,
unsigned long val, void *data)
{
struct cpufreq_freqs *freqs = data;
if (val == CPUFREQ_POSTCHANGE) {
Expand Down

0 comments on commit d6517c4

Please sign in to comment.