Print this page
6138 don't abuse atomic_cas_*
@@ -62,11 +62,11 @@
* Every CPU has xc_work_cnt, which indicates it has messages to process.
* This value is incremented as message traffic is initiated and decremented
* with every message that finishes all processing.
*
* The code needs no mfence or other membar_*() calls. The uses of
- * atomic_cas_ptr(), atomic_cas_32() and atomic_dec_32() for the message
+ * atomic_cas_ptr(), atomic_inc_32_nv() and atomic_dec_32() for the message
* passing are implemented with LOCK prefix instructions which are
* equivalent to mfence.
*
* One interesting aspect of this implmentation is that it allows 2 or more
* CPUs to initiate cross calls to intersecting sets of CPUs at the same time.
@@ -140,15 +140,11 @@
* Increment a CPU's work count and return the old value
*/
static int
xc_increment(struct machcpu *mcpu)
{
- int old;
- do {
- old = mcpu->xc_work_cnt;
- } while (atomic_cas_32(&mcpu->xc_work_cnt, old, old + 1) != old);
- return (old);
+ return (atomic_inc_32_nv(&mcpu->xc_work_cnt) - 1);
}
/*
* Put a message into a queue. The insertion is atomic no matter
* how many different inserts/extracts to the same queue happen.