Re: [RFC][PATCH 0/4] printk: introduce printing kernel thread

From: Sergey Senozhatsky
Date: Thu Mar 23 2017 - 00:10:30 EST


Hello Peter,

thanks for taking a look.

On (03/22/17 18:59), Peter Zijlstra wrote:
> On Mon, Mar 06, 2017 at 09:45:50PM +0900, Sergey Senozhatsky wrote:
> > sysrq is potentially even trickier. can we always wake_up() kernel
> > thread from sysrq? there probably might be cases when we can't rely
> > on the scheduler.
>
> sysrq runs from interrupt context, right? Should be able to do wakeups.

what I though about was -
what if there are 'misbehaving' higher prio tasks all the time?
the existing sysrq would attempt to do printing from irq context
so it doesn't care about run queues.

does it make sense to you?

so what I have currently is something like this:
(not so sure about sysrq_handle_showstate_blocked())

---
drivers/tty/sysrq.c | 7 +++++++
1 file changed, 7 insertions(+)

diff --git a/drivers/tty/sysrq.c b/drivers/tty/sysrq.c
index c6fc7141d7b2..f0d2684fa99c 100644
--- a/drivers/tty/sysrq.c
+++ b/drivers/tty/sysrq.c
@@ -49,6 +49,7 @@
#include <linux/syscalls.h>
#include <linux/of.h>
#include <linux/rcupdate.h>
+#include <linux/console.h>

#include <asm/ptrace.h>
#include <asm/irq_regs.h>
@@ -239,6 +240,7 @@ static DECLARE_WORK(sysrq_showallcpus, sysrq_showregs_othercpus);

static void sysrq_handle_showallcpus(int key)
{
+ console_printing_thread_off();
/*
* Fall back to the workqueue based printing if the
* backtrace printing did not succeed or the
@@ -253,6 +255,7 @@ static void sysrq_handle_showallcpus(int key)
}
schedule_work(&sysrq_showallcpus);
}
+ console_printing_thread_on();
}

static struct sysrq_key_op sysrq_showallcpus_op = {
@@ -279,8 +282,10 @@ static struct sysrq_key_op sysrq_showregs_op = {

static void sysrq_handle_showstate(int key)
{
+ console_printing_thread_off();
show_state();
show_workqueue_state();
+ console_printing_thread_on();
}
static struct sysrq_key_op sysrq_showstate_op = {
.handler = sysrq_handle_showstate,
@@ -291,7 +296,9 @@ static struct sysrq_key_op sysrq_showstate_op = {

static void sysrq_handle_showstate_blocked(int key)
{
+ console_printing_thread_off();
show_state_filter(TASK_UNINTERRUPTIBLE);
+ console_printing_thread_on();
}
static struct sysrq_key_op sysrq_showstate_blocked_op = {
.handler = sysrq_handle_showstate_blocked,
--
2.12.1