- do {
- ret = lib_ring_buffer_try_reserve_slow(buf, chan, &offsets,
- ctx);
+ if (caa_unlikely(config->sync == RING_BUFFER_SYNC_GLOBAL
+ || rseq_state.cpu_id < 0
+ || uatomic_read(&chan->u.reserve_fallback_ref))) {
+ do {
+ ret = lib_ring_buffer_try_reserve_slow(buf, chan,
+ &offsets, ctx);
+ if (caa_unlikely(ret))
+ return ret;
+ } while (caa_unlikely(v_cmpxchg(config, &buf->offset,
+ offsets.old, offsets.end)
+ != offsets.old));
+ } else {
+ ret = lib_ring_buffer_try_reserve_slow(buf, chan,
+ &offsets, ctx);