+static inline bool nvme_rdma_queue_sig_limit(struct nvme_rdma_queue *queue) +{ + int v, old; + + v = atomic_read(&queue->sig_count); + while (1) { + if (v > 1) { + old = atomic_cmpxchg(&queue->sig_count, v, v - 1); + if (old == v) + return false; + } else { + int new_count; + + new_count = nvme_rdma_init_sig_count(queue->queue_size); + old = atomic_cmpxchg(&queue->sig_count, v, new_count); + if (old == v) + return true; + } + v = old; + } +} +
Ugh, no... How about just do: if (atomic_inc_return(queue->sig_count) % queue->sig_limit) return true; return false; where queue->sig_limit = max(queue->queue_size / 2, 1); -- To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html