Hi,
  Can you post your kernel module code too. I am interested in knowing which
function in the kernel module does the registration. Do you find anything
suspicious in the dmesg output? Like multiple registration calls etc?

  Namaste,

  Sameer

On 10/3/07, Mohammad M Molla <[EMAIL PROTECTED]> wrote:
>
> Hi
>
> 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
> <http://us.rd.yahoo.com/evt=48256/*http://travel.yahoo.com/;_ylc=X3oDMTFhN2hucjlpBF9TAzk3NDA3NTg5BHBvcwM1BHNlYwNncm91cHMEc2xrA2VtYWlsLW5jbQ-->on
> Yahoo! Travel.
>
>

Reply via email to