All of lore.kernel.org
 help / color / mirror / Atom feed
* why kernel implement "udelay" by cpu instructions?
@ 2009-11-02  3:13 loody
  2009-11-02  4:45 ` Rik van Riel
  0 siblings, 1 reply; 7+ messages in thread
From: loody @ 2009-11-02  3:13 UTC (permalink / raw)
  To: linux-kernel, Kernel Newbies

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

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: why kernel implement "udelay" by cpu instructions?
  2009-11-02  3:13 why kernel implement "udelay" by cpu instructions? loody
@ 2009-11-02  4:45 ` Rik van Riel
  2009-11-04  2:19   ` loody
  0 siblings, 1 reply; 7+ messages in thread
From: Rik van Riel @ 2009-11-02  4:45 UTC (permalink / raw)
  To: loody; +Cc: linux-kernel, Kernel Newbies

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.

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: why kernel implement "udelay" by cpu instructions?
  2009-11-02  4:45 ` Rik van Riel
@ 2009-11-04  2:19   ` loody
  2009-11-04  5:01     ` Rajat Jain
  0 siblings, 1 reply; 7+ messages in thread
From: loody @ 2009-11-04  2:19 UTC (permalink / raw)
  To: Rik van Riel; +Cc: linux-kernel, Kernel Newbies

Hi

2009/11/2 Rik van Riel <riel@redhat.com>:
> 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

^ permalink raw reply	[flat|nested] 7+ messages in thread

* RE: why kernel implement "udelay" by cpu instructions?
  2009-11-04  2:19   ` loody
@ 2009-11-04  5:01     ` Rajat Jain
  2009-11-04  5:36       ` Bryan Donlan
  0 siblings, 1 reply; 7+ messages in thread
From: Rajat Jain @ 2009-11-04  5:01 UTC (permalink / raw)
  To: loody, Rik van Riel; +Cc: linux-kernel, Kernel Newbies

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

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: why kernel implement "udelay" by cpu instructions?
  2009-11-04  5:01     ` Rajat Jain
@ 2009-11-04  5:36       ` Bryan Donlan
  2009-11-04  5:45         ` Rajat Jain
  2009-11-04 14:16         ` Rik van Riel
  0 siblings, 2 replies; 7+ messages in thread
From: Bryan Donlan @ 2009-11-04  5:36 UTC (permalink / raw)
  To: Rajat Jain; +Cc: loody, Rik van Riel, linux-kernel, Kernel Newbies

On Wed, Nov 4, 2009 at 12:01 AM, Rajat Jain <Rajat.Jain@infogain.com> 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...

^ permalink raw reply	[flat|nested] 7+ messages in thread

* RE: why kernel implement "udelay" by cpu instructions?
  2009-11-04  5:36       ` Bryan Donlan
@ 2009-11-04  5:45         ` Rajat Jain
  2009-11-04 14:16         ` Rik van Riel
  1 sibling, 0 replies; 7+ messages in thread
From: Rajat Jain @ 2009-11-04  5:45 UTC (permalink / raw)
  To: Bryan Donlan; +Cc: loody, Rik van Riel, linux-kernel, Kernel Newbies


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

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: why kernel implement "udelay" by cpu instructions?
  2009-11-04  5:36       ` Bryan Donlan
  2009-11-04  5:45         ` Rajat Jain
@ 2009-11-04 14:16         ` Rik van Riel
  1 sibling, 0 replies; 7+ messages in thread
From: Rik van Riel @ 2009-11-04 14:16 UTC (permalink / raw)
  To: Bryan Donlan; +Cc: Rajat Jain, loody, linux-kernel, Kernel Newbies

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.

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2009-11-04 14:17 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2009-11-02  3:13 why kernel implement "udelay" by cpu instructions? loody
2009-11-02  4:45 ` Rik van Riel
2009-11-04  2:19   ` loody
2009-11-04  5:01     ` Rajat Jain
2009-11-04  5:36       ` Bryan Donlan
2009-11-04  5:45         ` Rajat Jain
2009-11-04 14:16         ` Rik van Riel

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.