Serialize console prints with the print_lock
authorBarret Rhoden <brho@cs.berkeley.edu>
Thu, 19 Jul 2018 20:06:23 +0000 (16:06 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Thu, 19 Jul 2018 20:12:26 +0000 (16:12 -0400)
When userspace writes to the console, it bypasses printk and could
interleave with the rest of the kernel prints.  Now it won't, and we can
remove yet another lock.

Note that we still will have single printk lines intermixed with userspace
characters, since userspace could be writing one byte at a time, without a
\n.  However, these writes won't interfere with multi-line printks within
the kernel.  The first line could have junk in front of it, and if that
becomes a problem, we can start putting printk("\n") in front of larger
prints (such as trapframes), like we do for panic and warnings.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
kern/drivers/dev/cons.c
kern/include/kdebug.h
kern/src/init.c
kern/src/kdebug.c

index 1a9ce3d..ffa0df2 100644 (file)
@@ -1217,9 +1217,9 @@ static size_t conswrite(struct chan *c, void *va, size_t n, off64_t off)
 
                case Qstdout:
                case Qstderr:
-                       px_lock();
+                       print_lock();
                        if (waserror()) {
-                               px_unlock();
+                               print_unlock();
                                nexterror();
                        }
                        /* TODO: tty hack.  they are sending us an escape sequence, and the
@@ -1231,7 +1231,7 @@ static size_t conswrite(struct chan *c, void *va, size_t n, off64_t off)
                                cputbuf(va, n);
                        }
                        poperror();
-                       px_unlock();
+                       print_unlock();
                        return n;
                case Qsysname:
                        /* TODO: this is racy */
index 7b482aa..cde8b96 100644 (file)
@@ -79,6 +79,3 @@ void set_printx(int mode);
 
 void debug_addr_proc(struct proc *p, unsigned long addr);
 void debug_addr_pid(int pid, unsigned long addr);
-
-void px_lock(void);
-void px_unlock(void);
index 60c64a7..858a74f 100644 (file)
@@ -253,7 +253,7 @@ void _panic(struct hw_trapframe *hw_tf, const char *file, int line,
        PERCPU_VAR(panic_depth)++;
 
        va_start(ap, fmt);
-       printk("kernel panic at %s:%d, from core %d: ", file, line,
+       printk("\nkernel panic at %s:%d, from core %d: ", file, line,
               core_id_early());
        vcprintf(fmt, ap);
        printk("\n");
@@ -315,7 +315,7 @@ void _warn(const char *file, int line, const char *fmt,...)
 
        print_lock();
        va_start(ap, fmt);
-       printk("kernel warning at %s:%d, from core %d: ", file, line,
+       printk("\nkernel warning at %s:%d, from core %d: ", file, line,
               core_id_early());
        vcprintf(fmt, ap);
        cprintf("\n");
index 9841484..c1c598b 100644 (file)
@@ -278,15 +278,3 @@ void backtrace_current_ctx(void)
        if (current)
                backtrace_user_ctx(current, current_ctx);
 }
-
-static spinlock_t __px_lock = SPINLOCK_INITIALIZER_IRQSAVE;
-void px_lock(void)
-{
-       if (printx_on)
-               spin_lock_irqsave(&__px_lock);
-}
-void px_unlock(void)
-{
-       if (printx_on)
-               spin_unlock_irqsave(&__px_lock);
-}