From: Imre Deak <imre.deak@intel.com>
To: Jean Delvare <khali@linux-fr.org>
Cc: linux-kernel@vger.kernel.org,
Andrew Morton <akpm@linux-foundation.org>,
Daniel Vetter <daniel.vetter@ffwll.ch>,
John Stultz <john.stultz@linaro.org>,
Ingo Molnar <mingo@kernel.org>, Arnd Bergmann <arnd@arndb.de>,
"David S. Miller" <davem@davemloft.net>
Subject: Re: [PATCH 01/11] time: add *_to_jiffies_min helpers to guarantee a minimum duration
Date: Mon, 13 May 2013 16:07:52 +0300 [thread overview]
Message-ID: <1368450472.16445.118.camel@intelbox> (raw)
In-Reply-To: <20130513142812.0a606a75@endymion.delvare>
On Mon, 2013-05-13 at 14:28 +0200, Jean Delvare wrote:
> Hi Imre,
>
> On Mon, 13 May 2013 14:27:28 +0300, Imre Deak wrote:
> > On Mon, 2013-05-13 at 09:29 +0200, Jean Delvare wrote:
> > > Hi Imre,
> > >
> > > On Fri, 10 May 2013 15:13:19 +0300, Imre Deak wrote:
> > > > The *_to_jiffies(x) macros return a jiffy value, which if used as a
> > > > delta to wait for a specific amount of time, may result in a wait-time
> > > > that is less than x.
> > >
> > > Are you sure? I have always considered that *_to_jiffies(x) macros
> > > rounded up, and reading the code seems to confirm that:
> > >
> > > /*
> > > * Generic case - multiply, round and divide. (...)
> > > */
> > > (...)
> > > return (MSEC_TO_HZ_MUL32 * m + MSEC_TO_HZ_ADJ32)
> > > >> MSEC_TO_HZ_SHR32;
> > >
> > > What makes you think the resulting wait time can be less that requested?
> >
> > Yes the above does a round-up, but for another reason. It makes only
> > sure you won't wait less than the requested time because you have a too
> > coarse HZ value. So for example with HZ=1000 it won't do any adjustment,
> > but with HZ=100 it'll round up durations not dividable by 10 msec.
>
> For HZ=1000 the code above is never reached, the code which is executed
> instead is:
>
> /*
> * HZ is equal to or smaller than 1000, and 1000 is a nice
> * round multiple of HZ, divide with the factor between them,
> * but round upwards:
> */
> return (m + (MSEC_PER_SEC / HZ) - 1) / (MSEC_PER_SEC / HZ);
>
> which simplifies to just:
>
> return m;
>
> So indeed no round up of any kind. Thanks for the clarification.
>
> > What the proposed change wants to solve is how - or rather what point in
> > time - the returned value is used. For example in the following loop to
> > wait for some condition to become true:
> >
> > timeout = msecs_to_jiffies(1);
> > while (!condition && timeout) {
> > prepare_to_wait(wq, ...);
> > timeout = schedule_timeout(timeout);
> > }
> >
> > it would seem we'll wait at least 1 msec for the condition to become
> > true. In fact with HZ=1000 and an initial timeout value of 1 we may wait
> > less, since schedule_timeout() will return with 0 already at the next
> > scheduling clock tick which is most probably less than 1 msec ahead in
> > time.
>
> OK, I see your point now.
>
> But maybe your example code is not good in the first place. I don't
> think you should use schedule_timeout() for such a small wait time.
> Aren't you supposed to use HR timers instead?
The problem would be still there even with a longer wait time.
msecs_to_jiffies(n) above only guarantees n-1 msecs minimum wait time.
This kind of loop - and the wait_for_event_timeout() family of functions
where it is embedded - care only about a lower bound to the wait time,
and since HR timers are costlier they would only add unneeded overhead
here.
> > > If this really is the case then the proper way to address the issue is
> > > to fix the original macros, not introducing new ones.
> >
> > I'm not sure if we need the adjustment in all cases. For example in the
> > following polling loop we'd like to wake up every msec (to check for
> > something not signaled through the wq) and time out after 50 iterations:
> >
> > for (i = 0; i < 50; i++) {
> > prepare_to_wait(wq, ...);
> > if (condition)
> > break;
> > schedule_timeout(msecs_to_jiffies(1));
> > }
> >
> > Having the +1 adjustment in msecs_to_jiffies() would result in waking up
> > close to every 2 msec.
>
> To be honest I thought it was already the case, but I was wrong. What
> confused me is that I mostly work on hwmon drivers and the typical use
> case of msecs_to_jiffies() in these drivers is in conjunction with
> time_after(). It's time_after() which does "round up", in that it
> always completes the current jiffy before it starts counting.
Right. It's good that you raised this point, it wasn't clear for me
either.
--Imre
> So there may be a need for what you're doing, just not in the drivers
> I'm taking care of. So I'll keep quiet about it from now on ;)
next prev parent reply other threads:[~2013-05-13 13:07 UTC|newest]
Thread overview: 54+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-05-10 12:13 [PATCH 01/11] time: add *_to_jiffies_min helpers to guarantee a minimum duration Imre Deak
2013-05-10 12:13 ` [PATCH 02/11] sched: msleep: take msecs_to_jiffies_min into use Imre Deak
2013-05-10 12:13 ` [PATCH 03/11] drm/i915: " Imre Deak
2013-05-10 12:13 ` Imre Deak
2013-05-10 12:13 ` [lm-sensors] [PATCH 04/11] hwmon/lm63, lm90: " Imre Deak
2013-05-10 12:13 ` [PATCH 04/11] hwmon/lm63,lm90: " Imre Deak
2013-05-12 23:55 ` [lm-sensors] [PATCH 04/11] hwmon/lm63, lm90: " Guenter Roeck
2013-05-12 23:55 ` [PATCH 04/11] hwmon/lm63,lm90: " Guenter Roeck
2013-05-13 7:47 ` [lm-sensors] [PATCH 04/11] hwmon/lm63, lm90: " Jean Delvare
2013-05-13 7:47 ` [PATCH 04/11] hwmon/lm63,lm90: " Jean Delvare
2013-05-13 11:56 ` [lm-sensors] [PATCH 04/11] hwmon/lm63, lm90: " Imre Deak
2013-05-13 11:56 ` [PATCH 04/11] hwmon/lm63,lm90: " Imre Deak
2013-05-13 12:23 ` [lm-sensors] [PATCH 04/11] hwmon/lm63, lm90: " Jean Delvare
2013-05-13 12:23 ` [PATCH 04/11] hwmon/lm63,lm90: " Jean Delvare
2013-05-10 12:13 ` [PATCH 05/11] media/si4713-i2c: take usecs_to_jiffies_min " Imre Deak
2013-05-10 12:13 ` [PATCH 06/11] net/bonding: take msecs_to_jiffies_min " Imre Deak
2013-05-10 13:58 ` Michal Kubecek
2013-05-10 21:19 ` Imre Deak
2013-05-10 12:13 ` [PATCH 07/11] net/peak_pcmcia: " Imre Deak
2013-05-15 9:12 ` Marc Kleine-Budde
2013-05-15 11:45 ` Marc Kleine-Budde
2013-05-10 12:13 ` [PATCH 08/11] usb/isp116x-hcd: " Imre Deak
2013-05-10 12:13 ` [PATCH 09/11] net/sunrpc: " Imre Deak
2013-05-10 12:13 ` [PATCH 10/11] net/tipc: " Imre Deak
2013-05-10 12:13 ` [PATCH 11/11] sound/oxygen_io: " Imre Deak
2013-05-13 14:00 ` Takashi Iwai
2013-05-13 14:24 ` Imre Deak
2013-05-13 14:35 ` Takashi Iwai
2013-05-13 14:35 ` Takashi Iwai
2013-05-13 14:30 ` Clemens Ladisch
2013-05-10 12:24 ` [PATCH 01/11] time: add *_to_jiffies_min helpers to guarantee a minimum duration Daniel Vetter
2013-05-10 13:49 ` Imre Deak
2013-05-13 7:29 ` Jean Delvare
2013-05-13 11:27 ` Imre Deak
2013-05-13 12:28 ` Jean Delvare
2013-05-13 13:07 ` Imre Deak [this message]
2013-05-13 8:17 ` Jean Delvare
2013-05-13 12:01 ` Imre Deak
2013-05-14 14:48 ` [PATCH v2 0/8] add *_to_jiffies_timeout " Imre Deak
2013-05-14 14:48 ` [PATCH v2 1/8] time: " Imre Deak
2013-05-15 15:26 ` Arnd Bergmann
2013-05-15 17:56 ` Imre Deak
2013-05-17 13:35 ` Arnd Bergmann
2013-05-17 15:14 ` Imre Deak
2013-05-14 14:48 ` [PATCH v2 2/8] sched: msleep: take msecs_to_jiffies_timeout into use Imre Deak
2013-05-14 14:48 ` [PATCH v2 3/8] drm/i915: " Imre Deak
2013-05-14 14:48 ` Imre Deak
2013-05-14 14:48 ` [PATCH v2 4/8] media/si4713-i2c: take usecs_to_jiffies_timeout " Imre Deak
2013-05-14 17:45 ` edubezval
2013-05-14 14:48 ` [PATCH v2 5/8] usb/isp116x-hcd: take msecs_to_jiffies_timeout " Imre Deak
2013-05-14 14:48 ` [PATCH v2 6/8] net/sunrpc: " Imre Deak
2013-05-14 14:48 ` [PATCH v2 7/8] net/tipc: " Imre Deak
2013-05-14 14:48 ` [PATCH v2 8/8] sound/oxygen_io: " Imre Deak
2013-05-14 14:50 ` Takashi Iwai
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=1368450472.16445.118.camel@intelbox \
--to=imre.deak@intel.com \
--cc=akpm@linux-foundation.org \
--cc=arnd@arndb.de \
--cc=daniel.vetter@ffwll.ch \
--cc=davem@davemloft.net \
--cc=john.stultz@linaro.org \
--cc=khali@linux-fr.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@kernel.org \
/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 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.