public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Frederic Weisbecker <frederic@kernel.org>
To: Anna-Maria Behnsen <anna-maria@linutronix.de>
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>
Subject: Re: [PATCH v2 15/15] timers/Documentation: Cleanup delay/sleep documentation
Date: Thu, 10 Oct 2024 15:10:50 +0200	[thread overview]
Message-ID: <ZwfSWrowBQNIWpIE@localhost.localdomain> (raw)
In-Reply-To: <20240911-devel-anna-maria-b4-timers-flseep-v2-15-b0d3f33ccfe0@linutronix.de>

Le Wed, Sep 11, 2024 at 07:13:41AM +0200, Anna-Maria Behnsen a écrit :
> The documentation which tries to give advises how to properly inserting

advices*

> delays or sleeps is outdated. The file name is 'timers-howto.rst' which
> might be missleading as it is only about delay and sleep mechanisms and not

misleading*

> how to use timers.
> 
> Update the documentation by integrating the important parts from the
> related function descriptions and move it all into a self explaining file
> with the name "delay_sleep_functions.rst".
> 
> Signed-off-by: Anna-Maria Behnsen <anna-maria@linutronix.de>
> ---
>  Documentation/timers/delay_sleep_functions.rst | 122 +++++++++++++++++++++++++
>  Documentation/timers/index.rst                 |   2 +-
>  Documentation/timers/timers-howto.rst          | 115 -----------------------
>  3 files changed, 123 insertions(+), 116 deletions(-)
> 
> diff --git a/Documentation/timers/delay_sleep_functions.rst b/Documentation/timers/delay_sleep_functions.rst
> new file mode 100644
> index 000000000000..05d7c3c8fbe8
> --- /dev/null
> +++ b/Documentation/timers/delay_sleep_functions.rst
> @@ -0,0 +1,122 @@
> +.. SPDX-License-Identifier: GPL-2.0
> +
> +Delay and sleep mechanisms
> +==========================
> +
> +This document seeks to answer the common question: "What is the
> +RightWay (TM) to insert a delay?"
> +
> +This question is most often faced by driver writers who have to
> +deal with hardware delays and who may not be the most intimately
> +familiar with the inner workings of the Linux Kernel.
> +
> +The following table gives a rough overview about the existing function
> +'families' and their limitations. This overview table does not replace the
> +reading of the function description before usage!
> +
> +.. list-table::
> +   :widths: 20 20 20 20 20
> +   :header-rows: 2
> +
> +   * -
> +     - `*delay()`
> +     - `usleep_range*()`
> +     - `*sleep()`
> +     - `fsleep()`
> +   * -
> +     - busy-wait loop
> +     - hrtimers based
> +     - timer list timers based
> +     - combines the others
> +   * - Usage in atomic Context
> +     - yes
> +     - no
> +     - no
> +     - no
> +   * - precise on "short intervals"
> +     - yes
> +     - yes
> +     - depends
> +     - yes
> +   * - precise on "long intervals"
> +     - Do not use!
> +     - yes
> +     - max 12.5% slack
> +     - yes
> +   * - interruptible variant
> +     - no
> +     - yes
> +     - yes
> +     - no
> +
> +A generic advice for non atomic contexts could be:
> +
> +#. Use `fsleep()` whenever unsure (as it combines all the advantages of the
> +   others)
> +#. Use `*sleep()` whenever possible
> +#. Use `usleep_range*()` whenever accuracy of `*sleep()` is not sufficient
> +#. Use `*delay()` for very, very short delays
> +
> +Find some more detailed information about the function 'families' in the next
> +sections.
> +
> +`*delay()` family of functions
> +------------------------------
> +
> +These functions use the jiffy estimation of clock speed and will busy wait for
> +enough loop cycles to achieve the desired delay. udelay() is the basic
> +implementation and ndelay() as well as mdelay() are variants.
> +
> +These functions are mainly used to add a delay in atomic context. Please make
> +sure to ask yourself before adding a delay in atomic context: Is this really
> +required?
> +
> +.. kernel-doc:: include/asm-generic/delay.h
> +	:identifiers: udelay ndelay
> +
> +.. kernel-doc:: include/linux/delay.h
> +	:identifiers: mdelay
> +
> +
> +`usleep_range*()` and `*sleep()` family of functions
> +----------------------------------------------------
> +
> +These functions uses hrtimers or timer list timers to provide the requested

use*

> +sleeping duration. For a decision which function is the right one to use, take

I'm not a native speaker but perhaps "In order to decide which function..." is
better...

> +some basic information into account:
> +
> +#. hrtimers are more expensive as they are using an rb-tree (instead of hashing)
> +#. hrtimers are more expensive when the requested sleeping duration is the first
> +   timer which means real hardware has to be programmed
> +#. timer list timers always providing some sort of slack as they are jiffy

provide*

> +   based
> +
> +The generic advice is repeated here:
> +
> +#. Use `fsleep()` whenever unsure (as it combines all the advantages of the
> +   others)
> +#. Use `*sleep()` whenever possible
> +#. Use `usleep_range*()` whenever accuracy of `*sleep()` is not sufficient
> +
> +First check fsleep() function description and to learn more about accuracy,
> +please check msleep() function description.
> +
> +
> +`usleep_range*()`
> +~~~~~~~~~~~~~~~~~
> +
> +.. kernel-doc:: include/linux/delay.h
> +	:identifiers: usleep_range usleep_range_idle
> +
> +.. kernel-doc:: kernel/time/sleep_timeout.c
> +	:identifiers: usleep_range_state
> +
> +
> +`*sleep()`
> +~~~~~~~~~~
> +
> +.. kernel-doc:: kernel/time/sleep_timeout.c
> +       :identifiers: msleep msleep_interruptible
> +
> +.. kernel-doc:: include/linux/delay.h
> +	:identifiers: ssleep fsleep

Reviewed-by: Frederic Weisbecker <frederic@kernel.org>

  reply	other threads:[~2024-10-10 13:10 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
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 [this message]
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=ZwfSWrowBQNIWpIE@localhost.localdomain \
    --to=frederic@kernel.org \
    --cc=anna-maria@linutronix.de \
    --cc=corbet@lwn.net \
    --cc=len.brown@intel.com \
    --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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox