2005-11-17 15:39:49

by Claudio Scordino

[permalink] [raw]
Subject: A problem with ktimer

Hi,

I know that ktimer is not yet part of the main tree of the Linux kernel.

However, maybe someone can help me to understand why the following code in a
module makes crash my x86_64.

Many thanks,

Claudio



struct ktimer mytimer;

void myfunction()
{
int i;
}


static int module_insert(void)
{
ktime_t mytime = ktime_set(1,0);
mytimer.function = myfunction;
mytimer.data = NULL;
ktimer_init(&mytimer);
ktimer_start(&mytimer, &mytime, KTIMER_REL);
//...
}


2005-11-17 17:30:00

by Steven Rostedt

[permalink] [raw]
Subject: Re: A problem with ktimer

On Thu, 2005-11-17 at 16:39 +0100, Claudio Scordino wrote:
> Hi,
>
> I know that ktimer is not yet part of the main tree of the Linux kernel.
>
> However, maybe someone can help me to understand why the following code in a
> module makes crash my x86_64.
>
> Many thanks,
>
> Claudio
>
>
>
> struct ktimer mytimer;
>
> void myfunction()
> {
> int i;
> }
>
>
> static int module_insert(void)
> {
> ktime_t mytime = ktime_set(1,0);
> mytimer.function = myfunction;
> mytimer.data = NULL;
> ktimer_init(&mytimer);
> ktimer_start(&mytimer, &mytime, KTIMER_REL);
> //...
> }

You must do the ktimer_init first!

So the order must be:

ktimer_init(&mytimer);
mytimer.function = myfunction;
mytimer.data = NULL;
//...

Think of ktimer_init like memset(...) (since it actually does a memset)

You wouldn't do;

struct myvar;

myvar.my_field = 1;
memset(&myvar, 0, sizeof(myvar));

Right ;-)

-- Steve


2006-01-16 14:46:04

by Claudio Scordino

[permalink] [raw]
Subject: ktimer not firing ?

Hi,

I know that ktimer is not yet part of the main tree of the Linux
kernel...

I need an high precision timer in a kernel module for 2.6.14, so I chose to
use ktimers.

My timer must be stopped and reprogrammed very frequently.

This is how I initialize the timer:

struct ktimer mytimer;
ktimer_init(&mytimer);
mytimer.function = myfunction;
mytimer.data = NULL;


This is how I stop the timer:

ktimer_cancel(&mytimer);


This is how I restart the timer:

ktime_t mytime = ktime_set(...,...);
ktimer_start(&mytimer, &mytime, KTIMER_REL)


However, the timer never fires. I checked the return value of the start and
it's correct (0 = success). Any idea of why the timer does not fire ?

I tried also by directly using ktimer_restart instead of ktimer_cancel +
ktimer_start, but the timer does not fire either.
The module has also another ktimer which works perfectly...


Many thanks for your help,

Claudio

2006-01-17 08:04:22

by Thomas Gleixner

[permalink] [raw]
Subject: Re: ktimer not firing ?

On Mon, 2006-01-16 at 09:45 -0500, Claudio Scordino wrote:
> Hi,
>
> I know that ktimer is not yet part of the main tree of the Linux
> kernel...

And will never be. ktimers have been superseeded by hrtimers. The base
patch is merged into Linus tree and the high resolution patch can be
found here:

http://www.tglx.de/projects/hrtimers/2.6.15/

> However, the timer never fires. I checked the return value of the start and
> it's correct (0 = success). Any idea of why the timer does not fire ?

Have you checked the expiry value after you called (re)start? It might
be far in the future.

tglx