On 2018-07-26 23:38:05 [+0530], Pintu Kumar wrote:
> > > Is there a way we can fix this issue on non-rt kernel?
> > I would guess that a wakeup to klogd would fix it.
> >
> Sorry, can you elaborate more about "wakeup to klogd".
> I wanted to try it and check.

Something like this should do the work.

diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c
index 179ad787a08c..411f9ed5f051 100644
--- a/kernel/printk/printk.c
+++ b/kernel/printk/printk.c
@@ -1927,6 +1927,8 @@ static size_t log_output(int facility, int level, enum 
log_flags lflags, const c
        return log_store(facility, level, lflags, 0, dict, dictlen, text, 
text_len);
 }
 
+static void printk_flush_pending_output(void);
+
 asmlinkage int vprintk_emit(int facility, int level,
                            const char *dict, size_t dictlen,
                            const char *fmt, va_list args)
@@ -2026,6 +2028,9 @@ asmlinkage int vprintk_emit(int facility, int level,
                 */
                if (may_trylock && console_trylock_spinning())
                        console_unlock();
+               else if (!may_trylock)
+                       printk_flush_pending_output();
+
                migrate_enable();
        }
 
@@ -2987,6 +2992,13 @@ static DEFINE_PER_CPU(struct irq_work, 
wake_up_klogd_work) = {
        .flags = IRQ_WORK_LAZY,
 };
 
+static void printk_flush_pending_output(void)
+{
+       /* preemption or interrupts need to be disabled */
+       __this_cpu_or(printk_pending, PRINTK_PENDING_OUTPUT);
+       irq_work_queue(this_cpu_ptr(&wake_up_klogd_work));
+}
+
 void wake_up_klogd(void)
 {
        preempt_disable();

Sebastian

Reply via email to