mirror of https://lore.kernel.org/lkml/
 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
Subject: Re: [PATCH printk v5 15/17] printk: Implement legacy printer kthread for PREEMPT_RT
Date: Tue, 3 Sep 2024 15:38:46 +0200	[thread overview]
Message-ID: <ZtcRZpLjCjWeC4nG@pathway.suse.cz> (raw)
In-Reply-To: <20240830152916.10136-16-john.ogness@linutronix.de>

On Fri 2024-08-30 17:35:14, John Ogness wrote:
> The write() callback of legacy consoles usually makes use of
> spinlocks. This is not permitted with PREEMPT_RT in atomic
> contexts.
> 
> For PREEMPT_RT, create a new kthread to handle printing of all
> the legacy consoles (and nbcon consoles if boot consoles are
> registered). This allows legacy consoles to work on PREEMPT_RT
> without requiring modification. (However they will not have
> the reliability properties guaranteed by nbcon atomic
> consoles.)
> 
> Use the existing printk_kthreads_check_locked() to start/stop
> the legacy kthread as needed.
> 
> Introduce the macro force_legacy_kthread() to query if the
> forced threading of legacy consoles is in effect. Although
> currently only enabled for PREEMPT_RT, this acts as a simple
> mechanism for the future to allow other preemption models to
> easily take advantage of the non-interference property provided
> by the legacy kthread.
> 
> When force_legacy_kthread() is true, the legacy kthread
> fulfills the role of the console_flush_type @legacy_offload by
> waking the legacy kthread instead of printing via the
> console_lock in the irq_work. If the legacy kthread is not
> yet available, no legacy printing takes place (unless in
> panic).
> 
> If for some reason the legacy kthread fails to create, any
> legacy consoles are unregistered. With force_legacy_kthread(),
> the legacy kthread is a critical component for legacy consoles.
> 
> These changes only affect CONFIG_PREEMPT_RT.
> 
> --- a/kernel/printk/printk.c
> +++ b/kernel/printk/printk.c
> @@ -3459,6 +3475,87 @@ static int unregister_console_locked(struct console *console);
>  /* True when system boot is far enough to create printer threads. */
>  static bool printk_kthreads_ready __ro_after_init;
>  
> +static struct task_struct *printk_legacy_kthread;
> +
> +static bool legacy_kthread_should_wakeup(void)
> +{
> +	struct console_flush_type ft;
> +	struct console *con;
> +	bool ret = false;
> +	int cookie;
> +
> +	if (kthread_should_stop())
> +		return true;
> +
> +	printk_get_console_flush_type(&ft);
> +
> +	cookie = console_srcu_read_lock();
> +	for_each_console_srcu(con) {
> +		short flags = console_srcu_read_flags(con);
> +		u64 printk_seq;
> +
> +		/*
> +		 * The legacy printer thread is only for legacy consoles when
> +		 * the nbcon consoles have their printer threads.
> +		 */
> +		if ((flags & CON_NBCON) && ft.nbcon_offload)
> +			continue;

I am still scratching my head about the fact that the legacy loop
probably should not handle the nbcon consoles also when
printk_get_console_flush_type() returns ft.nbcon_atomic().

We probably does not have to take care of it here because this
code is called only when the legacy kthread is running.
It means that nbcon consoles should have their kthreads as well
when they can be handled outside the legacy loop. I mean
that we should never see ft.nbcon_atomic set here.

Sigh, the logic is so complicated.

Do I get it correctly, please?

> +		if (!console_is_usable(con, flags, false))
> +			continue;
> +
> +		if (flags & CON_NBCON) {
> +			printk_seq = nbcon_seq_read(con);
> +		} else {
> +			/*
> +			 * It is safe to read @seq because only this
> +			 * thread context updates @seq.
> +			 */
> +			printk_seq = con->seq;
> +		}
> +
> +		if (prb_read_valid(prb, printk_seq, NULL)) {
> +			ret = true;
> +			break;
> +		}
> +	}
> +	console_srcu_read_unlock(cookie);
> +
> +	return ret;
> +}

> --- a/kernel/printk/printk_safe.c
> +++ b/kernel/printk/printk_safe.c
> @@ -44,7 +44,9 @@ bool is_printk_legacy_deferred(void)
>  	 * The per-CPU variable @printk_context can be read safely in any
>  	 * context. CPU migration is always disabled when set.
>  	 */
> -	return (this_cpu_read(printk_context) || in_nmi());
> +	return (force_legacy_kthread() ||

This is not correct when used in panic(). force_legacy_kthread()
is not a reason for offload in that case.

IMHO, we should keep is_printk_legacy_deferred() as is.
Instead, we should check force_legacy_kthread() explicitly in
printk_get_console_flush_type(). It should cause the offload only
in NBCON_PRIO_NORMAL/EMERGENCY.

In fact, the legacy kthread should be used only in NBCON_PRIO_NORMAL.
The legacy loop should be called directly even in NBCON_PRIO_EMERGENCY.

> +		this_cpu_read(printk_context) ||
> +		in_nmi());
>  }
>  
>  asmlinkage int vprintk(const char *fmt, va_list args)

Best Regards,
Petr

  reply	other threads:[~2024-09-03 13:38 UTC|newest]

Thread overview: 24+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-08-30 15:28 [PATCH printk v5 00/17] add threaded printing + the rest John Ogness
2024-08-30 15:29 ` [PATCH printk v5 01/17] printk: nbcon: Add function for printers to reacquire ownership John Ogness
2024-08-30 15:29 ` [PATCH printk v5 02/17] printk: Fail pr_flush() if before SYSTEM_SCHEDULING John Ogness
2024-08-30 15:29 ` [PATCH printk v5 03/17] printk: Flush console on unregister_console() John Ogness
2024-08-30 15:29 ` [PATCH printk v5 04/17] printk: nbcon: Add context to usable() and emit() John Ogness
2024-08-30 15:29 ` [PATCH printk v5 05/17] printk: nbcon: Init @nbcon_seq to highest possible John Ogness
2024-08-30 15:29 ` [PATCH printk v5 06/17] printk: nbcon: Introduce printer kthreads John Ogness
2024-09-02 14:19   ` Petr Mladek
2024-08-30 15:29 ` [PATCH printk v5 07/17] printk: nbcon: Relocate nbcon_atomic_emit_one() John Ogness
2024-08-30 15:29 ` [PATCH printk v5 08/17] printk: nbcon: Use thread callback if in task context for legacy John Ogness
2024-08-30 15:29 ` [PATCH printk v5 09/17] printk: nbcon: Rely on kthreads for normal operation John Ogness
2024-09-03 10:10   ` Petr Mladek
2024-09-03 11:50     ` John Ogness
2024-08-30 15:29 ` [PATCH printk v5 10/17] printk: Provide helper for message prepending John Ogness
2024-08-30 15:29 ` [PATCH printk v5 11/17] printk: nbcon: Show replay message on takeover John Ogness
2024-08-30 15:29 ` [PATCH printk v5 12/17] proc: consoles: Add notation to c_start/c_stop John Ogness
2024-08-30 15:29 ` [PATCH printk v5 13/17] proc: Add nbcon support for /proc/consoles John Ogness
2024-08-30 15:29 ` [PATCH printk v5 14/17] tty: sysfs: Add nbcon support for 'active' John Ogness
2024-08-30 15:29 ` [PATCH printk v5 15/17] printk: Implement legacy printer kthread for PREEMPT_RT John Ogness
2024-09-03 13:38   ` Petr Mladek [this message]
2024-09-03 14:24     ` John Ogness
2024-08-30 15:29 ` [PATCH printk v5 16/17] printk: nbcon: Assign nice -20 for printing threads John Ogness
2024-08-30 15:29 ` [PATCH printk v5 17/17] printk: Avoid false positive lockdep report for legacy printing John Ogness
2024-09-03 14:53   ` Petr Mladek

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=ZtcRZpLjCjWeC4nG@pathway.suse.cz \
    --to=pmladek@suse.com \
    --cc=john.ogness@linutronix.de \
    --cc=linux-kernel@vger.kernel.org \
    --cc=rostedt@goodmis.org \
    --cc=senozhatsky@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 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®