Skip to contentSkip to conversation

How to make a kernel thread sleep for a short amount of time?

DISCUSSION Ben Greear 3 participants 3 messages Jul 4, 2002 – Jul 18, 2002

lore
Share & tools
lore

Ben Greear

author
#0 lore raw

I am re-working the net/core/pktgen code to be a kernel thread.

It is basically working, but I am having trouble making the thread efficiently sleep for durations in the milisecond and micro-second range.

I have looked at the udelay and mdelay methods, but they busy wait.

I do not need absolute real-time precision, so if I ask the thread to sleep for 100 micro-seconds, it is not a big deal if it does not wake up for 5000us. On average, it should be very close to 100us.

I believe the answer may be to use some sort of timer and have my thread sleep on this timer, but I cannot find any examples or documentation on how to do this on the web.

If anyone can point me to some example code or documentation, I would appreciate it.

Thanks,
Ben

Signature · 3 lines
Ben Greear <[email protected]>       <Ben_Greear AT excite.com>
President of Candela Technologies Inc      http://www.candelatech.com
ScryMUD:  http://scry.wanfear.com     http://scry.wanfear.com/~greear
#1 lore raw
Quoted 3 lines · Ben Greear

I believe the answer may be to use some sort of timer and have my thread sleep on this timer, but I cannot find any examples or documentation on how to do this on the web.

The only generally available timer is the timer interrupt, sadly, which ticks once every 10ms (or soon once every ms, according to Linus' bitkeeper tree) on i386.

At OLS I was told of the existence of 'firm timers':
http://www.cse.ogi.edu/~luca/firm.html

These might have use in the shaping world too.

Regards,

bert hubert

Signature · 3 lines
http://www.PowerDNS.com          Versatile DNS Software & Services
http://www.tk                              the dot in .tk
http://lartc.org           Linux Advanced Routing & Traffic Control HOWTO
#2 lore raw
In reply to Ben Greear

I am using high-res timers (http://sourceforge.net/projects/high-res-timers) in a driver to do sub-millisecond timing for a driver I am developing. With high-res timers, I have some code that looks like:

#ifdef CONFIG_HIGH_RES_TIMERS
       /* If the state machine asks for a short delay, then shorten
          the timer timeout. */
       if (kcs_result == KCS_CALL_WITH_DELAY) {
               kcs_timer.sub_expires
                       += usec_to_arch_cycles(KCS_SHORT_TIMEOUT_USEC);
               while (kcs_timer.sub_expires >= cycles_per_jiffies) {
                       kcs_timer.expires++;
                       kcs_timer.sub_expires -= cycles_per_jiffies;
               }
       } else {
               kcs_timer.expires += KCS_TIMEOUT_JIFFIES;
        }
#else
       kcs_timer.expires += KCS_TIMEOUT_JIFFIES;

#endif

But the high-res timers are not in the kernel right now, it's a patch you have to add, and the user has to have it configured.

-Corey

Quoted 22 lines · Ben Greear

I am re-working the net/core/pktgen code to be a kernel thread.

It is basically working, but I am having trouble making the thread efficiently sleep for durations in the milisecond and micro-second range.

I have looked at the udelay and mdelay methods, but they busy wait.

I do not need absolute real-time precision, so if I ask the thread to sleep for 100 micro-seconds, it is not a big deal if it does not wake up for 5000us. On average, it should be very close to 100us.

I believe the answer may be to use some sort of timer and have my thread sleep on this timer, but I cannot find any examples or documentation on how to do this on the web.

If anyone can point me to some example code or documentation, I would appreciate it.

Thanks,
Ben