Removes extra CASs in the PVC alarm
authorBarret Rhoden <brho@cs.berkeley.edu>
Tue, 3 Jun 2014 21:27:47 +0000 (14:27 -0700)
committerBarret Rhoden <brho@cs.berkeley.edu>
Tue, 3 Jun 2014 21:27:47 +0000 (14:27 -0700)
Just need a read (with appropriate ordering).

Documentation/memory_barriers.txt
user/benchutil/pvcalarm.c

index 125d3e6..64887ea 100644 (file)
@@ -10,7 +10,7 @@ Barret Rhoden
 1. Overview
 ====================
 Memory barriers exist to make sure the compiler and the CPU do what we intend.
-The compiler memory barreir (cmb()) (called an optimization barrier in linux)
+The compiler memory barrier (cmb()) (called an optimization barrier in linux)
 prevents the compliler from reordering operations.  However, CPUs can also
 reorder reads and writes, in an architecture-dependent manner.  In most places
 with shared memory synchronization, you'll need some form of memory barriers.
index 36ea2e7..d585a70 100644 (file)
@@ -234,11 +234,12 @@ static void init_pvcalarm(struct pvcalarm_data *pvcalarm_data, int vcoreid)
  * service in a running application. */
 static inline bool __vcore_preamble()
 {
+       int state;
        assert(in_vcore_context());
        __sync_fetch_and_add(&global_pvcalarm.busy_count, 1);
-       if (atomic_cas(&global_pvcalarm.state, S_DISABLED, S_DISABLED))
-               goto disabled;
-       if (atomic_cas(&global_pvcalarm.state, S_DISABLING, S_DISABLING))
+       cmb();  /* order the state read after the incref.  __sync provides cpu mb */
+       state = atomic_read(&global_pvcalarm.state);
+       if (state == S_DISABLED || state == S_DISABLING)
                goto disabled;
        return true;
 disabled: