All of lore.kernel.org
 help / color / mirror / Atom feed
From: Anna-Maria Behnsen <anna-maria@linutronix.de>
To: Frederic Weisbecker <frederic@kernel.org>
Cc: Thomas Gleixner <tglx@linutronix.de>,
	Jonathan Corbet <corbet@lwn.net>,
	linux-kernel@vger.kernel.org, Len Brown <len.brown@intel.com>,
	"Rafael J. Wysocki" <rafael@kernel.org>,
	Arnd Bergmann <arnd@arndb.de>,
	linux-arch@vger.kernel.org
Subject: Re: [PATCH v2 05/15] timers: Update function descriptions of sleep/delay related functions
Date: Fri, 11 Oct 2024 12:20:20 +0200	[thread overview]
Message-ID: <875xpzvt3v.fsf@somnus> (raw)
In-Reply-To: <ZwfKNNpjYnn2OGWG@localhost.localdomain>

Frederic Weisbecker <frederic@kernel.org> writes:

> Le Thu, Oct 10, 2024 at 10:45:03AM +0200, Anna-Maria Behnsen a écrit :
>> Frederic Weisbecker <frederic@kernel.org> writes:
>> >> @@ -281,7 +281,34 @@ EXPORT_SYMBOL_GPL(schedule_hrtimeout);
>> >>  
>> >>  /**
>> >>   * msleep - sleep safely even with waitqueue interruptions
>> >> - * @msecs: Time in milliseconds to sleep for
>> >> + * @msecs:	Requested sleep duration in milliseconds
>> >> + *
>> >> + * msleep() uses jiffy based timeouts for the sleep duration. The accuracy of
>> >> + * the resulting sleep duration depends on:
>> >> + *
>> >> + * * HZ configuration
>> >> + * * sleep duration (as granularity of a bucket which collects timers increases
>> >> + *   with the timer wheel levels)
>> >> + *
>> >> + * When the timer is queued into the second level of the timer wheel the maximum
>> >> + * additional delay will be 12.5%. For explanation please check the detailed
>> >> + * description about the basics of the timer wheel. In case this is accurate
>> >> + * enough check which sleep length is selected to make sure required accuracy is
>> >> + * given. Please use therefore the following simple steps:
>> >> + *
>> >> + * #. Decide which slack is fine for the requested sleep duration - but do not
>> >> + *    use values shorter than 1/8
>> >
>> > I'm confused, what means 1/x for a slack value? 1/8 means 125 msecs? I'm not
>> > even I understand what you mean by slack. Is it the bucket_expiry - expiry?
>> 
>> I was confused as well and had to read it twice... I would propose to
>> rephrase the whole function description:
>> 
>> 
>> /**
>>  * msleep - sleep safely even with waitqueue interruptions
>>  * @msecs:	Requested sleep duration in milliseconds
>>  *
>>  * msleep() uses jiffy based timeouts for the sleep duration. Because of the
>>  * design of the timer wheel, the maximum additional percentage delay (slack) is
>>  * 12.5%. This is only valid for timers which will end up in the second or a
>>  * higher level of the timer wheel. For explanation of those 12.5% please check
>>  * the detailed description about the basics of the timer wheel.
>
> I've never realized this constant worst percentage of slack. Would be nice to mention
> that somewhere in kernel/time/timer.c

Yes, we can explicitly add it (I will put it on the TODO list). It's
possible to calculate it on your own with the overview of levels and
granularity,...

> However this doesn't need a second to apply. It only takes crossing levels above
> 0. Or am I missing something?

s/the second/level 1/

more clear? Then it's the same number as used in the timer wheel
documentation.

>>  *
>>  * The slack of timers which will end up in the first level depends on:
>>  *

Same here: s/the first level/level 0/

>>  * * sleep duration (msecs)
>>  * * HZ configuration
>>  *
>>  * To make sure the sleep duration with the slack is accurate enough, a slack
>>  * value is required (because of the design of the timer wheel it is not
>
> But where is it required?

The callsite has to decide which accuracy/slack is required for their
use case (this was also part of the discussion which leads to this
queue).

>>  * possible to define a value smaller than 12.5%). The following check makes
>>  * clear, whether the sleep duration with the defined slack and with the HZ
>>  * configuration will meet the constraints:
>>  *
>>  *  ``msecs >= (MSECS_PER_TICK / slack)``
>>  *
>>  * Examples:
>>  *
>>  * * ``HZ=1000`` with ``slack=25%``: ``MSECS_PER_TICK / slack = 1 / (1/4) = 4``:
>>  *   all sleep durations greater or equal 4ms will meet the constraints.
>>  * * ``HZ=1000`` with ``slack=12.5%``: ``MSECS_PER_TICK / slack = 1 / (1/8) = 8``:
>>  *   all sleep durations greater or equal 8ms will meet the constraints.
>>  * * ``HZ=250`` with ``slack=25%``: ``MSECS_PER_TICK / slack = 4 / (1/4) = 16``:
>>  *   all sleep durations greater or equal 16ms will meet the constraints.
>>  * * ``HZ=250`` with ``slack=12.5%``: ``MSECS_PER_TICK / slack = 4 / (1/8) = 32``:
>>  *   all sleep durations greater or equal 32ms will meet the constraints.
>
> But who defines those slacks and where? I'm even more confused now...

I think I know where the confusion comes from. I rephrase it once more
and turned around the calculation:

/**
 * msleep - sleep safely even with waitqueue interruptions
 * @msecs:	Requested sleep duration in milliseconds
 *
 * msleep() uses jiffy based timeouts for the sleep duration. Because of the
 * design of the timer wheel, the maximum additional percentage delay (slack) is
 * 12.5%. This is only valid for timers which will end up in level 1 or a
 * higher level of the timer wheel. For explanation of those 12.5% please check
 * the detailed description about the basics of the timer wheel.
 *
 * The slack of timers which will end up in level 0 depends on sleep
 * duration (msecs) and HZ configuration and can be calculated in the
 * following way (with the timer wheel design restriction that the slack
 * is not less than 12.5%):
 *
 *   ``slack = MSECS_PER_TICK / msecs``
 *
 * When the allowed slack of the callsite is known, the calculation
 * could be turned around to find the minimal allowed sleep duration to meet
 * the constraints. For example:
 *
 * * ``HZ=1000`` with ``slack=25%``: ``MSECS_PER_TICK / slack = 1 / (1/4) = 4``:
 *   all sleep durations greater or equal 4ms will meet the constraints.
 * * ``HZ=1000`` with ``slack=12.5%``: ``MSECS_PER_TICK / slack = 1 / (1/8) = 8``:
 *   all sleep durations greater or equal 8ms will meet the constraints.
 * * ``HZ=250`` with ``slack=25%``: ``MSECS_PER_TICK / slack = 4 / (1/4) = 16``:
 *   all sleep durations greater or equal 16ms will meet the constraints.
 * * ``HZ=250`` with ``slack=12.5%``: ``MSECS_PER_TICK / slack = 4 / (1/8) = 32``:
 *   all sleep durations greater or equal 32ms will meet the constraints.
 *
 * See also the signal aware variant msleep_interruptible().
 */

Hopefully this attempt clarifies the confusion?


  reply	other threads:[~2024-10-11 10:20 UTC|newest]

Thread overview: 47+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-09-11  5:13 [PATCH v2 00/15] timers: Cleanup delay/sleep related mess Anna-Maria Behnsen
2024-09-11  5:13 ` [PATCH v2 01/15] MAINTAINERS: Add missing file include/linux/delay.h Anna-Maria Behnsen
2024-10-01 20:11   ` Frederic Weisbecker
2024-09-11  5:13 ` [PATCH v2 02/15] timers: Move *sleep*() and timeout functions into a separate file Anna-Maria Behnsen
2024-10-01 20:45   ` Frederic Weisbecker
2024-09-11  5:13 ` [PATCH v2 03/15] timers: Update schedule_[hr]timeout*() related function descriptions Anna-Maria Behnsen
2024-10-01 21:16   ` Frederic Weisbecker
2024-09-11  5:13 ` [PATCH v2 04/15] timers: Rename usleep_idle_range() to usleep_range_idle() Anna-Maria Behnsen
2024-09-11  5:13 ` [PATCH v2 05/15] timers: Update function descriptions of sleep/delay related functions Anna-Maria Behnsen
2024-10-06 21:49   ` Frederic Weisbecker
2024-10-10  8:45     ` Anna-Maria Behnsen
2024-10-10 12:36       ` Frederic Weisbecker
2024-10-11 10:20         ` Anna-Maria Behnsen [this message]
2024-10-11 12:22           ` Frederic Weisbecker
2024-09-11  5:13 ` [PATCH v2 06/15] delay: Rework udelay and ndelay Anna-Maria Behnsen
2024-09-23 15:40   ` Anna-Maria Behnsen
2024-10-08 14:24   ` Frederic Weisbecker
2024-09-11  5:13 ` [PATCH v2 07/15] timers: Adjust flseep() to reflect reality Anna-Maria Behnsen
2024-10-08 21:45   ` Frederic Weisbecker
2024-09-11  5:13 ` [PATCH v2 08/15] mm/damon/core: Use generic upper bound recommondation for usleep_range() Anna-Maria Behnsen
2024-10-09 12:01   ` Frederic Weisbecker
2024-09-11  5:13 ` [PATCH v2 09/15] timers: Add a warning to usleep_range_state() for wrong order of arguments Anna-Maria Behnsen
2024-09-11  6:41   ` Joe Perches
2024-09-11  7:45     ` Anna-Maria Behnsen
2024-10-09 12:22   ` Frederic Weisbecker
2024-10-10  9:06     ` Anna-Maria Behnsen
2024-09-11  5:13 ` [PATCH v2 10/15] checkpatch: Remove broken sleep/delay related checks Anna-Maria Behnsen
2024-09-11  6:44   ` Joe Perches
2024-09-11  7:41     ` Anna-Maria Behnsen
2024-10-09 12:45   ` Frederic Weisbecker
2024-09-11  5:13 ` [PATCH v2 11/15] regulator: core: Use fsleep() to get best sleep mechanism Anna-Maria Behnsen
2024-10-09 13:37   ` Frederic Weisbecker
2024-09-11  5:13 ` [PATCH v2 12/15] iopoll/regmap/phy/snd: Fix comment referencing outdated timer documentation Anna-Maria Behnsen
2024-09-11 12:08   ` Andrew Lunn
2024-10-09 16:14   ` Frederic Weisbecker
2024-09-11  5:13 ` [PATCH v2 13/15] powerpc/rtas: Use fsleep() to minimize additional sleep duration Anna-Maria Behnsen
2024-10-09 16:20   ` Frederic Weisbecker
2024-10-10  9:27     ` Anna-Maria Behnsen
2024-09-11  5:13 ` [PATCH v2 14/15] media: anysee: Fix link to outdated sleep function documentation Anna-Maria Behnsen
2024-10-09 16:30   ` Frederic Weisbecker
2024-10-11 10:28     ` Anna-Maria Behnsen
2024-09-11  5:13 ` [PATCH v2 15/15] timers/Documentation: Cleanup delay/sleep documentation Anna-Maria Behnsen
2024-10-10 13:10   ` Frederic Weisbecker
2024-09-16 20:20 ` [PATCH v2 00/15] timers: Cleanup delay/sleep related mess Christophe JAILLET
2024-09-17  5:22   ` Christophe JAILLET
2024-09-23 15:12     ` Anna-Maria Behnsen
2024-10-02 15:02   ` Thomas Gleixner

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=875xpzvt3v.fsf@somnus \
    --to=anna-maria@linutronix.de \
    --cc=arnd@arndb.de \
    --cc=corbet@lwn.net \
    --cc=frederic@kernel.org \
    --cc=len.brown@intel.com \
    --cc=linux-arch@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=rafael@kernel.org \
    --cc=tglx@linutronix.de \
    /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.