X-Git-Url: http://git.lttng.org./?a=blobdiff_plain;f=src%2Flib%2Fringbuffer%2Fring_buffer_iterator.c;h=147450f8250b1c0ff000e35c8df97125cf9af6b1;hb=cefd899fc3de0c29491332929cec445e0d459760;hp=64fc50861b062ba8ba988a7a51f013a407154ccb;hpb=5a15f70c5211ff4a398171a6971586e2948eb419;p=lttng-modules.git diff --git a/src/lib/ringbuffer/ring_buffer_iterator.c b/src/lib/ringbuffer/ring_buffer_iterator.c index 64fc5086..147450f8 100644 --- a/src/lib/ringbuffer/ring_buffer_iterator.c +++ b/src/lib/ringbuffer/ring_buffer_iterator.c @@ -46,7 +46,7 @@ restart: switch (iter->state) { case ITER_GET_SUBBUF: ret = lib_ring_buffer_get_next_subbuf(buf); - if (ret && !READ_ONCE(buf->finalized) + if (ret && !LTTNG_READ_ONCE(buf->finalized) && config->alloc == RING_BUFFER_ALLOC_GLOBAL) { /* * Use "pull" scheme for global buffers. The reader @@ -105,6 +105,24 @@ restart: } EXPORT_SYMBOL_GPL(lib_ring_buffer_get_next_record); +void lib_ring_buffer_put_current_record(struct lib_ring_buffer *buf) +{ + struct lib_ring_buffer_iter *iter; + + if (!buf) + return; + iter = &buf->iter; + if (iter->state != ITER_NEXT_RECORD) + return; + iter->read_offset += iter->payload_len; + iter->state = ITER_TEST_RECORD; + if (iter->read_offset - iter->consumed >= iter->data_size) { + lib_ring_buffer_put_next_subbuf(buf); + iter->state = ITER_GET_SUBBUF; + } +} +EXPORT_SYMBOL_GPL(lib_ring_buffer_put_current_record); + static int buf_is_higher(void *a, void *b) { struct lib_ring_buffer *bufa = a; @@ -335,7 +353,7 @@ void lib_ring_buffer_iterator_init(struct channel *chan, struct lib_ring_buffer list_add(&buf->iter.empty_node, &chan->iter.empty_head); } -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4,10,0)) +#if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(4,10,0)) int lttng_cpuhp_rb_iter_online(unsigned int cpu, struct lttng_cpuhp_node *node) @@ -352,7 +370,7 @@ int lttng_cpuhp_rb_iter_online(unsigned int cpu, } EXPORT_SYMBOL_GPL(lttng_cpuhp_rb_iter_online); -#else /* #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4,10,0)) */ +#else /* #if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(4,10,0)) */ #ifdef CONFIG_HOTPLUG_CPU static @@ -384,7 +402,7 @@ int channel_iterator_cpu_hotplug(struct notifier_block *nb, } #endif -#endif /* #else #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4,10,0)) */ +#endif /* #else #if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(4,10,0)) */ int channel_iterator_init(struct channel *chan) { @@ -401,13 +419,13 @@ int channel_iterator_init(struct channel *chan) if (ret) return ret; -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4,10,0)) +#if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(4,10,0)) chan->cpuhp_iter_online.component = LTTNG_RING_BUFFER_ITER; ret = cpuhp_state_add_instance(lttng_rb_hp_online, &chan->cpuhp_iter_online.node); if (ret) return ret; -#else /* #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4,10,0)) */ +#else /* #if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(4,10,0)) */ { int cpu; @@ -436,7 +454,7 @@ int channel_iterator_init(struct channel *chan) } #endif } -#endif /* #else #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4,10,0)) */ +#endif /* #else #if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(4,10,0)) */ } else { buf = channel_get_ring_buffer(config, chan, 0); lib_ring_buffer_iterator_init(chan, buf); @@ -449,7 +467,7 @@ void channel_iterator_unregister_notifiers(struct channel *chan) const struct lib_ring_buffer_config *config = &chan->backend.config; if (config->alloc == RING_BUFFER_ALLOC_PER_CPU) { -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4,10,0)) +#if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(4,10,0)) { int ret; @@ -457,10 +475,10 @@ void channel_iterator_unregister_notifiers(struct channel *chan) &chan->cpuhp_iter_online.node); WARN_ON(ret); } -#else /* #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4,10,0)) */ +#else /* #if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(4,10,0)) */ chan->hp_iter_enable = 0; unregister_cpu_notifier(&chan->hp_iter_notifier); -#endif /* #else #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4,10,0)) */ +#endif /* #else #if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(4,10,0)) */ } } @@ -696,12 +714,14 @@ skip_get_next: return -EFAULT; } read_count += copy_len; - }; - return read_count; + } + goto put_record; nodata: *ppos = 0; chan->iter.len_left = 0; +put_record: + lib_ring_buffer_put_current_record(buf); return read_count; }