Performance: Only dereference shmp once
authorMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Mon, 19 Sep 2016 01:38:38 +0000 (21:38 -0400)
committerMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Sat, 24 Sep 2016 14:56:40 +0000 (10:56 -0400)
Dereferencing shared-memory pointers is expensive: many bound checks are
performed. Ensure the shmp is only dereferenced once in the commit
fast-path.

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

index 5ddb8ac460951f0bae59a3f098cf6bca510a3799..eea2a8db579686995d1c204995fdb4dcda51668b 100644 (file)
@@ -250,6 +250,8 @@ void lib_ring_buffer_commit(const struct lttng_ust_lib_ring_buffer_config *confi
        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 = shmp_index(handle,
+                                               buf->commit_hot, endidx);
 
        /*
         * Must count record before incrementing the commit count.
@@ -262,7 +264,7 @@ void lib_ring_buffer_commit(const struct lttng_ust_lib_ring_buffer_config *confi
         */
        cmm_smp_wmb();
 
-       v_add(config, ctx->slot_size, &shmp_index(handle, 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.
@@ -282,7 +284,7 @@ void lib_ring_buffer_commit(const struct lttng_ust_lib_ring_buffer_config *confi
         *   count reaches back the reserve offset for a specific sub-buffer,
         *   which is completely independent of the order.
         */
-       commit_count = v_read(config, &shmp_index(handle, 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, handle, ctx->tsc);
@@ -290,8 +292,8 @@ void lib_ring_buffer_commit(const struct lttng_ust_lib_ring_buffer_config *confi
         * 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, handle);
+       lib_ring_buffer_write_commit_counter(config, buf, chan,
+                       offset_end, commit_count, handle, cc_hot);
 }
 
 /**
index c973e6b25f88c1cc905bedfb28463f7cc5499316..10d6c4db789bbf498e3188a1a339c5e94223653f 100644 (file)
@@ -294,10 +294,10 @@ static inline
 void lib_ring_buffer_write_commit_counter(const struct lttng_ust_lib_ring_buffer_config *config,
                                          struct lttng_ust_lib_ring_buffer *buf,
                                          struct channel *chan,
-                                         unsigned long idx,
                                          unsigned long buf_offset,
                                          unsigned long commit_count,
-                                         struct lttng_ust_shm_handle *handle)
+                                         struct lttng_ust_shm_handle *handle,
+                                         struct commit_counters_hot *cc_hot)
 {
        unsigned long commit_seq_old;
 
@@ -313,10 +313,9 @@ void lib_ring_buffer_write_commit_counter(const struct lttng_ust_lib_ring_buffer
        if (caa_unlikely(subbuf_offset(buf_offset - commit_count, chan)))
                return;
 
-       commit_seq_old = v_read(config, &shmp_index(handle, buf->commit_hot, idx)->seq);
+       commit_seq_old = v_read(config, &cc_hot->seq);
        if (caa_likely((long) (commit_seq_old - commit_count) < 0))
-               v_set(config, &shmp_index(handle, buf->commit_hot, idx)->seq,
-                       commit_count);
+               v_set(config, &cc_hot->seq, commit_count);
 }
 
 extern int lib_ring_buffer_create(struct lttng_ust_lib_ring_buffer *buf,
index 1396f44a26263a202867b6f9f2e115275e4d9b35..accd5dc525fa5425f3806b57ecb68e0f97710fec 100644 (file)
@@ -1623,9 +1623,10 @@ void lib_ring_buffer_switch_old_start(struct lttng_ust_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, handle, 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, handle);
+                       commit_count, handle,
+                       shmp_index(handle, buf->commit_hot, oldidx));
 }
 
 /*
@@ -1661,8 +1662,9 @@ void lib_ring_buffer_switch_old_end(struct lttng_ust_lib_ring_buffer *buf,
        commit_count = v_read(config, &shmp_index(handle, buf->commit_hot, oldidx)->cc);
        lib_ring_buffer_check_deliver(config, buf, chan, offsets->old - 1,
                                      commit_count, oldidx, handle, tsc);
-       lib_ring_buffer_write_commit_counter(config, buf, chan, oldidx,
-                       offsets->old + padding_size, commit_count, handle);
+       lib_ring_buffer_write_commit_counter(config, buf, chan,
+                       offsets->old + padding_size, commit_count, handle,
+                       shmp_index(handle, buf->commit_hot, oldidx));
 }
 
 /*
@@ -1696,9 +1698,10 @@ void lib_ring_buffer_switch_new_start(struct lttng_ust_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, handle, 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, handle);
+                       commit_count, handle,
+                       shmp_index(handle, buf->commit_hot, beginidx));
 }
 
 /*
This page took 0.02787 seconds and 4 git commands to generate.