Catch bugs in sys_block()
authorBarret Rhoden <brho@cs.berkeley.edu>
Tue, 15 Mar 2011 21:32:14 +0000 (14:32 -0700)
committerKevin Klues <klueska@cs.berkeley.edu>
Thu, 3 Nov 2011 00:36:00 +0000 (17:36 -0700)
Do not call sys_block (or sleep in a blockdev blocking call!) in more
than one place at a time.  This will try to catch multiple uses of the
interrupt handler's void*, though it isn't atomic so it will not catch
everything.

kern/src/syscall.c

index 4fb2a96..13746f1 100644 (file)
@@ -118,15 +118,17 @@ static int sys_block(void)
                kthread_runnable(sleeper);
                assert(TAILQ_EMPTY(&sem->waiters));
        }
-
+       void *prev_data = interrupt_handlers[LAPIC_TIMER_DEFAULT_VECTOR].data;
+       if (prev_data)
+               warn("Something (%08p) already waiting on the LAPIC timer!", prev_data);
        register_interrupt_handler(interrupt_handlers, LAPIC_TIMER_DEFAULT_VECTOR,
                                   x86_unblock_handler, sem);
-       /* This fakes a 100ms delay.  Though it might be less, esp in _M mode.
-        * TODO KVM-timing. */
-       set_core_timer(100000); /* in microseconds */
-       printk("[kernel] sys_block(), sleeping at %llu\n", read_tsc());
+       /* This fakes a 1ms delay.  Though it might be less, esp in _M mode on KVM.
+        * TODO KVM-timing (adjust it up by a lot in a VM). */
+       set_core_timer(1000);   /* in microseconds */
+       printd("[kernel] sys_block(), sleeping at %llu\n", read_tsc());
        sleep_on(sem);
-       printk("[kernel] sys_block(), waking up at %llu\n", read_tsc());
+       printd("[kernel] sys_block(), waking up at %llu\n", read_tsc());
        return 0;
 #else /* sparc */
        set_errno(ENOSYS);