mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Petr Mladek <pmladek@suse.com>
To: "Paul E. McKenney" <paulmck@kernel.org>
Cc: linux-kernel@vger.kernel.org, kernel-team@meta.com,
	Andrew Morton <akpm@linux-foundation.org>,
	Kuniyuki Iwashima <kuniyu@amazon.com>,
	Mateusz Guzik <mjguzik@gmail.com>,
	Steven Rostedt <rostedt@goodmis.org>,
	John Ogness <john.ogness@linutronix.de>,
	Sergey Senozhatsky <senozhatsky@chromium.org>,
	Jon Pan-Doh <pandoh@google.com>,
	Bjorn Helgaas <bhelgaas@google.com>,
	Karolina Stolarek <karolina.stolarek@oracle.com>
Subject: Re: [PATCH v3 11/20] ratelimit: Force re-initialization when rate-limiting re-enabled
Date: Mon, 28 Apr 2025 17:33:38 +0200	[thread overview]
Message-ID: <aA-f0jpBBbdfsmn7@pathway.suse.cz> (raw)
In-Reply-To: <20250425002826.3431914-11-paulmck@kernel.org>

On Thu 2025-04-24 17:28:17, Paul E. McKenney wrote:
> Currently, rate limiting being disabled results in an immediate early
> return with no state changes.  This can result in false-positive drops
> when re-enabling rate limiting.  Therefore, mark the ratelimit_state
> structure "uninitialized" when rate limiting is disabled.
> 
> Link: https://lore.kernel.org/all/fbe93a52-365e-47fe-93a4-44a44547d601@paulmck-laptop/
> Link: https://lore.kernel.org/all/20250423115409.3425-1-spasswolf@web.de/
> Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
> Cc: Petr Mladek <pmladek@suse.com>
> Cc: Andrew Morton <akpm@linux-foundation.org>
> Cc: Kuniyuki Iwashima <kuniyu@amazon.com>
> Cc: Mateusz Guzik <mjguzik@gmail.com>
> Cc: Steven Rostedt <rostedt@goodmis.org>
> Cc: John Ogness <john.ogness@linutronix.de>
> Cc: Sergey Senozhatsky <senozhatsky@chromium.org>
> ---
>  lib/ratelimit.c | 15 ++++++++++++++-
>  1 file changed, 14 insertions(+), 1 deletion(-)
> 
> diff --git a/lib/ratelimit.c b/lib/ratelimit.c
> index 7a7ba4835639f..52aab9229ca50 100644
> --- a/lib/ratelimit.c
> +++ b/lib/ratelimit.c
> @@ -35,11 +35,24 @@ int ___ratelimit(struct ratelimit_state *rs, const char *func)
>  	unsigned long flags;
>  	int ret;
>  
> +	/*
> +	 * Zero interval says never limit, otherwise, non-positive burst
> +	 * says always limit.
> +	 */
>  	if (interval <= 0 || burst <= 0) {
>  		ret = interval == 0 || burst > 0;
> +		if (!(READ_ONCE(rs->flags) & RATELIMIT_INITIALIZED) ||
> +		    !raw_spin_trylock_irqsave(&rs->lock, flags)) {

I though more about this. And I am not sure if this is safe.

We are here when the structure has not been initialized yet.
The spin lock is going to be likely still initialized.
In theory, it might happen in parallel:

CPU0				CPU1

___ratelimit()
  if (interval <= 0 || burst <= 0)
    // true on zero initialized struct

    if (!(READ_ONCE(rs->flags) & RATELIMIT_INITIALIZED) ||
      // same here
      !raw_spin_trylock_irqsave(&rs->lock, flags)) {
      // success???

				ratelimit_state_init()
				  raw_spin_lock_init(&rs->lock);


      raw_spin_unlock_irqrestore(&rs->lock, flags);

BANG: Unlocked rs->lock which has been initialized in the meantime.


Note: The non-initialized structure can be used in ext4 code,
      definitely, see
      https://lore.kernel.org/r/aAnp9rdPhRY52F7N@pathway.suse.cz

      Well, I think that it happens in the same CPU. So, it should
      be "safe".


Sigh, I guess that this patch is needed to fix the lib/tests/test_ratelimit.c.
It works because the test modifies .burst and .interval directly.

What is a sane behavior/API?

IMHO:

1. Nobody, including ext4 code, should use non-initialized
   struct ratelimit_state. It is a ticking bomb.

   IMHO, it should trigger a warning and the callers should get fixed.


2. Nobody, including the selftest, should modify struct ratelimit_state
   directly.

   This patchset adds ratelimit_state_reset_interval() for this
   purpose. It clears ~RATELIMIT_INITIALIZED. So this patch won't
   be needed when the API was used in the selftest.

It was actually great that ___ratelimit() was able to handle
non-initialized struct ratelimit_state without taking
the bundled lock.

What do you think, please?

> +			if (!ret)
> +				ratelimit_state_inc_miss(rs);
> +			return ret;
> +		}
> +
> +		/* Force re-initialization once re-enabled. */
> +		rs->flags &= ~RATELIMIT_INITIALIZED;
>  		if (!ret)
>  			ratelimit_state_inc_miss(rs);
> -		return ret;
> +		goto unlock_ret;
>  	}

Best Regards,
Petr

  reply	other threads:[~2025-04-28 15:33 UTC|newest]

Thread overview: 137+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-04-03 21:14 [PATCH RFC 0/9] Reduce ratelimit's false-positive misses Paul E. McKenney
2025-04-03 21:15 ` [PATCH RFC 1/9] ratelimit: Create functions to handle ratelimit_state internals Paul E. McKenney
2025-04-03 21:15 ` [PATCH RFC 2/9] random: Avoid open-coded use of ratelimit_state structure's ->missed field Paul E. McKenney
2025-04-03 21:15 ` [PATCH RFC 3/9] drm/i915: " Paul E. McKenney
2025-04-03 21:15 ` [PATCH RFC 4/9] drm/amd/pm: Avoid open-coded use of ratelimit_state structure's internals Paul E. McKenney
2025-04-07 14:35   ` Deucher, Alexander
2025-04-07 16:29     ` Paul E. McKenney
2025-04-03 21:15 ` [PATCH RFC 5/9] ratelimit: Convert the ->missed field to atomic_t Paul E. McKenney
2025-04-03 21:15 ` [PATCH RFC 6/9] ratelimit: Count misses due to lock contention Paul E. McKenney
2025-04-03 21:15 ` [PATCH RFC 7/9] ratelimit: Avoid jiffies=0 special case Paul E. McKenney
2025-04-03 21:15 ` [PATCH RFC 8/9] ratelimit: Reduce ratelimit's false-positive misses Paul E. McKenney
2025-04-05  9:17   ` Mateusz Guzik
2025-04-06 17:41     ` Paul E. McKenney
2025-04-07  0:07       ` Mateusz Guzik
2025-04-07 16:54         ` Paul E. McKenney
2025-04-08 16:41   ` Petr Mladek
2025-04-08 17:56     ` Paul E. McKenney
2025-04-03 21:15 ` [PATCH RFC 9/9] lib: Add trivial kunit test for ratelimit Paul E. McKenney
2025-04-18 17:13 ` [PATCH RFC 0/9] Reduce ratelimit's false-positive misses Paul E. McKenney
2025-04-18 17:13   ` [PATCH v2 ratelimit 01/14] lib: Add trivial kunit test for ratelimit Paul E. McKenney
2025-04-22 14:44     ` Petr Mladek
2025-04-22 22:56       ` Paul E. McKenney
2025-04-23  9:36         ` Petr Mladek
2025-04-18 17:13   ` [PATCH v2 ratelimit 02/14] ratelimit: Create functions to handle ratelimit_state internals Paul E. McKenney
2025-04-18 17:13   ` [PATCH v2 ratelimit 03/14] random: Avoid open-coded use of ratelimit_state structure's ->missed field Paul E. McKenney
2025-04-18 17:13   ` [PATCH v2 ratelimit 04/14] drm/i915: " Paul E. McKenney
2025-04-18 17:13   ` [PATCH v2 ratelimit 05/14] drm/amd/pm: Avoid open-coded use of ratelimit_state structure's internals Paul E. McKenney
2025-04-18 17:13   ` [PATCH v2 ratelimit 06/14] ratelimit: Convert the ->missed field to atomic_t Paul E. McKenney
2025-04-18 17:13   ` [PATCH v2 ratelimit 07/14] ratelimit: Count misses due to lock contention Paul E. McKenney
2025-04-18 17:13   ` [PATCH v2 ratelimit 08/14] ratelimit: Avoid jiffies=0 special case Paul E. McKenney
2025-04-18 17:13   ` [PATCH v2 ratelimit 09/14] ratelimit: Reduce ___ratelimit() false-positive rate limiting Paul E. McKenney
2025-04-18 17:13   ` [PATCH v2 ratelimit 10/14] ratelimit: Allow zero ->burst to disable ratelimiting Paul E. McKenney
2025-04-18 17:13   ` [PATCH v2 ratelimit 11/14] ratelimit: Force re-initialization when rate-limiting re-enabled Paul E. McKenney
2025-04-23 15:59     ` Mark Brown
2025-04-23 18:20       ` Paul E. McKenney
2025-04-23 18:59         ` Mark Brown
2025-04-23 19:54           ` Paul E. McKenney
2025-04-24 12:11             ` Mark Brown
2025-04-24 14:48               ` Paul E. McKenney
2025-04-18 17:13   ` [PATCH v2 ratelimit 12/14] ratelimit: Don't flush misses counter if RATELIMIT_MSG_ON_RELEASE Paul E. McKenney
2025-04-18 17:13   ` [PATCH v2 ratelimit 13/14] ratelimit: Avoid atomic decrement if already rate-limited Paul E. McKenney
2025-04-18 17:13   ` [PATCH v2 ratelimit 14/14] ratelimit: Avoid atomic decrement under lock " Paul E. McKenney
2025-04-22 14:50   ` [PATCH RFC 0/9] Reduce ratelimit's false-positive misses Petr Mladek
2025-04-22 14:57     ` Paul E. McKenney
2025-04-25  0:27   ` Paul E. McKenney
2025-04-25  0:28     ` [PATCH v3 01/20] lib: Add trivial kunit test for ratelimit Paul E. McKenney
2025-04-25  0:28     ` [PATCH v3 02/20] ratelimit: Create functions to handle ratelimit_state internals Paul E. McKenney
2025-04-25  0:28     ` [PATCH v3 03/20] random: Avoid open-coded use of ratelimit_state structure's ->missed field Paul E. McKenney
2025-04-25  0:28     ` [PATCH v3 04/20] drm/i915: " Paul E. McKenney
2025-04-25  8:48       ` Jani Nikula
2025-04-25 14:27         ` Paul E. McKenney
2025-04-25  0:28     ` [PATCH v3 05/20] drm/amd/pm: Avoid open-coded use of ratelimit_state structure's internals Paul E. McKenney
2025-04-25  0:28     ` [PATCH v3 06/20] ratelimit: Convert the ->missed field to atomic_t Paul E. McKenney
2025-04-25  0:28     ` [PATCH v3 07/20] ratelimit: Count misses due to lock contention Paul E. McKenney
2025-04-25  0:28     ` [PATCH v3 08/20] ratelimit: Avoid jiffies=0 special case Paul E. McKenney
2025-04-25  0:28     ` [PATCH v3 09/20] ratelimit: Reduce ___ratelimit() false-positive rate limiting Paul E. McKenney
2025-04-25  0:28     ` [PATCH v3 10/20] ratelimit: Allow zero ->burst to disable ratelimiting Paul E. McKenney
2025-04-28 14:57       ` Petr Mladek
2025-04-28 19:50         ` Paul E. McKenney
2025-04-25  0:28     ` [PATCH v3 11/20] ratelimit: Force re-initialization when rate-limiting re-enabled Paul E. McKenney
2025-04-28 15:33       ` Petr Mladek [this message]
2025-04-28 19:49         ` Paul E. McKenney
2025-04-29 12:05           ` Petr Mladek
2025-04-29 18:47             ` Paul E. McKenney
2025-04-25  0:28     ` [PATCH v3 12/20] ratelimit: Don't flush misses counter if RATELIMIT_MSG_ON_RELEASE Paul E. McKenney
2025-04-25  0:28     ` [PATCH v3 13/20] ratelimit: Avoid atomic decrement if already rate-limited Paul E. McKenney
2025-04-25  0:28     ` [PATCH v3 14/20] ratelimit: Avoid atomic decrement under lock " Paul E. McKenney
2025-04-25  0:28     ` [PATCH v3 15/20] ratelimit: Warn if ->interval or ->burst are negative Paul E. McKenney
2025-04-29 12:23       ` Petr Mladek
2025-04-29 18:52         ` Paul E. McKenney
2025-04-25  0:28     ` [PATCH v3 16/20] ratelimit: Simplify common-case exit path Paul E. McKenney
2025-04-29 14:25       ` Petr Mladek
2025-04-25  0:28     ` [PATCH v3 17/20] ratelimit: Use nolock_ret label to save a couple of lines of code Paul E. McKenney
2025-04-29 14:26       ` Petr Mladek
2025-04-25  0:28     ` [PATCH v3 18/20] ratelimit: Use nolock_ret label to collapse lock-failure code Paul E. McKenney
2025-04-29 14:31       ` Petr Mladek
2025-04-25  0:28     ` [PATCH v3 19/20] ratelimit: Use nolock_ret restructuring to collapse common case code Paul E. McKenney
2025-04-29 14:37       ` Petr Mladek
2025-04-25  0:28     ` [PATCH v3 20/20] ratelimit: Drop redundant accesses to burst Paul E. McKenney
2025-04-30  1:05     ` [PATCH v4 0/20] ratelimit: Reduce ratelimit's false-positive misses Paul E. McKenney
2025-04-30  1:05       ` [PATCH v4 01/20] lib: Add trivial kunit test for ratelimit Paul E. McKenney
2025-04-30  1:05       ` [PATCH v4 02/20] ratelimit: Create functions to handle ratelimit_state internals Paul E. McKenney
2025-04-30  1:05       ` [PATCH v4 03/20] random: Avoid open-coded use of ratelimit_state structure's ->missed field Paul E. McKenney
2025-04-30  1:05       ` [PATCH v4 04/20] drm/i915: " Paul E. McKenney
2025-04-30  1:05       ` [PATCH v4 05/20] drm/amd/pm: Avoid open-coded use of ratelimit_state structure's internals Paul E. McKenney
2025-04-30  1:05       ` [PATCH v4 06/20] ratelimit: Convert the ->missed field to atomic_t Paul E. McKenney
2025-04-30  1:05       ` [PATCH v4 07/20] ratelimit: Count misses due to lock contention Paul E. McKenney
2025-04-30  1:05       ` [PATCH v4 08/20] ratelimit: Avoid jiffies=0 special case Paul E. McKenney
2025-04-30  1:05       ` [PATCH v4 09/20] ratelimit: Reduce ___ratelimit() false-positive rate limiting Paul E. McKenney
2025-04-30  1:05       ` [PATCH v4 10/20] ratelimit: Allow zero ->burst to disable ratelimiting Paul E. McKenney
2025-04-30  1:05       ` [PATCH v4 11/20] ratelimit: Force re-initialization when rate-limiting re-enabled Paul E. McKenney
2025-05-05 10:20         ` Petr Mladek
2025-04-30  1:05       ` [PATCH v4 12/20] ratelimit: Don't flush misses counter if RATELIMIT_MSG_ON_RELEASE Paul E. McKenney
2025-04-30  1:05       ` [PATCH v4 13/20] ratelimit: Avoid atomic decrement if already rate-limited Paul E. McKenney
2025-04-30  1:05       ` [PATCH v4 14/20] ratelimit: Avoid atomic decrement under lock " Paul E. McKenney
2025-04-30  1:05       ` [PATCH v4 15/20] ratelimit: Warn if ->interval or ->burst are negative Paul E. McKenney
2025-04-30  1:05       ` [PATCH v4 16/20] ratelimit: Simplify common-case exit path Paul E. McKenney
2025-04-30  1:05       ` [PATCH v4 17/20] ratelimit: Use nolock_ret label to save a couple of lines of code Paul E. McKenney
2025-04-30  1:05       ` [PATCH v4 18/20] ratelimit: Use nolock_ret label to collapse lock-failure code Paul E. McKenney
2025-04-30  1:05       ` [PATCH v4 19/20] ratelimit: Use nolock_ret restructuring to collapse common case code Paul E. McKenney
2025-04-30  1:05       ` [PATCH v4 20/20] ratelimit: Drop redundant accesses to burst Paul E. McKenney
2025-05-05 11:14         ` Petr Mladek
2025-05-05 11:37       ` [PATCH v4 0/20] ratelimit: Reduce ratelimit's false-positive misses Petr Mladek
2025-05-05 15:52         ` Paul E. McKenney
2025-05-08 23:32       ` [PATCH v5 0/21] " Paul E. McKenney
2025-05-08 23:33         ` [PATCH v5 01/21] ratelimit: Create functions to handle ratelimit_state internals Paul E. McKenney
2025-05-08 23:33         ` [PATCH v5 02/21] random: Avoid open-coded use of ratelimit_state structure's ->missed field Paul E. McKenney
2025-05-08 23:33         ` [PATCH v5 03/21] drm/i915: " Paul E. McKenney
2025-05-08 23:33         ` [PATCH v5 04/21] drm/amd/pm: Avoid open-coded use of ratelimit_state structure's internals Paul E. McKenney
2025-05-08 23:33         ` [PATCH v5 05/21] ratelimit: Convert the ->missed field to atomic_t Paul E. McKenney
2025-05-08 23:33         ` [PATCH v5 06/21] ratelimit: Count misses due to lock contention Paul E. McKenney
2025-05-08 23:33         ` [PATCH v5 07/21] ratelimit: Avoid jiffies=0 special case Paul E. McKenney
2025-05-08 23:33         ` [PATCH v5 08/21] ratelimit: Reduce ___ratelimit() false-positive rate limiting Paul E. McKenney
2025-05-08 23:33         ` [PATCH v5 09/21] ratelimit: Allow zero ->burst to disable ratelimiting Paul E. McKenney
2025-05-08 23:33         ` [PATCH v5 10/21] ratelimit: Force re-initialization when rate-limiting re-enabled Paul E. McKenney
2025-05-08 23:33         ` [PATCH v5 11/21] ratelimit: Don't flush misses counter if RATELIMIT_MSG_ON_RELEASE Paul E. McKenney
2025-05-08 23:33         ` [PATCH v5 12/21] ratelimit: Avoid atomic decrement if already rate-limited Paul E. McKenney
2025-05-08 23:33         ` [PATCH v5 13/21] ratelimit: Avoid atomic decrement under lock " Paul E. McKenney
2025-05-08 23:33         ` [PATCH v5 14/21] ratelimit: Warn if ->interval or ->burst are negative Paul E. McKenney
2025-05-08 23:33         ` [PATCH v5 15/21] ratelimit: Simplify common-case exit path Paul E. McKenney
2025-05-08 23:33         ` [PATCH v5 16/21] ratelimit: Use nolock_ret label to save a couple of lines of code Paul E. McKenney
2025-05-08 23:33         ` [PATCH v5 17/21] ratelimit: Use nolock_ret label to collapse lock-failure code Paul E. McKenney
2025-05-08 23:33         ` [PATCH v5 18/21] ratelimit: Use nolock_ret restructuring to collapse common case code Paul E. McKenney
2025-05-08 23:33         ` [PATCH v5 19/21] ratelimit: Drop redundant accesses to burst Paul E. McKenney
2025-05-08 23:33         ` [PATCH v5 20/21] lib: Add trivial kunit test for ratelimit Paul E. McKenney
2025-05-12 15:22           ` Petr Mladek
2025-05-13 21:17             ` Paul E. McKenney
2025-05-08 23:33         ` [PATCH v5 21/21] lib: Add stress " Paul E. McKenney
2025-07-09 18:00         ` [PATCH v6 0/3] ratelimit: Add tests for lib/ratelimit.c Paul E. McKenney
2025-07-09 18:03           ` [PATCH v6 1/3] lib: Add trivial kunit test for ratelimit Paul E. McKenney
2025-07-09 22:41             ` Andrew Morton
2025-07-09 22:46               ` Steven Rostedt
2025-07-09 23:01                 ` Paul E. McKenney
2025-07-09 18:03           ` [PATCH v6 2/3] lib: Make the ratelimit test more reliable Paul E. McKenney
2025-07-09 22:44             ` Andrew Morton
2025-07-09 23:02               ` Paul E. McKenney
2025-07-09 18:03           ` [PATCH v6 3/3] lib: Add stress test for ratelimit Paul E. McKenney

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=aA-f0jpBBbdfsmn7@pathway.suse.cz \
    --to=pmladek@suse.com \
    --cc=akpm@linux-foundation.org \
    --cc=bhelgaas@google.com \
    --cc=john.ogness@linutronix.de \
    --cc=karolina.stolarek@oracle.com \
    --cc=kernel-team@meta.com \
    --cc=kuniyu@amazon.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mjguzik@gmail.com \
    --cc=pandoh@google.com \
    --cc=paulmck@kernel.org \
    --cc=rostedt@goodmis.org \
    --cc=senozhatsky@chromium.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®