aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/linux/ring_buffer.h9
-rw-r--r--kernel/trace/Kconfig8
-rw-r--r--kernel/trace/ring_buffer.c4
3 files changed, 21 insertions, 0 deletions
diff --git a/include/linux/ring_buffer.h b/include/linux/ring_buffer.h
index e061b4ecdc3a..5fcc31ed5771 100644
--- a/include/linux/ring_buffer.h
+++ b/include/linux/ring_buffer.h
@@ -140,8 +140,17 @@ unsigned long ring_buffer_size(struct ring_buffer *buffer);
140void ring_buffer_reset_cpu(struct ring_buffer *buffer, int cpu); 140void ring_buffer_reset_cpu(struct ring_buffer *buffer, int cpu);
141void ring_buffer_reset(struct ring_buffer *buffer); 141void ring_buffer_reset(struct ring_buffer *buffer);
142 142
143#ifdef CONFIG_RING_BUFFER_ALLOW_SWAP
143int ring_buffer_swap_cpu(struct ring_buffer *buffer_a, 144int ring_buffer_swap_cpu(struct ring_buffer *buffer_a,
144 struct ring_buffer *buffer_b, int cpu); 145 struct ring_buffer *buffer_b, int cpu);
146#else
147static inline int
148ring_buffer_swap_cpu(struct ring_buffer *buffer_a,
149 struct ring_buffer *buffer_b, int cpu)
150{
151 return -ENODEV;
152}
153#endif
145 154
146int ring_buffer_empty(struct ring_buffer *buffer); 155int ring_buffer_empty(struct ring_buffer *buffer);
147int ring_buffer_empty_cpu(struct ring_buffer *buffer, int cpu); 156int ring_buffer_empty_cpu(struct ring_buffer *buffer, int cpu);
diff --git a/kernel/trace/Kconfig b/kernel/trace/Kconfig
index 163fbfc2f39f..1ea0d1234f4a 100644
--- a/kernel/trace/Kconfig
+++ b/kernel/trace/Kconfig
@@ -62,6 +62,12 @@ config EVENT_TRACING
62config CONTEXT_SWITCH_TRACER 62config CONTEXT_SWITCH_TRACER
63 bool 63 bool
64 64
65config RING_BUFFER_ALLOW_SWAP
66 bool
67 help
68 Allow the use of ring_buffer_swap_cpu.
69 Adds a very slight overhead to tracing when enabled.
70
65# All tracer options should select GENERIC_TRACER. For those options that are 71# All tracer options should select GENERIC_TRACER. For those options that are
66# enabled by all tracers (context switch and event tracer) they select TRACING. 72# enabled by all tracers (context switch and event tracer) they select TRACING.
67# This allows those options to appear when no other tracer is selected. But the 73# This allows those options to appear when no other tracer is selected. But the
@@ -146,6 +152,7 @@ config IRQSOFF_TRACER
146 select TRACE_IRQFLAGS 152 select TRACE_IRQFLAGS
147 select GENERIC_TRACER 153 select GENERIC_TRACER
148 select TRACER_MAX_TRACE 154 select TRACER_MAX_TRACE
155 select RING_BUFFER_ALLOW_SWAP
149 help 156 help
150 This option measures the time spent in irqs-off critical 157 This option measures the time spent in irqs-off critical
151 sections, with microsecond accuracy. 158 sections, with microsecond accuracy.
@@ -167,6 +174,7 @@ config PREEMPT_TRACER
167 depends on PREEMPT 174 depends on PREEMPT
168 select GENERIC_TRACER 175 select GENERIC_TRACER
169 select TRACER_MAX_TRACE 176 select TRACER_MAX_TRACE
177 select RING_BUFFER_ALLOW_SWAP
170 help 178 help
171 This option measures the time spent in preemption off critical 179 This option measures the time spent in preemption off critical
172 sections, with microsecond accuracy. 180 sections, with microsecond accuracy.
diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c
index 1766c0e8db5a..454e74e718cf 100644
--- a/kernel/trace/ring_buffer.c
+++ b/kernel/trace/ring_buffer.c
@@ -2084,6 +2084,7 @@ rb_reserve_next_event(struct ring_buffer *buffer,
2084 2084
2085 rb_start_commit(cpu_buffer); 2085 rb_start_commit(cpu_buffer);
2086 2086
2087#ifdef CONFIG_RING_BUFFER_ALLOW_SWAP
2087 /* 2088 /*
2088 * Due to the ability to swap a cpu buffer from a buffer 2089 * Due to the ability to swap a cpu buffer from a buffer
2089 * it is possible it was swapped before we committed. 2090 * it is possible it was swapped before we committed.
@@ -2096,6 +2097,7 @@ rb_reserve_next_event(struct ring_buffer *buffer,
2096 local_dec(&cpu_buffer->commits); 2097 local_dec(&cpu_buffer->commits);
2097 return NULL; 2098 return NULL;
2098 } 2099 }
2100#endif
2099 2101
2100 length = rb_calculate_event_length(length); 2102 length = rb_calculate_event_length(length);
2101 again: 2103 again:
@@ -3498,6 +3500,7 @@ int ring_buffer_empty_cpu(struct ring_buffer *buffer, int cpu)
3498} 3500}
3499EXPORT_SYMBOL_GPL(ring_buffer_empty_cpu); 3501EXPORT_SYMBOL_GPL(ring_buffer_empty_cpu);
3500 3502
3503#ifdef CONFIG_RING_BUFFER_ALLOW_SWAP
3501/** 3504/**
3502 * ring_buffer_swap_cpu - swap a CPU buffer between two ring buffers 3505 * ring_buffer_swap_cpu - swap a CPU buffer between two ring buffers
3503 * @buffer_a: One buffer to swap with 3506 * @buffer_a: One buffer to swap with
@@ -3573,6 +3576,7 @@ out:
3573 return ret; 3576 return ret;
3574} 3577}
3575EXPORT_SYMBOL_GPL(ring_buffer_swap_cpu); 3578EXPORT_SYMBOL_GPL(ring_buffer_swap_cpu);
3579#endif /* CONFIG_RING_BUFFER_ALLOW_SWAP */
3576 3580
3577/** 3581/**
3578 * ring_buffer_alloc_read_page - allocate a page to read from buffer 3582 * ring_buffer_alloc_read_page - allocate a page to read from buffer