All of lore.kernel.org
 help / color / mirror / Atom feed
From: Petr Mladek <pmladek@suse.com>
To: John Ogness <john.ogness@linutronix.de>
Cc: Sergey Senozhatsky <senozhatsky@chromium.org>,
	Steven Rostedt <rostedt@goodmis.org>,
	Thomas Gleixner <tglx@linutronix.de>,
	linux-kernel@vger.kernel.org,
	Andrew Morton <akpm@linux-foundation.org>,
	Dmitry Safonov <0x7f454c46@gmail.com>,
	Stephen Rothwell <sfr@canb.auug.org.au>,
	Peter Zijlstra <peterz@infradead.org>,
	Marco Elver <elver@google.com>,
	Alexander Potapenko <glider@google.com>,
	Stephen Boyd <swboyd@chromium.org>
Subject: Re: [PATCH next v2 1/2] dump_stack: move cpu lock to printk.c
Date: Tue, 8 Jun 2021 13:40:32 +0200	[thread overview]
Message-ID: <YL9XMBxeZ4fGRS79@alley> (raw)
In-Reply-To: <20210607200232.22211-2-john.ogness@linutronix.de>

On Mon 2021-06-07 22:02:31, John Ogness wrote:
> dump_stack() implements its own cpu-reentrant spinning lock to
> best-effort serialize stack traces in the printk log. However,
> there are other functions (such as show_regs()) that can also
> benefit from this serialization.
> 
> Move the cpu-reentrant spinning lock (cpu lock) into new helper
> functions printk_cpu_lock_irqsave()/printk_cpu_unlock_irqrestore()
> so that it is available for others as well. For !CONFIG_SMP the
> cpu lock is a NOP.
> 
> Note that having multiple cpu locks in the system can easily
> lead to deadlock. Code needing a cpu lock should use the
> printk cpu lock, since the printk cpu lock could be acquired
> from any code and any context.
> 
> Signed-off-by: John Ogness <john.ogness@linutronix.de>

There are some nits below but the patch looks fine to me as it.

Reviewed-by: Petr Mladek <pmladek@suse.com>

> --- a/kernel/printk/printk.c
> +++ b/kernel/printk/printk.c
> @@ -3532,3 +3532,78 @@ void kmsg_dump_rewind(struct kmsg_dump_iter *iter)
> +void printk_cpu_lock_irqsave(bool *lock_flag, unsigned long *irq_flags)
> +{
> +	int old;
> +	int cpu;
> +
> +retry:
> +	local_irq_save(*irq_flags);
> +
> +	cpu = smp_processor_id();
> +
> +	old = atomic_cmpxchg(&printk_cpulock_owner, -1, cpu);
> +	if (old == -1) {
> +		/* This CPU is now the owner. */
> +

Superfluous space?

> +		*lock_flag = true;

The original name name "was_locked" was more descriptive. I agree that
it was not good for an API. What about keeping the inverted logic and
calling it "lock_nested" ?

I do not resist on any change. The logic is trivial so...

> +
> +	} else if (old == cpu) {
> +		/* This CPU is already the owner. */
> +
> +		*lock_flag = false;
> +

Even more superfluous spaces?

> +	} else {
> +		local_irq_restore(*irq_flags);
> +
> +		/*
> +		 * Wait for the lock to release before jumping to cmpxchg()
> +		 * in order to mitigate the thundering herd problem.
> +		 */
> +		do {
> +			cpu_relax();
> +		} while (atomic_read(&printk_cpulock_owner) != -1);
> +
> +		goto retry;
> +	}
> +}
> +EXPORT_SYMBOL(printk_cpu_lock_irqsave);
> +
> +/*
> + * printk_cpu_unlock_irqrestore: Release the printk cpu-reentrant spinning
> + *                               lock and restore interrupts.
> + * @lock_flag: The current lock state.
> + * @irq_flags: The current irq state.

"The current" is a bit misleading. Both values actually describe
the state before the related printk_cpu_lock_irqsave().
What about something like?

  * @lock_nested: Lock state set when the lock was taken.
  * @irq_flags: IRQ flags stored when the lock was taken.


> + *
> + * Release the lock. The calling processor must be the owner of the lock.
> + *
> + * It is safe to call this function from any context and state.
> + */
> +void printk_cpu_unlock_irqrestore(bool lock_flag, unsigned long irq_flags)
> +{
> +	if (lock_flag) {
> +		atomic_set(&printk_cpulock_owner, -1);
> +
> +		local_irq_restore(irq_flags);
> +	}
> +}
> +EXPORT_SYMBOL(printk_cpu_unlock_irqrestore);
> +#endif /* CONFIG_SMP */

 Best Regards,
 Petr
 

  parent reply	other threads:[~2021-06-08 11:40 UTC|newest]

Thread overview: 18+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-06-07 20:02 [PATCH next v2 0/2] introduce printk cpu lock John Ogness
2021-06-07 20:02 ` [PATCH next v2 1/2] dump_stack: move cpu lock to printk.c John Ogness
2021-06-08  2:43   ` kernel test robot
2021-06-08  2:43     ` kernel test robot
2021-06-08 13:48     ` Petr Mladek
2021-06-08 13:48       ` Petr Mladek
2021-06-10 13:26       ` John Ogness
2021-06-10 13:26         ` John Ogness
2021-06-11  7:00         ` Petr Mladek
2021-06-11  7:00           ` Petr Mladek
2021-06-08 11:40   ` Petr Mladek [this message]
2021-06-08 13:55     ` John Ogness
2021-06-08 14:54       ` Petr Mladek
2021-06-07 20:02 ` [PATCH next v2 2/2] printk: fix cpu lock ordering John Ogness
2021-06-08 12:55   ` Petr Mladek
2021-06-08 14:18     ` John Ogness
2021-06-08 14:49       ` Petr Mladek
2021-06-10 14:44         ` John Ogness

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=YL9XMBxeZ4fGRS79@alley \
    --to=pmladek@suse.com \
    --cc=0x7f454c46@gmail.com \
    --cc=akpm@linux-foundation.org \
    --cc=elver@google.com \
    --cc=glider@google.com \
    --cc=john.ogness@linutronix.de \
    --cc=linux-kernel@vger.kernel.org \
    --cc=peterz@infradead.org \
    --cc=rostedt@goodmis.org \
    --cc=senozhatsky@chromium.org \
    --cc=sfr@canb.auug.org.au \
    --cc=swboyd@chromium.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.