ring-buffer: only enable ring_buffer_swap_cpu when needed
Since the ability to swap the cpu buffers adds a small overhead to the recording of a trace, we only want to add it when needed. Only the irqsoff and preemptoff tracers use this feature, and both are not recommended for production kernels. This patch disables its use when neither irqsoff nor preemptoff is configured. Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
This commit is contained in:
Родитель
62f0b3eb5c
Коммит
85bac32c4a
|
@ -140,8 +140,17 @@ unsigned long ring_buffer_size(struct ring_buffer *buffer);
|
||||||
void ring_buffer_reset_cpu(struct ring_buffer *buffer, int cpu);
|
void ring_buffer_reset_cpu(struct ring_buffer *buffer, int cpu);
|
||||||
void ring_buffer_reset(struct ring_buffer *buffer);
|
void ring_buffer_reset(struct ring_buffer *buffer);
|
||||||
|
|
||||||
|
#ifdef CONFIG_RING_BUFFER_ALLOW_SWAP
|
||||||
int ring_buffer_swap_cpu(struct ring_buffer *buffer_a,
|
int ring_buffer_swap_cpu(struct ring_buffer *buffer_a,
|
||||||
struct ring_buffer *buffer_b, int cpu);
|
struct ring_buffer *buffer_b, int cpu);
|
||||||
|
#else
|
||||||
|
static inline int
|
||||||
|
ring_buffer_swap_cpu(struct ring_buffer *buffer_a,
|
||||||
|
struct ring_buffer *buffer_b, int cpu)
|
||||||
|
{
|
||||||
|
return -ENODEV;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
int ring_buffer_empty(struct ring_buffer *buffer);
|
int ring_buffer_empty(struct ring_buffer *buffer);
|
||||||
int ring_buffer_empty_cpu(struct ring_buffer *buffer, int cpu);
|
int ring_buffer_empty_cpu(struct ring_buffer *buffer, int cpu);
|
||||||
|
|
|
@ -62,6 +62,12 @@ config EVENT_TRACING
|
||||||
config CONTEXT_SWITCH_TRACER
|
config CONTEXT_SWITCH_TRACER
|
||||||
bool
|
bool
|
||||||
|
|
||||||
|
config RING_BUFFER_ALLOW_SWAP
|
||||||
|
bool
|
||||||
|
help
|
||||||
|
Allow the use of ring_buffer_swap_cpu.
|
||||||
|
Adds a very slight overhead to tracing when enabled.
|
||||||
|
|
||||||
# All tracer options should select GENERIC_TRACER. For those options that are
|
# All tracer options should select GENERIC_TRACER. For those options that are
|
||||||
# enabled by all tracers (context switch and event tracer) they select TRACING.
|
# enabled by all tracers (context switch and event tracer) they select TRACING.
|
||||||
# This allows those options to appear when no other tracer is selected. But the
|
# This allows those options to appear when no other tracer is selected. But the
|
||||||
|
@ -146,6 +152,7 @@ config IRQSOFF_TRACER
|
||||||
select TRACE_IRQFLAGS
|
select TRACE_IRQFLAGS
|
||||||
select GENERIC_TRACER
|
select GENERIC_TRACER
|
||||||
select TRACER_MAX_TRACE
|
select TRACER_MAX_TRACE
|
||||||
|
select RING_BUFFER_ALLOW_SWAP
|
||||||
help
|
help
|
||||||
This option measures the time spent in irqs-off critical
|
This option measures the time spent in irqs-off critical
|
||||||
sections, with microsecond accuracy.
|
sections, with microsecond accuracy.
|
||||||
|
@ -167,6 +174,7 @@ config PREEMPT_TRACER
|
||||||
depends on PREEMPT
|
depends on PREEMPT
|
||||||
select GENERIC_TRACER
|
select GENERIC_TRACER
|
||||||
select TRACER_MAX_TRACE
|
select TRACER_MAX_TRACE
|
||||||
|
select RING_BUFFER_ALLOW_SWAP
|
||||||
help
|
help
|
||||||
This option measures the time spent in preemption off critical
|
This option measures the time spent in preemption off critical
|
||||||
sections, with microsecond accuracy.
|
sections, with microsecond accuracy.
|
||||||
|
|
|
@ -2084,6 +2084,7 @@ rb_reserve_next_event(struct ring_buffer *buffer,
|
||||||
|
|
||||||
rb_start_commit(cpu_buffer);
|
rb_start_commit(cpu_buffer);
|
||||||
|
|
||||||
|
#ifdef CONFIG_RING_BUFFER_ALLOW_SWAP
|
||||||
/*
|
/*
|
||||||
* Due to the ability to swap a cpu buffer from a buffer
|
* Due to the ability to swap a cpu buffer from a buffer
|
||||||
* it is possible it was swapped before we committed.
|
* it is possible it was swapped before we committed.
|
||||||
|
@ -2096,6 +2097,7 @@ rb_reserve_next_event(struct ring_buffer *buffer,
|
||||||
local_dec(&cpu_buffer->commits);
|
local_dec(&cpu_buffer->commits);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
length = rb_calculate_event_length(length);
|
length = rb_calculate_event_length(length);
|
||||||
again:
|
again:
|
||||||
|
@ -3498,6 +3500,7 @@ int ring_buffer_empty_cpu(struct ring_buffer *buffer, int cpu)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(ring_buffer_empty_cpu);
|
EXPORT_SYMBOL_GPL(ring_buffer_empty_cpu);
|
||||||
|
|
||||||
|
#ifdef CONFIG_RING_BUFFER_ALLOW_SWAP
|
||||||
/**
|
/**
|
||||||
* ring_buffer_swap_cpu - swap a CPU buffer between two ring buffers
|
* ring_buffer_swap_cpu - swap a CPU buffer between two ring buffers
|
||||||
* @buffer_a: One buffer to swap with
|
* @buffer_a: One buffer to swap with
|
||||||
|
@ -3573,6 +3576,7 @@ out:
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(ring_buffer_swap_cpu);
|
EXPORT_SYMBOL_GPL(ring_buffer_swap_cpu);
|
||||||
|
#endif /* CONFIG_RING_BUFFER_ALLOW_SWAP */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ring_buffer_alloc_read_page - allocate a page to read from buffer
|
* ring_buffer_alloc_read_page - allocate a page to read from buffer
|
||||||
|
|
Загрузка…
Ссылка в новой задаче