From: Peter Zijlstra <peterz@infradead.org>
To: Geert Uytterhoeven <geert+renesas@glider.be>
Cc: Stephen Boyd <sboyd@kernel.org>,
Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>,
Tomasz Figa <tomasz.figa@gmail.com>,
Sylwester Nawrocki <s.nawrocki@samsung.com>,
Will Deacon <will@kernel.org>, Arnd Bergmann <arnd@arndb.de>,
Wolfram Sang <wsa+renesas@sang-engineering.com>,
Dejin Zheng <zhengdejin5@gmail.com>,
Kai-Heng Feng <kai.heng.feng@canonical.com>,
Nicholas Piggin <npiggin@gmail.com>,
Heiko Carstens <hca@linux.ibm.com>,
Russell King <linux@armlinux.org.uk>,
linux-arm-kernel@lists.infradead.org,
linux-renesas-soc@vger.kernel.org, linux-arch@vger.kernel.org,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH resend] iopoll: Call cpu_relax() in busy loops
Date: Thu, 26 Jan 2023 13:03:44 +0100 [thread overview]
Message-ID: <Y9JsIJat3sZU2rl1@hirez.programming.kicks-ass.net> (raw)
In-Reply-To: <8d492ee4a391bd089a01c218b0b4e05cf8ea593c.1674729407.git.geert+renesas@glider.be>
On Thu, Jan 26, 2023 at 11:45:37AM +0100, Geert Uytterhoeven wrote:
> It is considered good practice to call cpu_relax() in busy loops, see
> Documentation/process/volatile-considered-harmful.rst. This can not
> only lower CPU power consumption or yield to a hyperthreaded twin
> processor, but also allows an architecture to mitigate hardware issues
> (e.g. ARM Erratum 754327 for Cortex-A9 prior to r2p0) in the
> architecture-specific cpu_relax() implementation.
>
> As the iopoll helpers lack calls to cpu_relax(), people are sometimes
> reluctant to use them, and may fall back to open-coded polling loops
> (including cpu_relax() calls) instead.
>
> Fix this by adding calls to cpu_relax() to the iopoll helpers:
> - For the non-atomic case, it is sufficient to call cpu_relax() in
> case of a zero sleep-between-reads value, as a call to
> usleep_range() is a safe barrier otherwise.
> - For the atomic case, cpu_relax() must be called regardless of the
> sleep-between-reads value, as there is no guarantee all
> architecture-specific implementations of udelay() handle this.
>
> Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
In addition to these dodgy architecture fails, cpu_relax() is also a
compiler barrier, it is not immediately obvious that the @op argument
'function' will result in an actual function call (inlining ftw).
Where a function call is a C sequence point, this is lost on inlining.
Therefore, with agressive enough optimization it might be possible for
the compiler to hoist the:
(val) = op(args);
'load' out of the loop because it doesn't see the value changing. The
addition of cpu_relax() will inhibit this.
Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org>
> ---
> Resent with a larger audience due to lack of comments.
>
> This has been discussed before, but I am not aware of any patches moving
> forward:
> - "Re: [PATCH 6/7] clk: renesas: rcar-gen3: Add custom clock for PLLs"
> https://lore.kernel.org/all/CAMuHMdWUEhs=nwP+a0vO2jOzkq-7FEOqcJ+SsxAGNXX1PQ2KMA@mail.gmail.com/
> - "Re: [PATCH v2] clk: samsung: Prevent potential endless loop in the PLL set_rate ops"
> https://lore.kernel.org/all/20200811164628.GA7958@kozik-lap
> ---
> include/linux/iopoll.h | 3 +++
> 1 file changed, 3 insertions(+)
>
> diff --git a/include/linux/iopoll.h b/include/linux/iopoll.h
> index 2c8860e406bd8cae..73132721d1891a2e 100644
> --- a/include/linux/iopoll.h
> +++ b/include/linux/iopoll.h
> @@ -53,6 +53,8 @@
> } \
> if (__sleep_us) \
> usleep_range((__sleep_us >> 2) + 1, __sleep_us); \
> + else \
> + cpu_relax(); \
There's a simplicitly argument to be had for making it unconditional
here too I suppose. usleep() is 'slow' anyway.
> } \
> (cond) ? 0 : -ETIMEDOUT; \
> })
> @@ -95,6 +97,7 @@
> } \
> if (__delay_us) \
> udelay(__delay_us); \
> + cpu_relax(); \
> } \
> (cond) ? 0 : -ETIMEDOUT; \
> })
> --
> 2.34.1
>
WARNING: multiple messages have this Message-ID (diff)
From: Peter Zijlstra <peterz@infradead.org>
To: Geert Uytterhoeven <geert+renesas@glider.be>
Cc: Stephen Boyd <sboyd@kernel.org>,
Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>,
Tomasz Figa <tomasz.figa@gmail.com>,
Sylwester Nawrocki <s.nawrocki@samsung.com>,
Will Deacon <will@kernel.org>, Arnd Bergmann <arnd@arndb.de>,
Wolfram Sang <wsa+renesas@sang-engineering.com>,
Dejin Zheng <zhengdejin5@gmail.com>,
Kai-Heng Feng <kai.heng.feng@canonical.com>,
Nicholas Piggin <npiggin@gmail.com>,
Heiko Carstens <hca@linux.ibm.com>,
Russell King <linux@armlinux.org.uk>,
linux-arm-kernel@lists.infradead.org,
linux-renesas-soc@vger.kernel.org, linux-arch@vger.kernel.org,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH resend] iopoll: Call cpu_relax() in busy loops
Date: Thu, 26 Jan 2023 13:03:44 +0100 [thread overview]
Message-ID: <Y9JsIJat3sZU2rl1@hirez.programming.kicks-ass.net> (raw)
In-Reply-To: <8d492ee4a391bd089a01c218b0b4e05cf8ea593c.1674729407.git.geert+renesas@glider.be>
On Thu, Jan 26, 2023 at 11:45:37AM +0100, Geert Uytterhoeven wrote:
> It is considered good practice to call cpu_relax() in busy loops, see
> Documentation/process/volatile-considered-harmful.rst. This can not
> only lower CPU power consumption or yield to a hyperthreaded twin
> processor, but also allows an architecture to mitigate hardware issues
> (e.g. ARM Erratum 754327 for Cortex-A9 prior to r2p0) in the
> architecture-specific cpu_relax() implementation.
>
> As the iopoll helpers lack calls to cpu_relax(), people are sometimes
> reluctant to use them, and may fall back to open-coded polling loops
> (including cpu_relax() calls) instead.
>
> Fix this by adding calls to cpu_relax() to the iopoll helpers:
> - For the non-atomic case, it is sufficient to call cpu_relax() in
> case of a zero sleep-between-reads value, as a call to
> usleep_range() is a safe barrier otherwise.
> - For the atomic case, cpu_relax() must be called regardless of the
> sleep-between-reads value, as there is no guarantee all
> architecture-specific implementations of udelay() handle this.
>
> Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
In addition to these dodgy architecture fails, cpu_relax() is also a
compiler barrier, it is not immediately obvious that the @op argument
'function' will result in an actual function call (inlining ftw).
Where a function call is a C sequence point, this is lost on inlining.
Therefore, with agressive enough optimization it might be possible for
the compiler to hoist the:
(val) = op(args);
'load' out of the loop because it doesn't see the value changing. The
addition of cpu_relax() will inhibit this.
Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org>
> ---
> Resent with a larger audience due to lack of comments.
>
> This has been discussed before, but I am not aware of any patches moving
> forward:
> - "Re: [PATCH 6/7] clk: renesas: rcar-gen3: Add custom clock for PLLs"
> https://lore.kernel.org/all/CAMuHMdWUEhs=nwP+a0vO2jOzkq-7FEOqcJ+SsxAGNXX1PQ2KMA@mail.gmail.com/
> - "Re: [PATCH v2] clk: samsung: Prevent potential endless loop in the PLL set_rate ops"
> https://lore.kernel.org/all/20200811164628.GA7958@kozik-lap
> ---
> include/linux/iopoll.h | 3 +++
> 1 file changed, 3 insertions(+)
>
> diff --git a/include/linux/iopoll.h b/include/linux/iopoll.h
> index 2c8860e406bd8cae..73132721d1891a2e 100644
> --- a/include/linux/iopoll.h
> +++ b/include/linux/iopoll.h
> @@ -53,6 +53,8 @@
> } \
> if (__sleep_us) \
> usleep_range((__sleep_us >> 2) + 1, __sleep_us); \
> + else \
> + cpu_relax(); \
There's a simplicitly argument to be had for making it unconditional
here too I suppose. usleep() is 'slow' anyway.
> } \
> (cond) ? 0 : -ETIMEDOUT; \
> })
> @@ -95,6 +97,7 @@
> } \
> if (__delay_us) \
> udelay(__delay_us); \
> + cpu_relax(); \
> } \
> (cond) ? 0 : -ETIMEDOUT; \
> })
> --
> 2.34.1
>
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
next prev parent reply other threads:[~2023-01-26 12:04 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-01-26 10:45 [PATCH resend] iopoll: Call cpu_relax() in busy loops Geert Uytterhoeven
2023-01-26 10:45 ` Geert Uytterhoeven
2023-01-26 12:03 ` Peter Zijlstra [this message]
2023-01-26 12:03 ` Peter Zijlstra
2023-01-26 12:07 ` Arnd Bergmann
2023-01-26 12:07 ` Arnd Bergmann
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=Y9JsIJat3sZU2rl1@hirez.programming.kicks-ass.net \
--to=peterz@infradead.org \
--cc=arnd@arndb.de \
--cc=geert+renesas@glider.be \
--cc=hca@linux.ibm.com \
--cc=kai.heng.feng@canonical.com \
--cc=krzysztof.kozlowski@linaro.org \
--cc=linux-arch@vger.kernel.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-renesas-soc@vger.kernel.org \
--cc=linux@armlinux.org.uk \
--cc=npiggin@gmail.com \
--cc=s.nawrocki@samsung.com \
--cc=sboyd@kernel.org \
--cc=tomasz.figa@gmail.com \
--cc=will@kernel.org \
--cc=wsa+renesas@sang-engineering.com \
--cc=zhengdejin5@gmail.com \
/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.