The commit fast path should not dereference the commit counter index
repeatedly for performance reasons.
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
unsigned long offset_end = ctx->buf_offset;
unsigned long endidx = subbuf_index(offset_end - 1, chan);
unsigned long commit_count;
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.
/*
* Must count record before incrementing the commit count.
- 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.
/*
* 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.
*/
* 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);
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.
*/
* 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,
void lib_ring_buffer_write_commit_counter(const struct lib_ring_buffer_config *config,
struct lib_ring_buffer *buf,
struct channel *chan,
unsigned long buf_offset,
unsigned long buf_offset,
- unsigned long commit_count)
+ unsigned long commit_count,
+ struct commit_counters_hot *cc_hot)
{
unsigned long commit_seq_old;
{
unsigned long commit_seq_old;
if (unlikely(subbuf_offset(buf_offset - commit_count, chan)))
return;
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))
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,
}
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);
/* 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(),
offsets->old + config->cb.subbuffer_header_size(),
+ 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);
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);
/* 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(),
offsets->begin + config->cb.subbuffer_header_size(),
+ commit_count, &buf->commit_hot[beginidx]);