2009-11-02 03:13:48

by loody

[permalink] [raw]
Subject: why kernel implement "udelay" by cpu instructions?

Dear all:
I find the kernel use cpu instruction to implement the udelay function
as keeping decrease a big counter by 1.

If I search the right place in kernel, why kernel does so?
the precision will be different if cpu runs faster or slower, right?
appreciate your help,
miloody


2009-11-02 04:45:33

by Rik van Riel

[permalink] [raw]
Subject: Re: why kernel implement "udelay" by cpu instructions?

On 11/01/2009 10:13 PM, loody wrote:
> Dear all:
> I find the kernel use cpu instruction to implement the udelay function
> as keeping decrease a big counter by 1.
>
> If I search the right place in kernel, why kernel does so?

Because udelay is used in places where the kernel cannot
use other mechanisms, eg. because interrupts are blocked
or the current process cannot be scheduled out.

> the precision will be different if cpu runs faster or slower, right?

At bootup the kernel measures the delay loop speed of
each CPU. CPU frequency scaling might make the loop
run slower at times, but that is okay because udelay
simply specifies a *minimum* delay.

This is true even on systems without frequency scaling,
because the udelay loop could be interrupted by an
interrupt, an NMI or by having the CPU trap into SMM
mode and execute code there.

--
All rights reversed.

2009-11-04 02:19:49

by loody

[permalink] [raw]
Subject: Re: why kernel implement "udelay" by cpu instructions?

Hi

2009/11/2 Rik van Riel <[email protected]>:
> On 11/01/2009 10:13 PM, loody wrote:
>>
>> Dear all:
>> I find the kernel use cpu instruction to implement the udelay function
>> as keeping decrease a big counter by 1.
>>
>> If I search the right place in kernel, why kernel does so?
>
> Because udelay is used in places where the kernel cannot
> use other mechanisms, eg. because interrupts are blocked
> or the current process cannot be scheduled out.

Or the only way to support udelay is using CPU instruction to do the counting?
I find something interesting; kernel has msleep, but it doesn't have usleep.
Does that mean the minimum time kernel can react is msecond instead of usecond?
so if users want to count useconds, they have to do the busy waiting,
execute some looping assembly instructions?

If my consumption is correct, where I can find the evidence?
BTW, does Hz has anything related to kernel timing?
>From the comment in the kernel, it says
Hz: clock ticks generated per second
Does that mean the kernel will get #Hz timer interrupts per second?
Whz the value of Hz is 100?
if the minimum reaction time of kernel is msecond, the value of Hz
should be 1000, right?


>
>> the precision will be different if cpu runs faster or slower, right?
>
> At bootup the kernel measures the delay loop speed of
> each CPU. ?CPU frequency scaling might make the loop

would you please let me know where the source code is?
(measuring loop speed of cpu and scale cpu frequency)

> run slower at times, but that is okay because udelay
> simply specifies a *minimum* delay.
>
> This is true even on systems without frequency scaling,
> because the udelay loop could be interrupted by an
> interrupt, an NMI or by having the CPU trap into SMM
> mode and execute code there.
appreciate your kind help :)
miloody

2009-11-04 05:18:47

by Rajat Jain

[permalink] [raw]
Subject: RE: why kernel implement "udelay" by cpu instructions?

Hi,

> I find something interesting; kernel has msleep, but it
> doesn't have usleep.
> Does that mean the minimum time kernel can react is msecond
> instead of usecond?
> so if users want to count useconds, they have to do the busy waiting,
> execute some looping assembly instructions?

You are roughly right. If you don't want to busy loop (udelay / mdelay), then you will have to sleep. The granularity of this sleep depends on how frequently the timer interrupt ticks (HZ). Thus if HZ is 1000, then you cannot sleep for a period less than 1 msec.

>
> If my consumption is correct, where I can find the evidence?
> BTW, does Hz has anything related to kernel timing?
> From the comment in the kernel, it says
> Hz: clock ticks generated per second
> Does that mean the kernel will get #Hz timer interrupts per second?

Yes.

> Whz the value of Hz is 100? if the minimum reaction time of kernel is
> msecond, the value of Hz should be 1000, right?

Default value of HZ depends on the architecture - and you can change it as well. If HZ is 100, then minimum sleep is 10 ms. If you call msleep(1), you will still sleep for 10 msec atleast - msleep() only guarantees that you will sleep for ATLEAST the time you specified - you may obviously sleep for longer.

>>
>> At bootup the kernel measures the delay loop speed of
>> each CPU. ?CPU frequency scaling might make the loop
>
> would you please let me know where the source code is?
> (measuring loop speed of cpu and scale cpu frequency)

calibrate_delay()


Thanks,

Rajat

2009-11-04 05:37:06

by Bryan Donlan

[permalink] [raw]
Subject: Re: why kernel implement "udelay" by cpu instructions?

On Wed, Nov 4, 2009 at 12:01 AM, Rajat Jain <[email protected]> wrote:
> Hi,
>
>> I find something interesting; kernel has msleep, but it
>> doesn't have usleep.
>> Does that mean the minimum time kernel can react is msecond
>> instead of usecond?
>> so if ?users want to count useconds, they have to do the busy waiting,
>> execute some looping assembly instructions?
>
> You are roughly right. If you don't want to busy loop (udelay / mdelay), then you will have to sleep. The granularity of this sleep depends on how frequently the timer interrupt ticks (HZ). Thus if HZ is 1000, then you cannot sleep for a period less than 1 msec.

I thought hrtimers allow higher-precision wakeups these days?
Of course, if you only want to sleep for a few microseconds, the
context switch might take longer than you want to sleep...

2009-11-04 05:47:23

by Rajat Jain

[permalink] [raw]
Subject: RE: why kernel implement "udelay" by cpu instructions?


Hi,

>
> I thought hrtimers allow higher-precision wakeups these days?
> Of course, if you only want to sleep for a few microseconds, the
> context switch might take longer than you want to sleep...

Yes, that is right. Sorry, I missed that. But that is purely HW
dependent - if your HW providea a high precision timer (Such as HPET on
latest Intel machines), that can be used for quicker sleeps.

Thanks,

Rajat

2009-11-04 14:17:16

by Rik van Riel

[permalink] [raw]
Subject: Re: why kernel implement "udelay" by cpu instructions?

On 11/04/2009 12:36 AM, Bryan Donlan wrote:

> I thought hrtimers allow higher-precision wakeups these days?
> Of course, if you only want to sleep for a few microseconds, the
> context switch might take longer than you want to sleep...

Also, you may not be in a context where you can schedule.

Sometimes drivers need to implement a small delay (to wait
for something on the device) while holding a spinlock or
while interrupts are disabled.

--
All rights reversed.