The monitor doesn't cache coreid
authorBarret Rhoden <brho@cs.berkeley.edu>
Thu, 12 Sep 2013 00:41:02 +0000 (17:41 -0700)
committerBarret Rhoden <brho@cs.berkeley.edu>
Thu, 12 Sep 2013 00:46:43 +0000 (17:46 -0700)
Certain commands, when run from the monitor, can cause the monitor to
migrate unexpectedly.  We no longer cache the coreid, and we force a
re-read, so that we don't report the old coreid after a migration.

kern/src/monitor.c
kern/src/testing.c

index 75d65bc..97ae5ca 100644 (file)
@@ -829,7 +829,10 @@ void monitor(struct hw_trapframe *hw_tf)
                print_trapframe(hw_tf);
 
        while (1) {
-               cnt = readline(buf, MON_CMD_LENGTH, "ROS(Core %d)> ", coreid);
+               /* on occasion, the kernel monitor can migrate (like if you run
+                * something that blocks / syncs and wakes up on another core) */
+               cmb();
+               cnt = readline(buf, MON_CMD_LENGTH, "ROS(Core %d)> ", core_id_early());
                if (cnt > 0) {
                        buf[cnt] = 0;
                        if (runcmd(buf, hw_tf) < 0)
index 06babcc..0dbb40c 100644 (file)
@@ -1698,15 +1698,20 @@ void test_apipe(void)
        printd("ap_nr_readers %p\n", test_pipe.ap_nr_readers);
        printd("ap_nr_writers %p\n", test_pipe.ap_nr_writers);
        send_kernel_message(0, __test_apipe_writer, 0, 0, 0, KMSG_ROUTINE);
+       /* Once we start synchronizing with a kmsg / kthread that could be on a
+        * different core, we run the chance of being migrated when we block. */
        __test_apipe_reader(0, 0, 0, 0);
        /* Wait til the first test is done */
        while (test_pipe.ap_nr_writers) {
                kthread_yield();
                cpu_relax();
        }
-//     /* Try cross core (though CV wake ups schedule on the waking core) */
-//     apipe_open_reader(&test_pipe);
-//     apipe_open_writer(&test_pipe);
-//     send_kernel_message(1, __test_apipe_writer, 0, 0, 0, KMSG_ROUTINE);
-//     __test_apipe_reader(0, 0, 0, 0);
+       /* Try cross core (though CV wake ups schedule on the waking core) */
+       apipe_open_reader(&test_pipe);
+       apipe_open_writer(&test_pipe);
+       send_kernel_message(1, __test_apipe_writer, 0, 0, 0, KMSG_ROUTINE);
+       __test_apipe_reader(0, 0, 0, 0);
+       /* We could be on core 1 now.  If we were called from core0, our caller
+        * might expect us to return while being on core 0 (like if we were kfunc'd
+        * from the monitor.  Be careful if you copy this code. */
 }