unsigned long offset_end = ctx->buf_offset;
unsigned long endidx = subbuf_index(offset_end - 1, chan);
unsigned long commit_count;
+ struct commit_counters_hot *cc_hot = &buf->commit_hot[endidx];
/*
* Must count record before incrementing the commit count.
} else
smp_wmb();
- v_add(config, ctx->slot_size, &buf->commit_hot[endidx].cc);
+ v_add(config, ctx->slot_size, &cc_hot->cc);
/*
* commit count read can race with concurrent OOO commit count updates.
* count reaches back the reserve offset for a specific sub-buffer,
* which is completely independent of the order.
*/
- commit_count = v_read(config, &buf->commit_hot[endidx].cc);
+ commit_count = v_read(config, &cc_hot->cc);
lib_ring_buffer_check_deliver(config, buf, chan, offset_end - 1,
commit_count, endidx, ctx->tsc);
* Update used size at each commit. It's needed only for extracting
* ring_buffer buffers from vmcore, after crash.
*/
- lib_ring_buffer_write_commit_counter(config, buf, chan, endidx,
- offset_end, commit_count);
+ lib_ring_buffer_write_commit_counter(config, buf, chan,
+ offset_end, commit_count, cc_hot);
}
/**
void lib_ring_buffer_write_commit_counter(const struct lib_ring_buffer_config *config,
struct lib_ring_buffer *buf,
struct channel *chan,
- unsigned long idx,
unsigned long buf_offset,
- unsigned long commit_count)
+ unsigned long commit_count,
+ struct commit_counters_hot *cc_hot)
{
unsigned long commit_seq_old;
if (unlikely(subbuf_offset(buf_offset - commit_count, chan)))
return;
- commit_seq_old = v_read(config, &buf->commit_hot[idx].seq);
+ commit_seq_old = v_read(config, &cc_hot->seq);
if (likely((long) (commit_seq_old - commit_count) < 0))
- v_set(config, &buf->commit_hot[idx].seq, commit_count);
+ v_set(config, &cc_hot->seq, commit_count);
}
extern int lib_ring_buffer_create(struct lib_ring_buffer *buf,
/* Check if the written buffer has to be delivered */
lib_ring_buffer_check_deliver(config, buf, chan, offsets->old,
commit_count, oldidx, tsc);
- lib_ring_buffer_write_commit_counter(config, buf, chan, oldidx,
+ lib_ring_buffer_write_commit_counter(config, buf, chan,
offsets->old + config->cb.subbuffer_header_size(),
- commit_count);
+ commit_count, &buf->commit_hot[oldidx]);
}
/*
commit_count = v_read(config, &buf->commit_hot[oldidx].cc);
lib_ring_buffer_check_deliver(config, buf, chan, offsets->old - 1,
commit_count, oldidx, tsc);
- lib_ring_buffer_write_commit_counter(config, buf, chan, oldidx,
- offsets->old + padding_size, commit_count);
+ lib_ring_buffer_write_commit_counter(config, buf, chan,
+ offsets->old + padding_size, commit_count,
+ &buf->commit_hot[oldidx]);
}
/*
/* Check if the written buffer has to be delivered */
lib_ring_buffer_check_deliver(config, buf, chan, offsets->begin,
commit_count, beginidx, tsc);
- lib_ring_buffer_write_commit_counter(config, buf, chan, beginidx,
+ lib_ring_buffer_write_commit_counter(config, buf, chan,
offsets->begin + config->cb.subbuffer_header_size(),
- commit_count);
+ commit_count, &buf->commit_hot[beginidx]);
}
/*