[PATCH 5.15-rt] printk: ignore consoles without write() callback

John Ogness posted 1 patch 2 years, 6 months ago
There is a newer version of this series
kernel/printk/printk.c | 6 ++++++
1 file changed, 6 insertions(+)
[PATCH 5.15-rt] printk: ignore consoles without write() callback
Posted by John Ogness 2 years, 6 months ago
The ttynull driver does not provide an implementation for the write()
callback. This leads to a NULL pointer dereference in the related
printing kthread, which assumes it can call that callback.

Do not create kthreads for consoles that do not implement the write()
callback. Also, for pr_flush(), ignore consoles that do not implement
write() or write_atomic() since there is no way those consoles can
flush their output.

Link: https://lore.kernel.org/lkml/878rgy37f5.fsf@jogness.linutronix.de
Fixes: 8782b1ef4125 ("printk: move console printing to kthreads")
Reported-by: Michael Thalmeier <michael.thalmeier@hale.at>
Signed-off-by: John Ogness <john.ogness@linutronix.de>
---
 This is only a problem for the PREEMPT_RT tree. Mainline does not have
 this problem.

 kernel/printk/printk.c | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c
index 7f27cfee283e..752afe88b5b4 100644
--- a/kernel/printk/printk.c
+++ b/kernel/printk/printk.c
@@ -2343,6 +2343,10 @@ static int printk_kthread_func(void *data)
 /* Must be called within console_lock(). */
 static void start_printk_kthread(struct console *con)
 {
+	/* No need to start a printing thread if the console cannot print. */
+	if (!con->write)
+		return;
+
 	con->thread = kthread_run(printk_kthread_func, con,
 				  "pr/%s%d", con->name, con->index);
 	if (IS_ERR(con->thread)) {
@@ -3737,6 +3741,8 @@ bool pr_flush(int timeout_ms, bool reset_on_progress)
 		for_each_console(con) {
 			if (!(con->flags & CON_ENABLED))
 				continue;
+			if (!con->write && !con->write_atomic)
+				continue;
 			printk_seq = read_console_seq(con);
 			if (printk_seq < seq)
 				diff += seq - printk_seq;
-- 
2.30.2
Re: [PATCH 5.15-rt] printk: ignore consoles without write() callback
Posted by Krishanth Jagaduri 4 months, 3 weeks ago
On Thu, Feb 16, 2023 at 11:45:58AM +0106, John Ogness wrote:
> The ttynull driver does not provide an implementation for the write()
> callback. This leads to a NULL pointer dereference in the related
> printing kthread, which assumes it can call that callback.
> 
> Do not create kthreads for consoles that do not implement the write()
> callback. Also, for pr_flush(), ignore consoles that do not implement
> write() or write_atomic() since there is no way those consoles can
> flush their output.
> 
> ---
>  This is only a problem for the PREEMPT_RT tree. Mainline does not have
>  this problem.

Sorry for resurrecting this old thread but we actually want this patch
in 5.15-rt.

I am not sure why this was not applied to 5.15-rt yet since it is already
applied to 5.10-rt.

Could you please consider to pick this for 5.15-rt?

Best regards,
Krishanth
Re: [External] : Re: [PATCH 5.15-rt] printk: ignore consoles without write() callback
Posted by Joseph Salisbury 4 months, 2 weeks ago

On 4/23/25 06:10, Krishanth Jagaduri wrote:
> On Thu, Feb 16, 2023 at 11:45:58AM +0106, John Ogness wrote:
>> The ttynull driver does not provide an implementation for the write()
>> callback. This leads to a NULL pointer dereference in the related
>> printing kthread, which assumes it can call that callback.
>>
>> Do not create kthreads for consoles that do not implement the write()
>> callback. Also, for pr_flush(), ignore consoles that do not implement
>> write() or write_atomic() since there is no way those consoles can
>> flush their output.
>>
>> ---
>>   This is only a problem for the PREEMPT_RT tree. Mainline does not have
>>   this problem.
> Sorry for resurrecting this old thread but we actually want this patch
> in 5.15-rt.
>
> I am not sure why this was not applied to 5.15-rt yet since it is already
> applied to 5.10-rt.
>
> Could you please consider to pick this for 5.15-rt?
>
> Best regards,
> Krishanth
Hi Krishanth,

Thanks for pointing this out.  I will investigate including this patch 
in the next v5.15 patch set, which should be released this week.

Thanks,

Joe
Re: [External] : Re: [PATCH 5.15-rt] printk: ignore consoles without write() callback
Posted by Krishanth Jagaduri 3 months, 3 weeks ago
On Mon, Apr 28, 2025 at 10:45:08AM -0400, Joseph Salisbury wrote:
> Hi Krishanth,
> 
> Thanks for pointing this out.  I will investigate including this patch in
> the next v5.15 patch set, which should be released this week.
> 
> Thanks,
> 
> Joe

Thank you for including this patch in v5.15.183-rt85.

Best regards,
Krishanth
Re: [External] : Re: [PATCH 5.15-rt] printk: ignore consoles without write() callback
Posted by Joseph Salisbury 3 months, 3 weeks ago

On 5/21/25 08:30, Krishanth Jagaduri wrote:
> On Mon, Apr 28, 2025 at 10:45:08AM -0400, Joseph Salisbury wrote:
>> Hi Krishanth,
>>
>> Thanks for pointing this out.  I will investigate including this patch in
>> the next v5.15 patch set, which should be released this week.
>>
>> Thanks,
>>
>> Joe
> Thank you for including this patch in v5.15.183-rt85.
>
> Best regards,
> Krishanth
Not a problem, Krishanth! Just let me know if you run into any issues.

Thanks,

Joe

Re: [External] : Re: [PATCH 5.15-rt] printk: ignore consoles without write() callback
Posted by Krishanth Jagaduri 3 months, 3 weeks ago
On Wed, May 21, 2025 at 11:32:54AM -0400, Joseph Salisbury wrote:
> 
> 
> On 5/21/25 08:30, Krishanth Jagaduri wrote:
> > On Mon, Apr 28, 2025 at 10:45:08AM -0400, Joseph Salisbury wrote:
> > > Hi Krishanth,
> > > 
> > > Thanks for pointing this out.  I will investigate including this patch in
> > > the next v5.15 patch set, which should be released this week.
> > > 
> > > Thanks,
> > > 
> > > Joe
> > Thank you for including this patch in v5.15.183-rt85.
> > 
> > Best regards,
> > Krishanth
> Not a problem, Krishanth! Just let me know if you run into any issues.
> 
> Thanks,
> 
> Joe
> 
Sure, I will let you know if any.

Best regards,
Krishanth
Re: [PATCH 5.15-rt] printk: ignore consoles without write() callback
Posted by Sebastian Siewior 2 years, 6 months ago
On 2023-02-16 11:45:58 [+0106], John Ogness wrote:
>  This is only a problem for the PREEMPT_RT tree. Mainline does not have
>  this problem.

Is this 5.15 and less or current dev RT and less?

Sebastian
Re: [PATCH 5.15-rt] printk: ignore consoles without write() callback
Posted by John Ogness 2 years, 6 months ago
On 2023-02-16, Sebastian Siewior <bigeasy@linutronix.de> wrote:
>>  This is only a problem for the PREEMPT_RT tree. Mainline does not have
>>  this problem.
>
> Is this 5.15 and less or current dev RT and less?

5.10-rt is also affected. The changes for 5.10-rt are the same, but the
patch does not apply as-is. I will reply with a patch for 5.10-rt.

5.4-rt is not affected.

John Ogness
[PATCH 5.10-rt] printk: ignore consoles without write() callback
Posted by John Ogness 2 years, 6 months ago
The ttynull driver does not provide an implementation for the write()
callback. This leads to a NULL pointer dereference in the related
printing kthread, which assumes it can call that callback.

Do not create kthreads for consoles that do not implement the write()
callback. Also, for pr_flush(), ignore consoles that do not implement
write() or write_atomic(), since there is no way those consoles can
flush their output.

Link: https://lore.kernel.org/lkml/1831554214.546921.1676479103702.JavaMail.zimbra@hale.at
Reported-by: Michael Thalmeier <michael.thalmeier@hale.at>
Signed-off-by: John Ogness <john.ogness@linutronix.de>
---
 kernel/printk/printk.c | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c
index d2205872304d..64747c72fbea 100644
--- a/kernel/printk/printk.c
+++ b/kernel/printk/printk.c
@@ -2267,6 +2267,10 @@ static int printk_kthread_func(void *data)
 /* Must be called within console_lock(). */
 static void start_printk_kthread(struct console *con)
 {
+	/* No need to start a printing thread if the console cannot print. */
+	if (!con->write)
+		return;
+
 	con->thread = kthread_run(printk_kthread_func, con,
 				  "pr/%s%d", con->name, con->index);
 	if (IS_ERR(con->thread)) {
@@ -3566,6 +3570,8 @@ bool pr_flush(int timeout_ms, bool reset_on_progress)
 		for_each_console(con) {
 			if (!(con->flags & CON_ENABLED))
 				continue;
+			if (!con->write && !con->write_atomic)
+				continue;
 			printk_seq = atomic64_read(&con->printk_seq);
 			if (printk_seq < seq)
 				diff += seq - printk_seq;
-- 
2.30.2
Re: [PATCH 5.10-rt] printk: ignore consoles without write() callback
Posted by Luis Claudio R. Goncalves 2 years, 6 months ago
On Fri, Feb 17, 2023 at 09:53:44AM +0106, John Ogness wrote:
> The ttynull driver does not provide an implementation for the write()
> callback. This leads to a NULL pointer dereference in the related
> printing kthread, which assumes it can call that callback.
> 
> Do not create kthreads for consoles that do not implement the write()
> callback. Also, for pr_flush(), ignore consoles that do not implement
> write() or write_atomic(), since there is no way those consoles can
> flush their output.
> 
> Link: https://lore.kernel.org/lkml/1831554214.546921.1676479103702.JavaMail.zimbra@hale.at
> Reported-by: Michael Thalmeier <michael.thalmeier@hale.at>
> Signed-off-by: John Ogness <john.ogness@linutronix.de>

Thank you! I will apply that to the next 5.10-rt build.

Luis

> ---
>  kernel/printk/printk.c | 6 ++++++
>  1 file changed, 6 insertions(+)
> 
> diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c
> index d2205872304d..64747c72fbea 100644
> --- a/kernel/printk/printk.c
> +++ b/kernel/printk/printk.c
> @@ -2267,6 +2267,10 @@ static int printk_kthread_func(void *data)
>  /* Must be called within console_lock(). */
>  static void start_printk_kthread(struct console *con)
>  {
> +	/* No need to start a printing thread if the console cannot print. */
> +	if (!con->write)
> +		return;
> +
>  	con->thread = kthread_run(printk_kthread_func, con,
>  				  "pr/%s%d", con->name, con->index);
>  	if (IS_ERR(con->thread)) {
> @@ -3566,6 +3570,8 @@ bool pr_flush(int timeout_ms, bool reset_on_progress)
>  		for_each_console(con) {
>  			if (!(con->flags & CON_ENABLED))
>  				continue;
> +			if (!con->write && !con->write_atomic)
> +				continue;
>  			printk_seq = atomic64_read(&con->printk_seq);
>  			if (printk_seq < seq)
>  				diff += seq - printk_seq;
> -- 
> 2.30.2
> 
---end quoted text---