linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Andrea Arcangeli <andrea@suse.de>
To: Nish Aravamudan <nish.aravamudan@gmail.com>
Cc: linux-os@analogic.com, Andrew Morton <akpm@osdl.org>,
	kernel@kolivas.org, pavel@suse.cz, linux-kernel@vger.kernel.org
Subject: Re: dynamic-hz
Date: Tue, 14 Dec 2004 19:29:00 +0100	[thread overview]
Message-ID: <20041214182900.GM16322@dualathlon.random> (raw)
In-Reply-To: <29495f1d04121409422add6024@mail.gmail.com>

On Tue, Dec 14, 2004 at 09:42:02AM -0800, Nish Aravamudan wrote:
> Sorry for my lack of clarity :) I was referring more to the second
> part of what you said, that the "meaning" of yield() changed for 2.6

The meaning of yield didn't really change. The behaviour changed a bit
to allow scalability even if more than one task is polling for a
resource (potentially even the _same_ resource) using yield().

But if you were using yield() in 2.4 you shouldn't change to anything
different than yield() in 2.6. If you get bad latencies under load in
2.6, it's simply a gentle reminder that using yield() is always a bad
idea ;).

NPTL converted the yield() loops in the slow path of the pthread_mutex to
even driven futex, otherwise 2.6 behaviour would break a lot more than
OOo.

In my 2.4-aa I've a sysctl to switch yield between two 2.4/2.6
behaviours. The new behaviour broke OOo and all linthread apps for
example, so it was necessary to use a sysctl to control it, even if the
new yield() behaviour is more correct because it has a chance to scala
under load.

Ingo may want to correct me if I remember wrong, I discussed this stuff
with him at the time.

> and thus shouldn't be used to wait for short times (see kerneljanitors
> TODO reference from Matthew Wilcox (search for yield in page):
> http://www.kerneljanitors.org/TODO).

The 2.4 yield() could introduce significant latencies too if more than
one task was looping in yield at the same time for different resources.

> From the context of the TODO, it seems yield() and schedule_timeout()
> should not be considered alternatives for each other. Maybe someone
> can clarify?

It depends what you're doing. yield() and __set_current_state(..);
schedule_timeout(1) are similar. I don't think schedule_timeout(0) makes
much sense (but in practice it works very similarly to
schedule_timeout(1)). The former will pool ASAP by guaranteeing the CPU
won't go idle. The latter will make the CPU go idle and it'll wait
between 1/HZ sec and 2/HZ sec.

The point is that polling is wrong and you should register into a
waitqueue and then __set_current_state(..); schedule(). This is exactly
what NPTL did too, and as far as I can tell it's pratically the most
noticeable feature for optimally written threaded apps. The
yield/schedule_timeout(1)-without-registering-in-callbacks are just
tricks for some special code.  For example I used myself
schedule_timeout(1) in the oom killer patch a few days ago, but that
code runs only when the machine is out of memory and several tasks will
try to kill something at the same time. At that time the cpu load really
doesn't matter. So tricks like that are ok in corner cases where
performance cannot matter at all. For fast paths or regular code, yield
should not be used (and schedule_timeout(1) used as as yield won't be
much better).

Conceptually if you want to poll as soon as possible you should use
yield(). If you want to wait and give some idle time to the cpu you
should use schedule_timeout().

You should ignore the claim that yield isn't appropriate in 2.6 for
waiting short periods of time, yield is still the API to use for polling
while keeping the cpu busy. If the machine is overloaded then it will
take a while to get back to the polling loop with 2.6, but then 2.4 had
other corner cases with the machine overloaded by userspace tasks
calling sched_yield too. So it's not really that much different in terms
of the guarantees that yield can provide between 2.4/2.6. The only
guarantee that yield can provide is that the cpu will remain busy, and
that you'll be rescheduled if some other task is pending in the
runqueue. It can't provide any guarantee on when you'll become running
again.

> > I guess we could change schedule_timeout() to WARN_ON if 0 is being
> > passed to it.
> 
> I will see if anyone is actually calling with 0 -- I don't remember

It's not that bad, I mean schedule_timeout(0) works fine, but once in a
while it may not wait anything and just return after invoking a timer
callback. So if somebody uses schedule_timeout, it's because he wants
always to make the cpu go idle for a little bit, and in turn it would be
better to use 1 (0 doesn't guarantee to go idle).

> seeing this for my previous sets of patches, but it may happen if HZ
> changes in value.

The HZ errors are just due the lack of roundup, and schedule_timeout
can't do anything about it, only the caller can (it's a problem even for
other HZ values that generate rounding errors, and that's why HZ=100 and
HZ=1000 are the only two really supported frequencies to freely switch
at boot time ;).

  reply	other threads:[~2004-12-14 18:29 UTC|newest]

Thread overview: 126+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2004-12-11 14:23 dynamic-hz Andrea Arcangeli
2004-12-11 14:50 ` dynamic-hz Zwane Mwaikambo
2004-12-12  6:57   ` dynamic-hz Andrea Arcangeli
2004-12-11 21:41 ` dynamic-hz Jan Engelhardt
2004-12-12 16:35 ` dynamic-hz Pavel Machek
2004-12-12 22:23   ` dynamic-hz Andrea Arcangeli
2004-12-12 23:36     ` dynamic-hz Con Kolivas
2004-12-12 23:42       ` dynamic-hz Pavel Machek
2004-12-13  0:09         ` dynamic-hz Con Kolivas
2004-12-13  8:37           ` dynamic-hz Jan Engelhardt
2004-12-13 10:43           ` dynamic-hz Pavel Machek
2004-12-13 11:08             ` dynamic-hz Andrea Arcangeli
2004-12-13 19:36               ` dynamic-hz john stultz
2004-12-12 23:43       ` dynamic-hz Andrea Arcangeli
2004-12-13  0:18         ` dynamic-hz Con Kolivas
2004-12-13  0:27           ` dynamic-hz Andrea Arcangeli
2004-12-13  1:50             ` dynamic-hz Zwane Mwaikambo
2004-12-13 11:28               ` dynamic-hz Andrea Arcangeli
2004-12-13 12:43                 ` dynamic-hz Pavel Machek
2004-12-13 12:58                   ` dynamic-hz Andrea Arcangeli
2004-12-13 19:12                     ` dynamic-hz Pavel Machek
2004-12-13 20:34                       ` dynamic-hz john stultz
2004-12-13 20:49                         ` dynamic-hz Pavel Machek
2004-12-14  2:04                           ` dynamic-hz Andrea Arcangeli
     [not found]                           ` <20041214013924.GB14617@atomide.com>
2004-12-14  9:37                             ` dynamic-hz Pavel Machek
2004-12-14 21:18                               ` dynamic-hz Tony Lindgren
2004-12-14 22:06                                 ` dynamic-hz Pavel Machek
2004-12-14 23:00                                   ` dynamic-hz linux-os
2004-12-14 23:13                                     ` dynamic-hz Tony Lindgren
2004-12-22 20:02                                       ` dynamic-hz Tony Lindgren
2004-12-14 23:04                                   ` dynamic-hz Tony Lindgren
2004-12-14  2:46                         ` dynamic-hz Andrea Arcangeli
2004-12-14 19:24                           ` dynamic-hz john stultz
2004-12-14  2:36                       ` dynamic-hz Andrea Arcangeli
2004-12-14  9:39                         ` dynamic-hz Pavel Machek
2004-12-14  9:59                         ` dynamic-hz Pavel Machek
2004-12-14 15:25                           ` dynamic-hz Andrea Arcangeli
2004-12-14 22:02                             ` USB making time drift [was Re: dynamic-hz] Pavel Machek
2004-12-14 23:16                               ` Andrea Arcangeli
2004-12-15  2:59                                 ` Gene Heskett
2004-12-15  9:17                                   ` Andrea Arcangeli
2004-12-15 16:44                                     ` Gene Heskett
2004-12-15 18:20                                       ` Andrea Arcangeli
2004-12-16  1:59                                         ` Gene Heskett
2004-12-16 11:30                                           ` Andrea Arcangeli
2004-12-16 12:50                                           ` Alan Cox
2004-12-15 20:16                                       ` Pavel Machek
2004-12-16  2:02                                         ` Gene Heskett
2004-12-15 17:03                                     ` Gene Heskett
2004-12-15 17:48                                       ` Tim Schmielau
2004-12-16  2:03                                         ` Gene Heskett
2004-12-16  0:58                                 ` Pavel Machek
2004-12-16  2:33                                   ` john stultz
2004-12-16  1:15                               ` Time goes crazy in 2.6.9 after long cli [was Re: USB making time drift] Pavel Machek
2004-12-16 11:13                                 ` Andrea Arcangeli
2004-12-16 12:49                                   ` Alan Cox
2004-12-13 14:50                 ` dynamic-hz Zwane Mwaikambo
2004-12-13  7:43       ` dynamic-hz Stefan Seyfried
2004-12-13 13:58         ` dynamic-hz Russell King
2004-12-13 14:14           ` dynamic-hz Russell King
2004-12-13 14:52           ` dynamic-hz Alan Cox
2004-12-13 16:23             ` dynamic-hz Russell King
2004-12-13 17:53               ` dynamic-hz Michael Buesch
2004-12-13 18:04                 ` dynamic-hz Russell King
2004-12-13 19:04               ` dynamic-hz Pavel Machek
2004-12-13 20:11               ` dynamic-hz Russell King
2004-12-14  0:16             ` dynamic-hz Eric St-Laurent
2004-12-15 18:04               ` dynamic-hz Alan Cox
2004-12-15 19:54                 ` dynamic-hz linux-os
2004-12-16  2:17                   ` dynamic-hz Gene Heskett
2004-12-16 12:42                     ` dynamic-hz linux-os
2004-12-17 20:12                     ` dynamic-hz H. Peter Anvin
2004-12-16  9:10                 ` dynamic-hz Gabriel Paubert
2004-12-16 12:17                   ` dynamic-hz Geert Uytterhoeven
2004-12-16 14:00                   ` dynamic-hz Mitchell Blank Jr
2004-12-13 15:30           ` dynamic-hz Zwane Mwaikambo
2004-12-13 15:59             ` dynamic-hz Russell King
2004-12-13 16:14               ` dynamic-hz Pavel Machek
2004-12-13 16:06           ` dynamic-hz Pavel Machek
2004-12-13 16:19         ` dynamic-hz Jan Engelhardt
2004-12-13  8:29       ` dynamic-hz Jan Engelhardt
2004-12-14 22:54         ` dynamic-hz Lee Revell
2004-12-14 23:38           ` dynamic-hz Chris Friesen
2004-12-15  8:32             ` dynamic-hz Jan Engelhardt
2004-12-13 11:02       ` dynamic-hz Andrew Morton
2004-12-13 11:17         ` dynamic-hz Andrea Arcangeli
2004-12-13 11:25           ` dynamic-hz Andrew Morton
2004-12-13 11:47             ` dynamic-hz Andrea Arcangeli
2004-12-14  3:56               ` dynamic-hz Nish Aravamudan
2004-12-14  3:54             ` dynamic-hz Nish Aravamudan
2004-12-14  4:29               ` dynamic-hz Andrew Morton
2004-12-14  5:25                 ` dynamic-hz Nish Aravamudan
2004-12-17 20:10                 ` dynamic-hz Nish Aravamudan
2004-12-14 10:01               ` dynamic-hz Domen Puncer
2004-12-14 16:56                 ` dynamic-hz Nish Aravamudan
2004-12-14 14:23               ` dynamic-hz linux-os
2004-12-14 16:54                 ` dynamic-hz Nish Aravamudan
2004-12-14 17:15                   ` dynamic-hz Andrea Arcangeli
2004-12-14 17:42                     ` dynamic-hz Nish Aravamudan
2004-12-14 18:29                       ` Andrea Arcangeli [this message]
2004-12-14 19:00                         ` dynamic-hz Nish Aravamudan
2004-12-14 18:22                     ` dynamic-hz linux-os
2004-12-14 18:38                       ` dynamic-hz Andrea Arcangeli
2004-12-14 18:50                       ` dynamic-hz Pavel Machek
2004-12-13 11:19         ` dynamic-hz Hans Kristian Rosbach
2004-12-13 11:22           ` dynamic-hz Pavel Machek
2004-12-13 11:39             ` dynamic-hz Andrea Arcangeli
2004-12-13 12:51             ` dynamic-hz Hans Kristian Rosbach
2004-12-13 13:01               ` dynamic-hz Andrea Arcangeli
2004-12-13 13:02                 ` dynamic-hz Andrea Arcangeli
2004-12-13 15:06               ` dynamic-hz Geert Uytterhoeven
2004-12-13 16:12                 ` dynamic-hz Pavel Machek
2004-12-13 16:14                   ` dynamic-hz Geert Uytterhoeven
2004-12-14  4:06                   ` dynamic-hz Nish Aravamudan
2004-12-14  4:05               ` dynamic-hz Nish Aravamudan
2004-12-13 11:33           ` dynamic-hz Andrea Arcangeli
2004-12-13 14:38           ` dynamic-hz Zwane Mwaikambo
2004-12-13 12:00       ` dynamic-hz Alan Cox
2004-12-13 15:52         ` dynamic-hz Andrea Arcangeli
2004-12-14 22:28       ` dynamic-hz Lee Revell
2004-12-14 22:40         ` dynamic-hz Con Kolivas
2004-12-14 22:50           ` dynamic-hz Lee Revell
2004-12-13 20:26 ` dynamic-hz Olaf Hering
2004-12-13 22:41   ` dynamic-hz Andrea Arcangeli
2004-12-13 20:56 ` dynamic-hz john stultz
2004-12-13 22:21   ` dynamic-hz Andrea Arcangeli

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20041214182900.GM16322@dualathlon.random \
    --to=andrea@suse.de \
    --cc=akpm@osdl.org \
    --cc=kernel@kolivas.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-os@analogic.com \
    --cc=nish.aravamudan@gmail.com \
    --cc=pavel@suse.cz \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).