Console locking
authorBarret Rhoden <brho@cs.berkeley.edu>
Fri, 23 Oct 2009 05:32:00 +0000 (22:32 -0700)
committerAndrew Waterman <waterman@r53.millennium.berkeley.edu>
Mon, 26 Oct 2009 10:45:10 +0000 (03:45 -0700)
Changed the console locking to only lock after successfully polling for
a character.  This avoids some weird lockups in VMs where a printf hangs
until you hit the keyboard.

Note that there are no locks protecting the keyboard or serial polling.
Core0 is the only one that is allowed to enter the monitor, so it's not
currently an issue.  We'll need different locks there anyways if we ever
allow concurrent access to those devices (since there's more that one
way to get to the device).

kern/arch/i386/console.c

index d4aa439..e02af82 100644 (file)
@@ -509,9 +509,11 @@ cons_intr(int (*proc)(void))
        while ((c = (*proc)()) != -1) {
                if (c == 0)
                        continue;
+               spin_lock_irqsave(&lock);
                cons.buf[cons.wpos++] = c;
                if (cons.wpos == CONSBUFSIZE)
                        cons.wpos = 0;
+               spin_unlock_irqsave(&lock);
        }
 }
 
@@ -521,8 +523,6 @@ cons_getc(void)
 {
        int c;
 
-       spin_lock_irqsave(&lock);
-
        // poll for any pending input characters,
        // so that this function works even when interrupts are disabled
        // (e.g., when called from the kernel monitor).
@@ -532,6 +532,7 @@ cons_getc(void)
        kbd_intr();
 
        // grab the next character from the input buffer.
+       spin_lock_irqsave(&lock);
        if (cons.rpos != cons.wpos) {
                c = cons.buf[cons.rpos++];
                if (cons.rpos == CONSBUFSIZE)