Fix slow uthread context switches
authorBarret Rhoden <brho@cs.berkeley.edu>
Tue, 8 Nov 2016 16:16:44 +0000 (11:16 -0500)
committerBarret Rhoden <brho@cs.berkeley.edu>
Tue, 29 Nov 2016 16:19:36 +0000 (11:19 -0500)
The lock addq is accessing 8 bytes, but we only need to access one byte.
Accessing 8 bytes could span a cacheline boundary, which it does currently.
Doing so causes two cache misses!

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
user/parlib/x86/vcore.c

index 3be41ae..5a4e8ab 100644 (file)
@@ -117,7 +117,7 @@ static void pop_hw_tf(struct hw_trapframe *tf, uint32_t vcoreid)
                                  /* Need a wrmb() here so the write of enable_notif can't pass
                                   * the read of notif_pending (racing with a potential
                                   * cross-core call with proc_notify()). */
-                                 "lock addq $0, (%%rdi);" /* LOCK is a CPU mb() */
+                                 "lock addb $0, (%%rdi);" /* LOCK is a CPU mb() */
                                  /* From here down, we can get interrupted and restarted */
                      "popq %%rdi;           " /* get notif_pending status loc */
                      "testb $0x01, (%%rdi); " /* test if a notif is pending */
@@ -173,7 +173,7 @@ static void pop_sw_tf(struct sw_trapframe *sw_tf, uint32_t vcoreid)
                      /* Need a wrmb() here so the write of enable_notif can't pass
                       * the read of notif_pending (racing with a potential
                       * cross-core call with proc_notify()). */
-                     "lock addq $0, (%2);   " /* LOCK is a CPU mb() */
+                     "lock addb $0, (%2);   " /* LOCK is a CPU mb() */
                      /* From here down, we can get interrupted and restarted */
                      "testb $0x01, (%3);    " /* test if a notif is pending */
                      "jz 1f;                " /* if not pending, skip syscall */