I am trying to reigster a hook and then call it from timer interrupt handler do_timer so that I can schedule a tasklet from inside my registered function (It might not have any practical value, but I want to learn the process, scheduling tasklet from timer interrupt context).
Changes I have made in kernel/timer.c to pass the function to register from a kernel module is -
------------------------------------------
--- linux-2.6.22/kernel/timer.c 2007-09-22 21:29:12.000000000 -0400
+++ linux-2.6.22-dev/kernel/timer.c 2007-09-30 22:24:31.000000000 -0400
@@ -895,7 +895,44 @@
update_wall_time();
calc_load(ticks);
}
-
+
+/* Timer hook to use with klife */
+#define CONFIG_GAMEOFLIFE
+
+struct timer_interrupt_hook
+{
+ void (*func)(void*);
+ void* data;
+};
+
+static struct timer_interrupt_hook *timer_interrupt_hook;
+
+int register_timer_interrupt(struct timer_interrupt_hook *hook)
+{
+ pr_debug("registering timer_interrupt_hook (%p), hook->func (%p), hook->data (%p)\n", hook, hook->func, hook->data);
+
+ xchg(&timer_interrupt_hook, hook);
+
+ return 0;
+}
+
+
+void unregister_timer_interrupt(struct timer_interrupt_hook *hook)
+{
+ pr_debug("unregistering timer_interrupt_hook\n");
+
+ xchg(&timer_interrupt_hook, 0);
+}
+
+static void call_timer_hook(void)
+{
+ struct timer_interrupt_hook *hook = timer_interrupt_hook;
+
+ if (hook && hook->func)
+ hook->func(hook->data);
+}
+
+
/*
* The 64-bit jiffies value is not atomic - you MUST NOT read it
* without sampling the sequence number in xtime_lock.
@@ -906,6 +943,10 @@
{
jiffies_64 += ticks;
update_times(ticks);
+
+#ifdef CONFIG_GAMEOFLIFE
+ call_timer_hook();
+#endif
}
#ifdef __ARCH_WANT_SYS_ALARM
@@ -1549,4 +1590,6 @@
return jiffies_to_msecs(timeout);
}
+EXPORT_SYMBOL(register_timer_interrupt);
+EXPORT_SYMBOL(unregister_timer_interrupt);
EXPORT_SYMBOL(msleep_interruptible);
-------------------------------------------------
From a kernel module, I call the register_timer_interrupt to register my hook inside open function of the module and the function currently does not do anything, its empty.
-------------------------------
static void
klife_timer_irq_handler(void *data)
{
}
-------------------------------
But after I open the device node from a userspace program, it freezes the system after a while. However, if I don't register the hook in my module, everything works fine.
Why is registering an empty function and calling it from inside do_timer freezing the system after a short period of good run?
Can anyone help?
Thanks in advance.
- Meraj
Need a vacation? Get great deals to amazing places on Yahoo! Travel.