On Thu, 17 Jun 2004 15:11:40 +0200, Ingo Molnar wrote:
* Ingo Molnar <mingo@xxxxxxx> wrote:
* Takao Indoh <indou.takao@xxxxxxxxxxxxxxxx> wrote:
It sounds good because change of timer/tasklet code is not needed.
But, I wonder whether this method is safe. For example, if kernel
crashes because of problem of timer, clearing lists may be dangerous
before dumping. Is it possible to clear all timer lists safely?
yes it can be done safely - just INIT_LIST_HEAD() all the timer list
heads - like init_timers_cpu() does.
obviously this only involves the dumping CPU - no other CPU will run any
kernel code. On SMP you should also clear the timer spinlock of the
dumping CPU's timer base, if the crash happened within the timer code.
Ingo
How about this?
void clear_timers(void)
{
int j;
tvec_base_t *base;
base = &per_cpu(tvec_bases, smp_processor_id());
spin_lock_init(&base->lock);
for (j = 0; j < TVN_SIZE; j++) {
INIT_LIST_HEAD(base->tv5.vec + j);
INIT_LIST_HEAD(base->tv4.vec + j);
INIT_LIST_HEAD(base->tv3.vec + j);
INIT_LIST_HEAD(base->tv2.vec + j);
}
for (j = 0; j < TVR_SIZE; j++)
INIT_LIST_HEAD(base->tv1.vec + j);
base->timer_jiffies = jiffies;
}