aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/trace/ring_buffer.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/trace/ring_buffer.c')
-rw-r--r--kernel/trace/ring_buffer.c31
1 files changed, 20 insertions, 11 deletions
diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c
index 8c1b2d290718..d1187ef20caf 100644
--- a/kernel/trace/ring_buffer.c
+++ b/kernel/trace/ring_buffer.c
@@ -20,6 +20,7 @@
20#include <linux/cpu.h> 20#include <linux/cpu.h>
21#include <linux/fs.h> 21#include <linux/fs.h>
22 22
23#include <asm/local.h>
23#include "trace.h" 24#include "trace.h"
24 25
25/* 26/*
@@ -206,6 +207,14 @@ EXPORT_SYMBOL_GPL(tracing_is_on);
206#define RB_MAX_SMALL_DATA (RB_ALIGNMENT * RINGBUF_TYPE_DATA_TYPE_LEN_MAX) 207#define RB_MAX_SMALL_DATA (RB_ALIGNMENT * RINGBUF_TYPE_DATA_TYPE_LEN_MAX)
207#define RB_EVNT_MIN_SIZE 8U /* two 32bit words */ 208#define RB_EVNT_MIN_SIZE 8U /* two 32bit words */
208 209
210#if !defined(CONFIG_64BIT) || defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS)
211# define RB_FORCE_8BYTE_ALIGNMENT 0
212# define RB_ARCH_ALIGNMENT RB_ALIGNMENT
213#else
214# define RB_FORCE_8BYTE_ALIGNMENT 1
215# define RB_ARCH_ALIGNMENT 8U
216#endif
217
209/* define RINGBUF_TYPE_DATA for 'case RINGBUF_TYPE_DATA:' */ 218/* define RINGBUF_TYPE_DATA for 'case RINGBUF_TYPE_DATA:' */
210#define RINGBUF_TYPE_DATA 0 ... RINGBUF_TYPE_DATA_TYPE_LEN_MAX 219#define RINGBUF_TYPE_DATA 0 ... RINGBUF_TYPE_DATA_TYPE_LEN_MAX
211 220
@@ -1546,7 +1555,7 @@ rb_update_event(struct ring_buffer_event *event,
1546 1555
1547 case 0: 1556 case 0:
1548 length -= RB_EVNT_HDR_SIZE; 1557 length -= RB_EVNT_HDR_SIZE;
1549 if (length > RB_MAX_SMALL_DATA) 1558 if (length > RB_MAX_SMALL_DATA || RB_FORCE_8BYTE_ALIGNMENT)
1550 event->array[0] = length; 1559 event->array[0] = length;
1551 else 1560 else
1552 event->type_len = DIV_ROUND_UP(length, RB_ALIGNMENT); 1561 event->type_len = DIV_ROUND_UP(length, RB_ALIGNMENT);
@@ -1721,11 +1730,11 @@ static unsigned rb_calculate_event_length(unsigned length)
1721 if (!length) 1730 if (!length)
1722 length = 1; 1731 length = 1;
1723 1732
1724 if (length > RB_MAX_SMALL_DATA) 1733 if (length > RB_MAX_SMALL_DATA || RB_FORCE_8BYTE_ALIGNMENT)
1725 length += sizeof(event.array[0]); 1734 length += sizeof(event.array[0]);
1726 1735
1727 length += RB_EVNT_HDR_SIZE; 1736 length += RB_EVNT_HDR_SIZE;
1728 length = ALIGN(length, RB_ALIGNMENT); 1737 length = ALIGN(length, RB_ARCH_ALIGNMENT);
1729 1738
1730 return length; 1739 return length;
1731} 1740}
@@ -2232,12 +2241,12 @@ ring_buffer_lock_reserve(struct ring_buffer *buffer, unsigned long length)
2232 if (ring_buffer_flags != RB_BUFFERS_ON) 2241 if (ring_buffer_flags != RB_BUFFERS_ON)
2233 return NULL; 2242 return NULL;
2234 2243
2235 if (atomic_read(&buffer->record_disabled))
2236 return NULL;
2237
2238 /* If we are tracing schedule, we don't want to recurse */ 2244 /* If we are tracing schedule, we don't want to recurse */
2239 resched = ftrace_preempt_disable(); 2245 resched = ftrace_preempt_disable();
2240 2246
2247 if (atomic_read(&buffer->record_disabled))
2248 goto out_nocheck;
2249
2241 if (trace_recursive_lock()) 2250 if (trace_recursive_lock())
2242 goto out_nocheck; 2251 goto out_nocheck;
2243 2252
@@ -2469,11 +2478,11 @@ int ring_buffer_write(struct ring_buffer *buffer,
2469 if (ring_buffer_flags != RB_BUFFERS_ON) 2478 if (ring_buffer_flags != RB_BUFFERS_ON)
2470 return -EBUSY; 2479 return -EBUSY;
2471 2480
2472 if (atomic_read(&buffer->record_disabled))
2473 return -EBUSY;
2474
2475 resched = ftrace_preempt_disable(); 2481 resched = ftrace_preempt_disable();
2476 2482
2483 if (atomic_read(&buffer->record_disabled))
2484 goto out;
2485
2477 cpu = raw_smp_processor_id(); 2486 cpu = raw_smp_processor_id();
2478 2487
2479 if (!cpumask_test_cpu(cpu, buffer->cpumask)) 2488 if (!cpumask_test_cpu(cpu, buffer->cpumask))
@@ -2541,7 +2550,7 @@ EXPORT_SYMBOL_GPL(ring_buffer_record_disable);
2541 * @buffer: The ring buffer to enable writes 2550 * @buffer: The ring buffer to enable writes
2542 * 2551 *
2543 * Note, multiple disables will need the same number of enables 2552 * Note, multiple disables will need the same number of enables
2544 * to truely enable the writing (much like preempt_disable). 2553 * to truly enable the writing (much like preempt_disable).
2545 */ 2554 */
2546void ring_buffer_record_enable(struct ring_buffer *buffer) 2555void ring_buffer_record_enable(struct ring_buffer *buffer)
2547{ 2556{
@@ -2577,7 +2586,7 @@ EXPORT_SYMBOL_GPL(ring_buffer_record_disable_cpu);
2577 * @cpu: The CPU to enable. 2586 * @cpu: The CPU to enable.
2578 * 2587 *
2579 * Note, multiple disables will need the same number of enables 2588 * Note, multiple disables will need the same number of enables
2580 * to truely enable the writing (much like preempt_disable). 2589 * to truly enable the writing (much like preempt_disable).
2581 */ 2590 */
2582void ring_buffer_record_enable_cpu(struct ring_buffer *buffer, int cpu) 2591void ring_buffer_record_enable_cpu(struct ring_buffer *buffer, int cpu)
2583{ 2592{