X-Git-Url: https://pd.if.org/git/?p=nbds;a=blobdiff_plain;f=runtime%2Frcu.c;h=0c491334c30acd71aa966986e323cc1d4ea6d403;hp=50205e8670173c2d2ab55089ae1cac4b4bb80901;hb=6b4f3ea4891b6c0e65dfd6d41f49aee2daa9e23d;hpb=a03cf3b0c40e6c3b8b4877b49a64288cb3fcb919 diff --git a/runtime/rcu.c b/runtime/rcu.c index 50205e8..0c49133 100644 --- a/runtime/rcu.c +++ b/runtime/rcu.c @@ -43,7 +43,7 @@ void rcu_thread_init (int id) { assert(id < MAX_NUM_THREADS); if (pending_[id] == NULL) { pending_[id] = fifo_alloc(RCU_QUEUE_SCALE); - SYNC_ADD(&num_threads_, 1); + (void)SYNC_ADD(&num_threads_, 1); } } @@ -65,10 +65,12 @@ void rcu_update (void) { } // free - while (pending_[tid_]->tail != rcu_[tid_][tid_]) { - fifo_t *q = pending_[tid_]; - uint32_t i = MOD_SCALE(q->tail++, q->scale); + fifo_t *q = pending_[tid_]; + while (q->tail != rcu_[tid_][tid_]) { + uint32_t i = MOD_SCALE(q->tail, q->scale); + TRACE("r0", "rcu_update: freeing %p from queue at position %llu", q->x[i], q->tail); nbd_free(q->x[i]); + q->tail++; } } @@ -77,13 +79,14 @@ void rcu_defer_free (void *x) { LOCALIZE_THREAD_LOCAL(tid_, int); fifo_t *q = pending_[tid_]; assert(MOD_SCALE(q->head + 1, q->scale) != MOD_SCALE(q->tail, q->scale)); - uint32_t i = MOD_SCALE(q->head++, q->scale); + uint32_t i = MOD_SCALE(q->head, q->scale); q->x[i] = x; - TRACE("r0", "rcu_defer_free: put %p on queue at position %llu", x, pending_[tid_]->head); + TRACE("r0", "rcu_defer_free: put %p on queue at position %llu", x, q->head); + q->head++; - if (pending_[tid_]->head - rcu_last_posted_[tid_][tid_] < RCU_POST_THRESHOLD) - return; - TRACE("r0", "rcu_defer_free: posting %llu", pending_[tid_]->head, 0); - int next_thread_id = (tid_ + 1) % num_threads_; - rcu_[next_thread_id][tid_] = rcu_last_posted_[tid_][tid_] = pending_[tid_]->head; + if (pending_[tid_]->head - rcu_last_posted_[tid_][tid_] >= RCU_POST_THRESHOLD) { + TRACE("r0", "rcu_defer_free: posting %llu", pending_[tid_]->head, 0); + int next_thread_id = (tid_ + 1) % num_threads_; + rcu_[next_thread_id][tid_] = rcu_last_posted_[tid_][tid_] = pending_[tid_]->head; + } }