Performance: Only dereference commit index once
authorMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Sun, 25 Sep 2016 15:06:10 +0000 (11:06 -0400)
committerMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Sun, 25 Sep 2016 15:06:10 +0000 (11:06 -0400)
The commit fast path should not dereference the commit counter index
repeatedly for performance reasons.

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
lib/ringbuffer/frontend_api.h
lib/ringbuffer/frontend_internal.h
lib/ringbuffer/ring_buffer_frontend.c

index 517af6350b7c620a881dddf13401b4979969a793..a6f2c6f4f16742a4b35dafaeafcc25eaa13e1a61 100644 (file)
@@ -250,6 +250,7 @@ void lib_ring_buffer_commit(const struct lib_ring_buffer_config *config,
        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.
@@ -270,7 +271,7 @@ void lib_ring_buffer_commit(const struct lib_ring_buffer_config *config,
        } 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.
@@ -290,7 +291,7 @@ void lib_ring_buffer_commit(const struct lib_ring_buffer_config *config,
         *   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);
@@ -298,8 +299,8 @@ void lib_ring_buffer_commit(const struct lib_ring_buffer_config *config,
         * 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);
 }
 
 /**
index a2efee79a2f7f1ddcbc9ab31f5a7516ff5704cc0..88820f7e5c0c04d6b66255e38524c59b760e70a2 100644 (file)
@@ -288,9 +288,9 @@ static inline
 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;
 
@@ -306,9 +306,9 @@ void lib_ring_buffer_write_commit_counter(const struct lib_ring_buffer_config *c
        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,
index 9d13d2920420ee6c525d1e22ac0558dc030b7b1f..5e691bca9a52efd682800b8a1fc28d6cb6aa4a1a 100644 (file)
@@ -1380,9 +1380,9 @@ void lib_ring_buffer_switch_old_start(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]);
 }
 
 /*
@@ -1424,8 +1424,9 @@ void lib_ring_buffer_switch_old_end(struct lib_ring_buffer *buf,
        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]);
 }
 
 /*
@@ -1466,9 +1467,9 @@ void lib_ring_buffer_switch_new_start(struct lib_ring_buffer *buf,
        /* 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]);
 }
 
 /*
This page took 0.028 seconds and 4 git commands to generate.