xref: /linux-6.15/kernel/trace/ring_buffer.c (revision 2c2d7329)
17a8e76a3SSteven Rostedt /*
27a8e76a3SSteven Rostedt  * Generic ring buffer
37a8e76a3SSteven Rostedt  *
47a8e76a3SSteven Rostedt  * Copyright (C) 2008 Steven Rostedt <[email protected]>
57a8e76a3SSteven Rostedt  */
67a8e76a3SSteven Rostedt #include <linux/ring_buffer.h>
77a8e76a3SSteven Rostedt #include <linux/spinlock.h>
87a8e76a3SSteven Rostedt #include <linux/debugfs.h>
97a8e76a3SSteven Rostedt #include <linux/uaccess.h>
107a8e76a3SSteven Rostedt #include <linux/module.h>
117a8e76a3SSteven Rostedt #include <linux/percpu.h>
127a8e76a3SSteven Rostedt #include <linux/mutex.h>
137a8e76a3SSteven Rostedt #include <linux/sched.h>	/* used for sched_clock() (for now) */
147a8e76a3SSteven Rostedt #include <linux/init.h>
157a8e76a3SSteven Rostedt #include <linux/hash.h>
167a8e76a3SSteven Rostedt #include <linux/list.h>
177a8e76a3SSteven Rostedt #include <linux/fs.h>
187a8e76a3SSteven Rostedt 
19182e9f5fSSteven Rostedt #include "trace.h"
20182e9f5fSSteven Rostedt 
21033601a3SSteven Rostedt /*
22033601a3SSteven Rostedt  * A fast way to enable or disable all ring buffers is to
23033601a3SSteven Rostedt  * call tracing_on or tracing_off. Turning off the ring buffers
24033601a3SSteven Rostedt  * prevents all ring buffers from being recorded to.
25033601a3SSteven Rostedt  * Turning this switch on, makes it OK to write to the
26033601a3SSteven Rostedt  * ring buffer, if the ring buffer is enabled itself.
27033601a3SSteven Rostedt  *
28033601a3SSteven Rostedt  * There's three layers that must be on in order to write
29033601a3SSteven Rostedt  * to the ring buffer.
30033601a3SSteven Rostedt  *
31033601a3SSteven Rostedt  * 1) This global flag must be set.
32033601a3SSteven Rostedt  * 2) The ring buffer must be enabled for recording.
33033601a3SSteven Rostedt  * 3) The per cpu buffer must be enabled for recording.
34033601a3SSteven Rostedt  *
35033601a3SSteven Rostedt  * In case of an anomaly, this global flag has a bit set that
36033601a3SSteven Rostedt  * will permantly disable all ring buffers.
37033601a3SSteven Rostedt  */
38033601a3SSteven Rostedt 
39033601a3SSteven Rostedt /*
40033601a3SSteven Rostedt  * Global flag to disable all recording to ring buffers
41033601a3SSteven Rostedt  *  This has two bits: ON, DISABLED
42033601a3SSteven Rostedt  *
43033601a3SSteven Rostedt  *  ON   DISABLED
44033601a3SSteven Rostedt  * ---- ----------
45033601a3SSteven Rostedt  *   0      0        : ring buffers are off
46033601a3SSteven Rostedt  *   1      0        : ring buffers are on
47033601a3SSteven Rostedt  *   X      1        : ring buffers are permanently disabled
48033601a3SSteven Rostedt  */
49033601a3SSteven Rostedt 
50033601a3SSteven Rostedt enum {
51033601a3SSteven Rostedt 	RB_BUFFERS_ON_BIT	= 0,
52033601a3SSteven Rostedt 	RB_BUFFERS_DISABLED_BIT	= 1,
53033601a3SSteven Rostedt };
54033601a3SSteven Rostedt 
55033601a3SSteven Rostedt enum {
56033601a3SSteven Rostedt 	RB_BUFFERS_ON		= 1 << RB_BUFFERS_ON_BIT,
57033601a3SSteven Rostedt 	RB_BUFFERS_DISABLED	= 1 << RB_BUFFERS_DISABLED_BIT,
58033601a3SSteven Rostedt };
59033601a3SSteven Rostedt 
60033601a3SSteven Rostedt static long ring_buffer_flags __read_mostly = RB_BUFFERS_ON;
61a3583244SSteven Rostedt 
62a3583244SSteven Rostedt /**
63a3583244SSteven Rostedt  * tracing_on - enable all tracing buffers
64a3583244SSteven Rostedt  *
65a3583244SSteven Rostedt  * This function enables all tracing buffers that may have been
66a3583244SSteven Rostedt  * disabled with tracing_off.
67a3583244SSteven Rostedt  */
68a3583244SSteven Rostedt void tracing_on(void)
69a3583244SSteven Rostedt {
70033601a3SSteven Rostedt 	set_bit(RB_BUFFERS_ON_BIT, &ring_buffer_flags);
71a3583244SSteven Rostedt }
72a3583244SSteven Rostedt 
73a3583244SSteven Rostedt /**
74a3583244SSteven Rostedt  * tracing_off - turn off all tracing buffers
75a3583244SSteven Rostedt  *
76a3583244SSteven Rostedt  * This function stops all tracing buffers from recording data.
77a3583244SSteven Rostedt  * It does not disable any overhead the tracers themselves may
78a3583244SSteven Rostedt  * be causing. This function simply causes all recording to
79a3583244SSteven Rostedt  * the ring buffers to fail.
80a3583244SSteven Rostedt  */
81a3583244SSteven Rostedt void tracing_off(void)
82a3583244SSteven Rostedt {
83033601a3SSteven Rostedt 	clear_bit(RB_BUFFERS_ON_BIT, &ring_buffer_flags);
84033601a3SSteven Rostedt }
85033601a3SSteven Rostedt 
86033601a3SSteven Rostedt /**
87033601a3SSteven Rostedt  * tracing_off_permanent - permanently disable ring buffers
88033601a3SSteven Rostedt  *
89033601a3SSteven Rostedt  * This function, once called, will disable all ring buffers
90033601a3SSteven Rostedt  * permanenty.
91033601a3SSteven Rostedt  */
92033601a3SSteven Rostedt void tracing_off_permanent(void)
93033601a3SSteven Rostedt {
94033601a3SSteven Rostedt 	set_bit(RB_BUFFERS_DISABLED_BIT, &ring_buffer_flags);
95a3583244SSteven Rostedt }
96a3583244SSteven Rostedt 
97d06bbd66SIngo Molnar #include "trace.h"
98d06bbd66SIngo Molnar 
997a8e76a3SSteven Rostedt /* Up this if you want to test the TIME_EXTENTS and normalization */
1007a8e76a3SSteven Rostedt #define DEBUG_SHIFT 0
1017a8e76a3SSteven Rostedt 
1027a8e76a3SSteven Rostedt /* FIXME!!! */
1037a8e76a3SSteven Rostedt u64 ring_buffer_time_stamp(int cpu)
1047a8e76a3SSteven Rostedt {
10547e74f2bSSteven Rostedt 	u64 time;
10647e74f2bSSteven Rostedt 
10747e74f2bSSteven Rostedt 	preempt_disable_notrace();
1087a8e76a3SSteven Rostedt 	/* shift to debug/test normalization and TIME_EXTENTS */
10947e74f2bSSteven Rostedt 	time = sched_clock() << DEBUG_SHIFT;
110*2c2d7329SFrederic Weisbecker 	preempt_enable_no_resched_notrace();
11147e74f2bSSteven Rostedt 
11247e74f2bSSteven Rostedt 	return time;
1137a8e76a3SSteven Rostedt }
1147a8e76a3SSteven Rostedt 
1157a8e76a3SSteven Rostedt void ring_buffer_normalize_time_stamp(int cpu, u64 *ts)
1167a8e76a3SSteven Rostedt {
1177a8e76a3SSteven Rostedt 	/* Just stupid testing the normalize function and deltas */
1187a8e76a3SSteven Rostedt 	*ts >>= DEBUG_SHIFT;
1197a8e76a3SSteven Rostedt }
1207a8e76a3SSteven Rostedt 
1217a8e76a3SSteven Rostedt #define RB_EVNT_HDR_SIZE (sizeof(struct ring_buffer_event))
1227a8e76a3SSteven Rostedt #define RB_ALIGNMENT_SHIFT	2
1237a8e76a3SSteven Rostedt #define RB_ALIGNMENT		(1 << RB_ALIGNMENT_SHIFT)
1247a8e76a3SSteven Rostedt #define RB_MAX_SMALL_DATA	28
1257a8e76a3SSteven Rostedt 
1267a8e76a3SSteven Rostedt enum {
1277a8e76a3SSteven Rostedt 	RB_LEN_TIME_EXTEND = 8,
1287a8e76a3SSteven Rostedt 	RB_LEN_TIME_STAMP = 16,
1297a8e76a3SSteven Rostedt };
1307a8e76a3SSteven Rostedt 
1317a8e76a3SSteven Rostedt /* inline for ring buffer fast paths */
1327a8e76a3SSteven Rostedt static inline unsigned
1337a8e76a3SSteven Rostedt rb_event_length(struct ring_buffer_event *event)
1347a8e76a3SSteven Rostedt {
1357a8e76a3SSteven Rostedt 	unsigned length;
1367a8e76a3SSteven Rostedt 
1377a8e76a3SSteven Rostedt 	switch (event->type) {
1387a8e76a3SSteven Rostedt 	case RINGBUF_TYPE_PADDING:
1397a8e76a3SSteven Rostedt 		/* undefined */
1407a8e76a3SSteven Rostedt 		return -1;
1417a8e76a3SSteven Rostedt 
1427a8e76a3SSteven Rostedt 	case RINGBUF_TYPE_TIME_EXTEND:
1437a8e76a3SSteven Rostedt 		return RB_LEN_TIME_EXTEND;
1447a8e76a3SSteven Rostedt 
1457a8e76a3SSteven Rostedt 	case RINGBUF_TYPE_TIME_STAMP:
1467a8e76a3SSteven Rostedt 		return RB_LEN_TIME_STAMP;
1477a8e76a3SSteven Rostedt 
1487a8e76a3SSteven Rostedt 	case RINGBUF_TYPE_DATA:
1497a8e76a3SSteven Rostedt 		if (event->len)
1507a8e76a3SSteven Rostedt 			length = event->len << RB_ALIGNMENT_SHIFT;
1517a8e76a3SSteven Rostedt 		else
1527a8e76a3SSteven Rostedt 			length = event->array[0];
1537a8e76a3SSteven Rostedt 		return length + RB_EVNT_HDR_SIZE;
1547a8e76a3SSteven Rostedt 	default:
1557a8e76a3SSteven Rostedt 		BUG();
1567a8e76a3SSteven Rostedt 	}
1577a8e76a3SSteven Rostedt 	/* not hit */
1587a8e76a3SSteven Rostedt 	return 0;
1597a8e76a3SSteven Rostedt }
1607a8e76a3SSteven Rostedt 
1617a8e76a3SSteven Rostedt /**
1627a8e76a3SSteven Rostedt  * ring_buffer_event_length - return the length of the event
1637a8e76a3SSteven Rostedt  * @event: the event to get the length of
1647a8e76a3SSteven Rostedt  */
1657a8e76a3SSteven Rostedt unsigned ring_buffer_event_length(struct ring_buffer_event *event)
1667a8e76a3SSteven Rostedt {
1677a8e76a3SSteven Rostedt 	return rb_event_length(event);
1687a8e76a3SSteven Rostedt }
1697a8e76a3SSteven Rostedt 
1707a8e76a3SSteven Rostedt /* inline for ring buffer fast paths */
1717a8e76a3SSteven Rostedt static inline void *
1727a8e76a3SSteven Rostedt rb_event_data(struct ring_buffer_event *event)
1737a8e76a3SSteven Rostedt {
1747a8e76a3SSteven Rostedt 	BUG_ON(event->type != RINGBUF_TYPE_DATA);
1757a8e76a3SSteven Rostedt 	/* If length is in len field, then array[0] has the data */
1767a8e76a3SSteven Rostedt 	if (event->len)
1777a8e76a3SSteven Rostedt 		return (void *)&event->array[0];
1787a8e76a3SSteven Rostedt 	/* Otherwise length is in array[0] and array[1] has the data */
1797a8e76a3SSteven Rostedt 	return (void *)&event->array[1];
1807a8e76a3SSteven Rostedt }
1817a8e76a3SSteven Rostedt 
1827a8e76a3SSteven Rostedt /**
1837a8e76a3SSteven Rostedt  * ring_buffer_event_data - return the data of the event
1847a8e76a3SSteven Rostedt  * @event: the event to get the data from
1857a8e76a3SSteven Rostedt  */
1867a8e76a3SSteven Rostedt void *ring_buffer_event_data(struct ring_buffer_event *event)
1877a8e76a3SSteven Rostedt {
1887a8e76a3SSteven Rostedt 	return rb_event_data(event);
1897a8e76a3SSteven Rostedt }
1907a8e76a3SSteven Rostedt 
1917a8e76a3SSteven Rostedt #define for_each_buffer_cpu(buffer, cpu)		\
1927a8e76a3SSteven Rostedt 	for_each_cpu_mask(cpu, buffer->cpumask)
1937a8e76a3SSteven Rostedt 
1947a8e76a3SSteven Rostedt #define TS_SHIFT	27
1957a8e76a3SSteven Rostedt #define TS_MASK		((1ULL << TS_SHIFT) - 1)
1967a8e76a3SSteven Rostedt #define TS_DELTA_TEST	(~TS_MASK)
1977a8e76a3SSteven Rostedt 
198abc9b56dSSteven Rostedt struct buffer_data_page {
1997a8e76a3SSteven Rostedt 	u64		 time_stamp;	/* page time stamp */
200bf41a158SSteven Rostedt 	local_t		 commit;	/* write commited index */
201abc9b56dSSteven Rostedt 	unsigned char	 data[];	/* data of buffer page */
202abc9b56dSSteven Rostedt };
203abc9b56dSSteven Rostedt 
204abc9b56dSSteven Rostedt struct buffer_page {
205abc9b56dSSteven Rostedt 	local_t		 write;		/* index for next write */
2066f807acdSSteven Rostedt 	unsigned	 read;		/* index for next read */
2077a8e76a3SSteven Rostedt 	struct list_head list;		/* list of free pages */
208abc9b56dSSteven Rostedt 	struct buffer_data_page *page;	/* Actual data page */
2097a8e76a3SSteven Rostedt };
2107a8e76a3SSteven Rostedt 
211044fa782SSteven Rostedt static void rb_init_page(struct buffer_data_page *bpage)
212abc9b56dSSteven Rostedt {
213044fa782SSteven Rostedt 	local_set(&bpage->commit, 0);
214abc9b56dSSteven Rostedt }
215abc9b56dSSteven Rostedt 
2167a8e76a3SSteven Rostedt /*
217ed56829cSSteven Rostedt  * Also stolen from mm/slob.c. Thanks to Mathieu Desnoyers for pointing
218ed56829cSSteven Rostedt  * this issue out.
219ed56829cSSteven Rostedt  */
220ed56829cSSteven Rostedt static inline void free_buffer_page(struct buffer_page *bpage)
221ed56829cSSteven Rostedt {
222e4c2ce82SSteven Rostedt 	if (bpage->page)
2236ae2a076SSteven Rostedt 		free_page((unsigned long)bpage->page);
224e4c2ce82SSteven Rostedt 	kfree(bpage);
225ed56829cSSteven Rostedt }
226ed56829cSSteven Rostedt 
227ed56829cSSteven Rostedt /*
2287a8e76a3SSteven Rostedt  * We need to fit the time_stamp delta into 27 bits.
2297a8e76a3SSteven Rostedt  */
2307a8e76a3SSteven Rostedt static inline int test_time_stamp(u64 delta)
2317a8e76a3SSteven Rostedt {
2327a8e76a3SSteven Rostedt 	if (delta & TS_DELTA_TEST)
2337a8e76a3SSteven Rostedt 		return 1;
2347a8e76a3SSteven Rostedt 	return 0;
2357a8e76a3SSteven Rostedt }
2367a8e76a3SSteven Rostedt 
237abc9b56dSSteven Rostedt #define BUF_PAGE_SIZE (PAGE_SIZE - sizeof(struct buffer_data_page))
2387a8e76a3SSteven Rostedt 
2397a8e76a3SSteven Rostedt /*
2407a8e76a3SSteven Rostedt  * head_page == tail_page && head == tail then buffer is empty.
2417a8e76a3SSteven Rostedt  */
2427a8e76a3SSteven Rostedt struct ring_buffer_per_cpu {
2437a8e76a3SSteven Rostedt 	int				cpu;
2447a8e76a3SSteven Rostedt 	struct ring_buffer		*buffer;
245f83c9d0fSSteven Rostedt 	spinlock_t			reader_lock; /* serialize readers */
2463e03fb7fSSteven Rostedt 	raw_spinlock_t			lock;
2477a8e76a3SSteven Rostedt 	struct lock_class_key		lock_key;
2487a8e76a3SSteven Rostedt 	struct list_head		pages;
2496f807acdSSteven Rostedt 	struct buffer_page		*head_page;	/* read from head */
2506f807acdSSteven Rostedt 	struct buffer_page		*tail_page;	/* write to tail */
251bf41a158SSteven Rostedt 	struct buffer_page		*commit_page;	/* commited pages */
252d769041fSSteven Rostedt 	struct buffer_page		*reader_page;
2537a8e76a3SSteven Rostedt 	unsigned long			overrun;
2547a8e76a3SSteven Rostedt 	unsigned long			entries;
2557a8e76a3SSteven Rostedt 	u64				write_stamp;
2567a8e76a3SSteven Rostedt 	u64				read_stamp;
2577a8e76a3SSteven Rostedt 	atomic_t			record_disabled;
2587a8e76a3SSteven Rostedt };
2597a8e76a3SSteven Rostedt 
2607a8e76a3SSteven Rostedt struct ring_buffer {
2617a8e76a3SSteven Rostedt 	unsigned long			size;
2627a8e76a3SSteven Rostedt 	unsigned			pages;
2637a8e76a3SSteven Rostedt 	unsigned			flags;
2647a8e76a3SSteven Rostedt 	int				cpus;
2657a8e76a3SSteven Rostedt 	cpumask_t			cpumask;
2667a8e76a3SSteven Rostedt 	atomic_t			record_disabled;
2677a8e76a3SSteven Rostedt 
2687a8e76a3SSteven Rostedt 	struct mutex			mutex;
2697a8e76a3SSteven Rostedt 
2707a8e76a3SSteven Rostedt 	struct ring_buffer_per_cpu	**buffers;
2717a8e76a3SSteven Rostedt };
2727a8e76a3SSteven Rostedt 
2737a8e76a3SSteven Rostedt struct ring_buffer_iter {
2747a8e76a3SSteven Rostedt 	struct ring_buffer_per_cpu	*cpu_buffer;
2757a8e76a3SSteven Rostedt 	unsigned long			head;
2767a8e76a3SSteven Rostedt 	struct buffer_page		*head_page;
2777a8e76a3SSteven Rostedt 	u64				read_stamp;
2787a8e76a3SSteven Rostedt };
2797a8e76a3SSteven Rostedt 
280f536aafcSSteven Rostedt /* buffer may be either ring_buffer or ring_buffer_per_cpu */
2817a8e76a3SSteven Rostedt #define RB_WARN_ON(buffer, cond)				\
2823e89c7bbSSteven Rostedt 	({							\
2833e89c7bbSSteven Rostedt 		int _____ret = unlikely(cond);			\
2843e89c7bbSSteven Rostedt 		if (_____ret) {					\
285bf41a158SSteven Rostedt 			atomic_inc(&buffer->record_disabled);	\
286bf41a158SSteven Rostedt 			WARN_ON(1);				\
287bf41a158SSteven Rostedt 		}						\
2883e89c7bbSSteven Rostedt 		_____ret;					\
2893e89c7bbSSteven Rostedt 	})
290f536aafcSSteven Rostedt 
2917a8e76a3SSteven Rostedt /**
2927a8e76a3SSteven Rostedt  * check_pages - integrity check of buffer pages
2937a8e76a3SSteven Rostedt  * @cpu_buffer: CPU buffer with pages to test
2947a8e76a3SSteven Rostedt  *
2957a8e76a3SSteven Rostedt  * As a safty measure we check to make sure the data pages have not
2967a8e76a3SSteven Rostedt  * been corrupted.
2977a8e76a3SSteven Rostedt  */
2987a8e76a3SSteven Rostedt static int rb_check_pages(struct ring_buffer_per_cpu *cpu_buffer)
2997a8e76a3SSteven Rostedt {
3007a8e76a3SSteven Rostedt 	struct list_head *head = &cpu_buffer->pages;
301044fa782SSteven Rostedt 	struct buffer_page *bpage, *tmp;
3027a8e76a3SSteven Rostedt 
3033e89c7bbSSteven Rostedt 	if (RB_WARN_ON(cpu_buffer, head->next->prev != head))
3043e89c7bbSSteven Rostedt 		return -1;
3053e89c7bbSSteven Rostedt 	if (RB_WARN_ON(cpu_buffer, head->prev->next != head))
3063e89c7bbSSteven Rostedt 		return -1;
3077a8e76a3SSteven Rostedt 
308044fa782SSteven Rostedt 	list_for_each_entry_safe(bpage, tmp, head, list) {
3093e89c7bbSSteven Rostedt 		if (RB_WARN_ON(cpu_buffer,
310044fa782SSteven Rostedt 			       bpage->list.next->prev != &bpage->list))
3113e89c7bbSSteven Rostedt 			return -1;
3123e89c7bbSSteven Rostedt 		if (RB_WARN_ON(cpu_buffer,
313044fa782SSteven Rostedt 			       bpage->list.prev->next != &bpage->list))
3143e89c7bbSSteven Rostedt 			return -1;
3157a8e76a3SSteven Rostedt 	}
3167a8e76a3SSteven Rostedt 
3177a8e76a3SSteven Rostedt 	return 0;
3187a8e76a3SSteven Rostedt }
3197a8e76a3SSteven Rostedt 
3207a8e76a3SSteven Rostedt static int rb_allocate_pages(struct ring_buffer_per_cpu *cpu_buffer,
3217a8e76a3SSteven Rostedt 			     unsigned nr_pages)
3227a8e76a3SSteven Rostedt {
3237a8e76a3SSteven Rostedt 	struct list_head *head = &cpu_buffer->pages;
324044fa782SSteven Rostedt 	struct buffer_page *bpage, *tmp;
3257a8e76a3SSteven Rostedt 	unsigned long addr;
3267a8e76a3SSteven Rostedt 	LIST_HEAD(pages);
3277a8e76a3SSteven Rostedt 	unsigned i;
3287a8e76a3SSteven Rostedt 
3297a8e76a3SSteven Rostedt 	for (i = 0; i < nr_pages; i++) {
330044fa782SSteven Rostedt 		bpage = kzalloc_node(ALIGN(sizeof(*bpage), cache_line_size()),
331aa1e0e3bSSteven Rostedt 				    GFP_KERNEL, cpu_to_node(cpu_buffer->cpu));
332044fa782SSteven Rostedt 		if (!bpage)
333e4c2ce82SSteven Rostedt 			goto free_pages;
334044fa782SSteven Rostedt 		list_add(&bpage->list, &pages);
335e4c2ce82SSteven Rostedt 
3367a8e76a3SSteven Rostedt 		addr = __get_free_page(GFP_KERNEL);
3377a8e76a3SSteven Rostedt 		if (!addr)
3387a8e76a3SSteven Rostedt 			goto free_pages;
339044fa782SSteven Rostedt 		bpage->page = (void *)addr;
340044fa782SSteven Rostedt 		rb_init_page(bpage->page);
3417a8e76a3SSteven Rostedt 	}
3427a8e76a3SSteven Rostedt 
3437a8e76a3SSteven Rostedt 	list_splice(&pages, head);
3447a8e76a3SSteven Rostedt 
3457a8e76a3SSteven Rostedt 	rb_check_pages(cpu_buffer);
3467a8e76a3SSteven Rostedt 
3477a8e76a3SSteven Rostedt 	return 0;
3487a8e76a3SSteven Rostedt 
3497a8e76a3SSteven Rostedt  free_pages:
350044fa782SSteven Rostedt 	list_for_each_entry_safe(bpage, tmp, &pages, list) {
351044fa782SSteven Rostedt 		list_del_init(&bpage->list);
352044fa782SSteven Rostedt 		free_buffer_page(bpage);
3537a8e76a3SSteven Rostedt 	}
3547a8e76a3SSteven Rostedt 	return -ENOMEM;
3557a8e76a3SSteven Rostedt }
3567a8e76a3SSteven Rostedt 
3577a8e76a3SSteven Rostedt static struct ring_buffer_per_cpu *
3587a8e76a3SSteven Rostedt rb_allocate_cpu_buffer(struct ring_buffer *buffer, int cpu)
3597a8e76a3SSteven Rostedt {
3607a8e76a3SSteven Rostedt 	struct ring_buffer_per_cpu *cpu_buffer;
361044fa782SSteven Rostedt 	struct buffer_page *bpage;
362d769041fSSteven Rostedt 	unsigned long addr;
3637a8e76a3SSteven Rostedt 	int ret;
3647a8e76a3SSteven Rostedt 
3657a8e76a3SSteven Rostedt 	cpu_buffer = kzalloc_node(ALIGN(sizeof(*cpu_buffer), cache_line_size()),
3667a8e76a3SSteven Rostedt 				  GFP_KERNEL, cpu_to_node(cpu));
3677a8e76a3SSteven Rostedt 	if (!cpu_buffer)
3687a8e76a3SSteven Rostedt 		return NULL;
3697a8e76a3SSteven Rostedt 
3707a8e76a3SSteven Rostedt 	cpu_buffer->cpu = cpu;
3717a8e76a3SSteven Rostedt 	cpu_buffer->buffer = buffer;
372f83c9d0fSSteven Rostedt 	spin_lock_init(&cpu_buffer->reader_lock);
3733e03fb7fSSteven Rostedt 	cpu_buffer->lock = (raw_spinlock_t)__RAW_SPIN_LOCK_UNLOCKED;
3747a8e76a3SSteven Rostedt 	INIT_LIST_HEAD(&cpu_buffer->pages);
3757a8e76a3SSteven Rostedt 
376044fa782SSteven Rostedt 	bpage = kzalloc_node(ALIGN(sizeof(*bpage), cache_line_size()),
377e4c2ce82SSteven Rostedt 			    GFP_KERNEL, cpu_to_node(cpu));
378044fa782SSteven Rostedt 	if (!bpage)
379e4c2ce82SSteven Rostedt 		goto fail_free_buffer;
380e4c2ce82SSteven Rostedt 
381044fa782SSteven Rostedt 	cpu_buffer->reader_page = bpage;
382d769041fSSteven Rostedt 	addr = __get_free_page(GFP_KERNEL);
383d769041fSSteven Rostedt 	if (!addr)
384e4c2ce82SSteven Rostedt 		goto fail_free_reader;
385044fa782SSteven Rostedt 	bpage->page = (void *)addr;
386044fa782SSteven Rostedt 	rb_init_page(bpage->page);
387e4c2ce82SSteven Rostedt 
388d769041fSSteven Rostedt 	INIT_LIST_HEAD(&cpu_buffer->reader_page->list);
389d769041fSSteven Rostedt 
3907a8e76a3SSteven Rostedt 	ret = rb_allocate_pages(cpu_buffer, buffer->pages);
3917a8e76a3SSteven Rostedt 	if (ret < 0)
392d769041fSSteven Rostedt 		goto fail_free_reader;
3937a8e76a3SSteven Rostedt 
3947a8e76a3SSteven Rostedt 	cpu_buffer->head_page
3957a8e76a3SSteven Rostedt 		= list_entry(cpu_buffer->pages.next, struct buffer_page, list);
396bf41a158SSteven Rostedt 	cpu_buffer->tail_page = cpu_buffer->commit_page = cpu_buffer->head_page;
3977a8e76a3SSteven Rostedt 
3987a8e76a3SSteven Rostedt 	return cpu_buffer;
3997a8e76a3SSteven Rostedt 
400d769041fSSteven Rostedt  fail_free_reader:
401d769041fSSteven Rostedt 	free_buffer_page(cpu_buffer->reader_page);
402d769041fSSteven Rostedt 
4037a8e76a3SSteven Rostedt  fail_free_buffer:
4047a8e76a3SSteven Rostedt 	kfree(cpu_buffer);
4057a8e76a3SSteven Rostedt 	return NULL;
4067a8e76a3SSteven Rostedt }
4077a8e76a3SSteven Rostedt 
4087a8e76a3SSteven Rostedt static void rb_free_cpu_buffer(struct ring_buffer_per_cpu *cpu_buffer)
4097a8e76a3SSteven Rostedt {
4107a8e76a3SSteven Rostedt 	struct list_head *head = &cpu_buffer->pages;
411044fa782SSteven Rostedt 	struct buffer_page *bpage, *tmp;
4127a8e76a3SSteven Rostedt 
413d769041fSSteven Rostedt 	list_del_init(&cpu_buffer->reader_page->list);
414d769041fSSteven Rostedt 	free_buffer_page(cpu_buffer->reader_page);
415d769041fSSteven Rostedt 
416044fa782SSteven Rostedt 	list_for_each_entry_safe(bpage, tmp, head, list) {
417044fa782SSteven Rostedt 		list_del_init(&bpage->list);
418044fa782SSteven Rostedt 		free_buffer_page(bpage);
4197a8e76a3SSteven Rostedt 	}
4207a8e76a3SSteven Rostedt 	kfree(cpu_buffer);
4217a8e76a3SSteven Rostedt }
4227a8e76a3SSteven Rostedt 
423a7b13743SSteven Rostedt /*
424a7b13743SSteven Rostedt  * Causes compile errors if the struct buffer_page gets bigger
425a7b13743SSteven Rostedt  * than the struct page.
426a7b13743SSteven Rostedt  */
427a7b13743SSteven Rostedt extern int ring_buffer_page_too_big(void);
428a7b13743SSteven Rostedt 
4297a8e76a3SSteven Rostedt /**
4307a8e76a3SSteven Rostedt  * ring_buffer_alloc - allocate a new ring_buffer
4317a8e76a3SSteven Rostedt  * @size: the size in bytes that is needed.
4327a8e76a3SSteven Rostedt  * @flags: attributes to set for the ring buffer.
4337a8e76a3SSteven Rostedt  *
4347a8e76a3SSteven Rostedt  * Currently the only flag that is available is the RB_FL_OVERWRITE
4357a8e76a3SSteven Rostedt  * flag. This flag means that the buffer will overwrite old data
4367a8e76a3SSteven Rostedt  * when the buffer wraps. If this flag is not set, the buffer will
4377a8e76a3SSteven Rostedt  * drop data when the tail hits the head.
4387a8e76a3SSteven Rostedt  */
4397a8e76a3SSteven Rostedt struct ring_buffer *ring_buffer_alloc(unsigned long size, unsigned flags)
4407a8e76a3SSteven Rostedt {
4417a8e76a3SSteven Rostedt 	struct ring_buffer *buffer;
4427a8e76a3SSteven Rostedt 	int bsize;
4437a8e76a3SSteven Rostedt 	int cpu;
4447a8e76a3SSteven Rostedt 
445a7b13743SSteven Rostedt 	/* Paranoid! Optimizes out when all is well */
446a7b13743SSteven Rostedt 	if (sizeof(struct buffer_page) > sizeof(struct page))
447a7b13743SSteven Rostedt 		ring_buffer_page_too_big();
448a7b13743SSteven Rostedt 
449a7b13743SSteven Rostedt 
4507a8e76a3SSteven Rostedt 	/* keep it in its own cache line */
4517a8e76a3SSteven Rostedt 	buffer = kzalloc(ALIGN(sizeof(*buffer), cache_line_size()),
4527a8e76a3SSteven Rostedt 			 GFP_KERNEL);
4537a8e76a3SSteven Rostedt 	if (!buffer)
4547a8e76a3SSteven Rostedt 		return NULL;
4557a8e76a3SSteven Rostedt 
4567a8e76a3SSteven Rostedt 	buffer->pages = DIV_ROUND_UP(size, BUF_PAGE_SIZE);
4577a8e76a3SSteven Rostedt 	buffer->flags = flags;
4587a8e76a3SSteven Rostedt 
4597a8e76a3SSteven Rostedt 	/* need at least two pages */
4607a8e76a3SSteven Rostedt 	if (buffer->pages == 1)
4617a8e76a3SSteven Rostedt 		buffer->pages++;
4627a8e76a3SSteven Rostedt 
4637a8e76a3SSteven Rostedt 	buffer->cpumask = cpu_possible_map;
4647a8e76a3SSteven Rostedt 	buffer->cpus = nr_cpu_ids;
4657a8e76a3SSteven Rostedt 
4667a8e76a3SSteven Rostedt 	bsize = sizeof(void *) * nr_cpu_ids;
4677a8e76a3SSteven Rostedt 	buffer->buffers = kzalloc(ALIGN(bsize, cache_line_size()),
4687a8e76a3SSteven Rostedt 				  GFP_KERNEL);
4697a8e76a3SSteven Rostedt 	if (!buffer->buffers)
4707a8e76a3SSteven Rostedt 		goto fail_free_buffer;
4717a8e76a3SSteven Rostedt 
4727a8e76a3SSteven Rostedt 	for_each_buffer_cpu(buffer, cpu) {
4737a8e76a3SSteven Rostedt 		buffer->buffers[cpu] =
4747a8e76a3SSteven Rostedt 			rb_allocate_cpu_buffer(buffer, cpu);
4757a8e76a3SSteven Rostedt 		if (!buffer->buffers[cpu])
4767a8e76a3SSteven Rostedt 			goto fail_free_buffers;
4777a8e76a3SSteven Rostedt 	}
4787a8e76a3SSteven Rostedt 
4797a8e76a3SSteven Rostedt 	mutex_init(&buffer->mutex);
4807a8e76a3SSteven Rostedt 
4817a8e76a3SSteven Rostedt 	return buffer;
4827a8e76a3SSteven Rostedt 
4837a8e76a3SSteven Rostedt  fail_free_buffers:
4847a8e76a3SSteven Rostedt 	for_each_buffer_cpu(buffer, cpu) {
4857a8e76a3SSteven Rostedt 		if (buffer->buffers[cpu])
4867a8e76a3SSteven Rostedt 			rb_free_cpu_buffer(buffer->buffers[cpu]);
4877a8e76a3SSteven Rostedt 	}
4887a8e76a3SSteven Rostedt 	kfree(buffer->buffers);
4897a8e76a3SSteven Rostedt 
4907a8e76a3SSteven Rostedt  fail_free_buffer:
4917a8e76a3SSteven Rostedt 	kfree(buffer);
4927a8e76a3SSteven Rostedt 	return NULL;
4937a8e76a3SSteven Rostedt }
4947a8e76a3SSteven Rostedt 
4957a8e76a3SSteven Rostedt /**
4967a8e76a3SSteven Rostedt  * ring_buffer_free - free a ring buffer.
4977a8e76a3SSteven Rostedt  * @buffer: the buffer to free.
4987a8e76a3SSteven Rostedt  */
4997a8e76a3SSteven Rostedt void
5007a8e76a3SSteven Rostedt ring_buffer_free(struct ring_buffer *buffer)
5017a8e76a3SSteven Rostedt {
5027a8e76a3SSteven Rostedt 	int cpu;
5037a8e76a3SSteven Rostedt 
5047a8e76a3SSteven Rostedt 	for_each_buffer_cpu(buffer, cpu)
5057a8e76a3SSteven Rostedt 		rb_free_cpu_buffer(buffer->buffers[cpu]);
5067a8e76a3SSteven Rostedt 
5077a8e76a3SSteven Rostedt 	kfree(buffer);
5087a8e76a3SSteven Rostedt }
5097a8e76a3SSteven Rostedt 
5107a8e76a3SSteven Rostedt static void rb_reset_cpu(struct ring_buffer_per_cpu *cpu_buffer);
5117a8e76a3SSteven Rostedt 
5127a8e76a3SSteven Rostedt static void
5137a8e76a3SSteven Rostedt rb_remove_pages(struct ring_buffer_per_cpu *cpu_buffer, unsigned nr_pages)
5147a8e76a3SSteven Rostedt {
515044fa782SSteven Rostedt 	struct buffer_page *bpage;
5167a8e76a3SSteven Rostedt 	struct list_head *p;
5177a8e76a3SSteven Rostedt 	unsigned i;
5187a8e76a3SSteven Rostedt 
5197a8e76a3SSteven Rostedt 	atomic_inc(&cpu_buffer->record_disabled);
5207a8e76a3SSteven Rostedt 	synchronize_sched();
5217a8e76a3SSteven Rostedt 
5227a8e76a3SSteven Rostedt 	for (i = 0; i < nr_pages; i++) {
5233e89c7bbSSteven Rostedt 		if (RB_WARN_ON(cpu_buffer, list_empty(&cpu_buffer->pages)))
5243e89c7bbSSteven Rostedt 			return;
5257a8e76a3SSteven Rostedt 		p = cpu_buffer->pages.next;
526044fa782SSteven Rostedt 		bpage = list_entry(p, struct buffer_page, list);
527044fa782SSteven Rostedt 		list_del_init(&bpage->list);
528044fa782SSteven Rostedt 		free_buffer_page(bpage);
5297a8e76a3SSteven Rostedt 	}
5303e89c7bbSSteven Rostedt 	if (RB_WARN_ON(cpu_buffer, list_empty(&cpu_buffer->pages)))
5313e89c7bbSSteven Rostedt 		return;
5327a8e76a3SSteven Rostedt 
5337a8e76a3SSteven Rostedt 	rb_reset_cpu(cpu_buffer);
5347a8e76a3SSteven Rostedt 
5357a8e76a3SSteven Rostedt 	rb_check_pages(cpu_buffer);
5367a8e76a3SSteven Rostedt 
5377a8e76a3SSteven Rostedt 	atomic_dec(&cpu_buffer->record_disabled);
5387a8e76a3SSteven Rostedt 
5397a8e76a3SSteven Rostedt }
5407a8e76a3SSteven Rostedt 
5417a8e76a3SSteven Rostedt static void
5427a8e76a3SSteven Rostedt rb_insert_pages(struct ring_buffer_per_cpu *cpu_buffer,
5437a8e76a3SSteven Rostedt 		struct list_head *pages, unsigned nr_pages)
5447a8e76a3SSteven Rostedt {
545044fa782SSteven Rostedt 	struct buffer_page *bpage;
5467a8e76a3SSteven Rostedt 	struct list_head *p;
5477a8e76a3SSteven Rostedt 	unsigned i;
5487a8e76a3SSteven Rostedt 
5497a8e76a3SSteven Rostedt 	atomic_inc(&cpu_buffer->record_disabled);
5507a8e76a3SSteven Rostedt 	synchronize_sched();
5517a8e76a3SSteven Rostedt 
5527a8e76a3SSteven Rostedt 	for (i = 0; i < nr_pages; i++) {
5533e89c7bbSSteven Rostedt 		if (RB_WARN_ON(cpu_buffer, list_empty(pages)))
5543e89c7bbSSteven Rostedt 			return;
5557a8e76a3SSteven Rostedt 		p = pages->next;
556044fa782SSteven Rostedt 		bpage = list_entry(p, struct buffer_page, list);
557044fa782SSteven Rostedt 		list_del_init(&bpage->list);
558044fa782SSteven Rostedt 		list_add_tail(&bpage->list, &cpu_buffer->pages);
5597a8e76a3SSteven Rostedt 	}
5607a8e76a3SSteven Rostedt 	rb_reset_cpu(cpu_buffer);
5617a8e76a3SSteven Rostedt 
5627a8e76a3SSteven Rostedt 	rb_check_pages(cpu_buffer);
5637a8e76a3SSteven Rostedt 
5647a8e76a3SSteven Rostedt 	atomic_dec(&cpu_buffer->record_disabled);
5657a8e76a3SSteven Rostedt }
5667a8e76a3SSteven Rostedt 
5677a8e76a3SSteven Rostedt /**
5687a8e76a3SSteven Rostedt  * ring_buffer_resize - resize the ring buffer
5697a8e76a3SSteven Rostedt  * @buffer: the buffer to resize.
5707a8e76a3SSteven Rostedt  * @size: the new size.
5717a8e76a3SSteven Rostedt  *
5727a8e76a3SSteven Rostedt  * The tracer is responsible for making sure that the buffer is
5737a8e76a3SSteven Rostedt  * not being used while changing the size.
5747a8e76a3SSteven Rostedt  * Note: We may be able to change the above requirement by using
5757a8e76a3SSteven Rostedt  *  RCU synchronizations.
5767a8e76a3SSteven Rostedt  *
5777a8e76a3SSteven Rostedt  * Minimum size is 2 * BUF_PAGE_SIZE.
5787a8e76a3SSteven Rostedt  *
5797a8e76a3SSteven Rostedt  * Returns -1 on failure.
5807a8e76a3SSteven Rostedt  */
5817a8e76a3SSteven Rostedt int ring_buffer_resize(struct ring_buffer *buffer, unsigned long size)
5827a8e76a3SSteven Rostedt {
5837a8e76a3SSteven Rostedt 	struct ring_buffer_per_cpu *cpu_buffer;
5847a8e76a3SSteven Rostedt 	unsigned nr_pages, rm_pages, new_pages;
585044fa782SSteven Rostedt 	struct buffer_page *bpage, *tmp;
5867a8e76a3SSteven Rostedt 	unsigned long buffer_size;
5877a8e76a3SSteven Rostedt 	unsigned long addr;
5887a8e76a3SSteven Rostedt 	LIST_HEAD(pages);
5897a8e76a3SSteven Rostedt 	int i, cpu;
5907a8e76a3SSteven Rostedt 
591ee51a1deSIngo Molnar 	/*
592ee51a1deSIngo Molnar 	 * Always succeed at resizing a non-existent buffer:
593ee51a1deSIngo Molnar 	 */
594ee51a1deSIngo Molnar 	if (!buffer)
595ee51a1deSIngo Molnar 		return size;
596ee51a1deSIngo Molnar 
5977a8e76a3SSteven Rostedt 	size = DIV_ROUND_UP(size, BUF_PAGE_SIZE);
5987a8e76a3SSteven Rostedt 	size *= BUF_PAGE_SIZE;
5997a8e76a3SSteven Rostedt 	buffer_size = buffer->pages * BUF_PAGE_SIZE;
6007a8e76a3SSteven Rostedt 
6017a8e76a3SSteven Rostedt 	/* we need a minimum of two pages */
6027a8e76a3SSteven Rostedt 	if (size < BUF_PAGE_SIZE * 2)
6037a8e76a3SSteven Rostedt 		size = BUF_PAGE_SIZE * 2;
6047a8e76a3SSteven Rostedt 
6057a8e76a3SSteven Rostedt 	if (size == buffer_size)
6067a8e76a3SSteven Rostedt 		return size;
6077a8e76a3SSteven Rostedt 
6087a8e76a3SSteven Rostedt 	mutex_lock(&buffer->mutex);
6097a8e76a3SSteven Rostedt 
6107a8e76a3SSteven Rostedt 	nr_pages = DIV_ROUND_UP(size, BUF_PAGE_SIZE);
6117a8e76a3SSteven Rostedt 
6127a8e76a3SSteven Rostedt 	if (size < buffer_size) {
6137a8e76a3SSteven Rostedt 
6147a8e76a3SSteven Rostedt 		/* easy case, just free pages */
6153e89c7bbSSteven Rostedt 		if (RB_WARN_ON(buffer, nr_pages >= buffer->pages)) {
6163e89c7bbSSteven Rostedt 			mutex_unlock(&buffer->mutex);
6173e89c7bbSSteven Rostedt 			return -1;
6183e89c7bbSSteven Rostedt 		}
6197a8e76a3SSteven Rostedt 
6207a8e76a3SSteven Rostedt 		rm_pages = buffer->pages - nr_pages;
6217a8e76a3SSteven Rostedt 
6227a8e76a3SSteven Rostedt 		for_each_buffer_cpu(buffer, cpu) {
6237a8e76a3SSteven Rostedt 			cpu_buffer = buffer->buffers[cpu];
6247a8e76a3SSteven Rostedt 			rb_remove_pages(cpu_buffer, rm_pages);
6257a8e76a3SSteven Rostedt 		}
6267a8e76a3SSteven Rostedt 		goto out;
6277a8e76a3SSteven Rostedt 	}
6287a8e76a3SSteven Rostedt 
6297a8e76a3SSteven Rostedt 	/*
6307a8e76a3SSteven Rostedt 	 * This is a bit more difficult. We only want to add pages
6317a8e76a3SSteven Rostedt 	 * when we can allocate enough for all CPUs. We do this
6327a8e76a3SSteven Rostedt 	 * by allocating all the pages and storing them on a local
6337a8e76a3SSteven Rostedt 	 * link list. If we succeed in our allocation, then we
6347a8e76a3SSteven Rostedt 	 * add these pages to the cpu_buffers. Otherwise we just free
6357a8e76a3SSteven Rostedt 	 * them all and return -ENOMEM;
6367a8e76a3SSteven Rostedt 	 */
6373e89c7bbSSteven Rostedt 	if (RB_WARN_ON(buffer, nr_pages <= buffer->pages)) {
6383e89c7bbSSteven Rostedt 		mutex_unlock(&buffer->mutex);
6393e89c7bbSSteven Rostedt 		return -1;
6403e89c7bbSSteven Rostedt 	}
641f536aafcSSteven Rostedt 
6427a8e76a3SSteven Rostedt 	new_pages = nr_pages - buffer->pages;
6437a8e76a3SSteven Rostedt 
6447a8e76a3SSteven Rostedt 	for_each_buffer_cpu(buffer, cpu) {
6457a8e76a3SSteven Rostedt 		for (i = 0; i < new_pages; i++) {
646044fa782SSteven Rostedt 			bpage = kzalloc_node(ALIGN(sizeof(*bpage),
647e4c2ce82SSteven Rostedt 						  cache_line_size()),
648e4c2ce82SSteven Rostedt 					    GFP_KERNEL, cpu_to_node(cpu));
649044fa782SSteven Rostedt 			if (!bpage)
650e4c2ce82SSteven Rostedt 				goto free_pages;
651044fa782SSteven Rostedt 			list_add(&bpage->list, &pages);
6527a8e76a3SSteven Rostedt 			addr = __get_free_page(GFP_KERNEL);
6537a8e76a3SSteven Rostedt 			if (!addr)
6547a8e76a3SSteven Rostedt 				goto free_pages;
655044fa782SSteven Rostedt 			bpage->page = (void *)addr;
656044fa782SSteven Rostedt 			rb_init_page(bpage->page);
6577a8e76a3SSteven Rostedt 		}
6587a8e76a3SSteven Rostedt 	}
6597a8e76a3SSteven Rostedt 
6607a8e76a3SSteven Rostedt 	for_each_buffer_cpu(buffer, cpu) {
6617a8e76a3SSteven Rostedt 		cpu_buffer = buffer->buffers[cpu];
6627a8e76a3SSteven Rostedt 		rb_insert_pages(cpu_buffer, &pages, new_pages);
6637a8e76a3SSteven Rostedt 	}
6647a8e76a3SSteven Rostedt 
6653e89c7bbSSteven Rostedt 	if (RB_WARN_ON(buffer, !list_empty(&pages))) {
6663e89c7bbSSteven Rostedt 		mutex_unlock(&buffer->mutex);
6673e89c7bbSSteven Rostedt 		return -1;
6683e89c7bbSSteven Rostedt 	}
6697a8e76a3SSteven Rostedt 
6707a8e76a3SSteven Rostedt  out:
6717a8e76a3SSteven Rostedt 	buffer->pages = nr_pages;
6727a8e76a3SSteven Rostedt 	mutex_unlock(&buffer->mutex);
6737a8e76a3SSteven Rostedt 
6747a8e76a3SSteven Rostedt 	return size;
6757a8e76a3SSteven Rostedt 
6767a8e76a3SSteven Rostedt  free_pages:
677044fa782SSteven Rostedt 	list_for_each_entry_safe(bpage, tmp, &pages, list) {
678044fa782SSteven Rostedt 		list_del_init(&bpage->list);
679044fa782SSteven Rostedt 		free_buffer_page(bpage);
6807a8e76a3SSteven Rostedt 	}
681641d2f63SVegard Nossum 	mutex_unlock(&buffer->mutex);
6827a8e76a3SSteven Rostedt 	return -ENOMEM;
6837a8e76a3SSteven Rostedt }
6847a8e76a3SSteven Rostedt 
6857a8e76a3SSteven Rostedt static inline int rb_null_event(struct ring_buffer_event *event)
6867a8e76a3SSteven Rostedt {
6877a8e76a3SSteven Rostedt 	return event->type == RINGBUF_TYPE_PADDING;
6887a8e76a3SSteven Rostedt }
6897a8e76a3SSteven Rostedt 
6908789a9e7SSteven Rostedt static inline void *
691044fa782SSteven Rostedt __rb_data_page_index(struct buffer_data_page *bpage, unsigned index)
6928789a9e7SSteven Rostedt {
693044fa782SSteven Rostedt 	return bpage->data + index;
6948789a9e7SSteven Rostedt }
6958789a9e7SSteven Rostedt 
696044fa782SSteven Rostedt static inline void *__rb_page_index(struct buffer_page *bpage, unsigned index)
6977a8e76a3SSteven Rostedt {
698044fa782SSteven Rostedt 	return bpage->page->data + index;
6997a8e76a3SSteven Rostedt }
7007a8e76a3SSteven Rostedt 
7017a8e76a3SSteven Rostedt static inline struct ring_buffer_event *
702d769041fSSteven Rostedt rb_reader_event(struct ring_buffer_per_cpu *cpu_buffer)
7037a8e76a3SSteven Rostedt {
7046f807acdSSteven Rostedt 	return __rb_page_index(cpu_buffer->reader_page,
7056f807acdSSteven Rostedt 			       cpu_buffer->reader_page->read);
7066f807acdSSteven Rostedt }
7076f807acdSSteven Rostedt 
7086f807acdSSteven Rostedt static inline struct ring_buffer_event *
7096f807acdSSteven Rostedt rb_head_event(struct ring_buffer_per_cpu *cpu_buffer)
7106f807acdSSteven Rostedt {
7116f807acdSSteven Rostedt 	return __rb_page_index(cpu_buffer->head_page,
7126f807acdSSteven Rostedt 			       cpu_buffer->head_page->read);
7137a8e76a3SSteven Rostedt }
7147a8e76a3SSteven Rostedt 
7157a8e76a3SSteven Rostedt static inline struct ring_buffer_event *
7167a8e76a3SSteven Rostedt rb_iter_head_event(struct ring_buffer_iter *iter)
7177a8e76a3SSteven Rostedt {
7186f807acdSSteven Rostedt 	return __rb_page_index(iter->head_page, iter->head);
7197a8e76a3SSteven Rostedt }
7207a8e76a3SSteven Rostedt 
721bf41a158SSteven Rostedt static inline unsigned rb_page_write(struct buffer_page *bpage)
722bf41a158SSteven Rostedt {
723bf41a158SSteven Rostedt 	return local_read(&bpage->write);
724bf41a158SSteven Rostedt }
725bf41a158SSteven Rostedt 
726bf41a158SSteven Rostedt static inline unsigned rb_page_commit(struct buffer_page *bpage)
727bf41a158SSteven Rostedt {
728abc9b56dSSteven Rostedt 	return local_read(&bpage->page->commit);
729bf41a158SSteven Rostedt }
730bf41a158SSteven Rostedt 
731bf41a158SSteven Rostedt /* Size is determined by what has been commited */
732bf41a158SSteven Rostedt static inline unsigned rb_page_size(struct buffer_page *bpage)
733bf41a158SSteven Rostedt {
734bf41a158SSteven Rostedt 	return rb_page_commit(bpage);
735bf41a158SSteven Rostedt }
736bf41a158SSteven Rostedt 
737bf41a158SSteven Rostedt static inline unsigned
738bf41a158SSteven Rostedt rb_commit_index(struct ring_buffer_per_cpu *cpu_buffer)
739bf41a158SSteven Rostedt {
740bf41a158SSteven Rostedt 	return rb_page_commit(cpu_buffer->commit_page);
741bf41a158SSteven Rostedt }
742bf41a158SSteven Rostedt 
743bf41a158SSteven Rostedt static inline unsigned rb_head_size(struct ring_buffer_per_cpu *cpu_buffer)
744bf41a158SSteven Rostedt {
745bf41a158SSteven Rostedt 	return rb_page_commit(cpu_buffer->head_page);
746bf41a158SSteven Rostedt }
747bf41a158SSteven Rostedt 
7487a8e76a3SSteven Rostedt /*
7497a8e76a3SSteven Rostedt  * When the tail hits the head and the buffer is in overwrite mode,
7507a8e76a3SSteven Rostedt  * the head jumps to the next page and all content on the previous
7517a8e76a3SSteven Rostedt  * page is discarded. But before doing so, we update the overrun
7527a8e76a3SSteven Rostedt  * variable of the buffer.
7537a8e76a3SSteven Rostedt  */
7547a8e76a3SSteven Rostedt static void rb_update_overflow(struct ring_buffer_per_cpu *cpu_buffer)
7557a8e76a3SSteven Rostedt {
7567a8e76a3SSteven Rostedt 	struct ring_buffer_event *event;
7577a8e76a3SSteven Rostedt 	unsigned long head;
7587a8e76a3SSteven Rostedt 
7597a8e76a3SSteven Rostedt 	for (head = 0; head < rb_head_size(cpu_buffer);
7607a8e76a3SSteven Rostedt 	     head += rb_event_length(event)) {
7617a8e76a3SSteven Rostedt 
7626f807acdSSteven Rostedt 		event = __rb_page_index(cpu_buffer->head_page, head);
7633e89c7bbSSteven Rostedt 		if (RB_WARN_ON(cpu_buffer, rb_null_event(event)))
7643e89c7bbSSteven Rostedt 			return;
7657a8e76a3SSteven Rostedt 		/* Only count data entries */
7667a8e76a3SSteven Rostedt 		if (event->type != RINGBUF_TYPE_DATA)
7677a8e76a3SSteven Rostedt 			continue;
7687a8e76a3SSteven Rostedt 		cpu_buffer->overrun++;
7697a8e76a3SSteven Rostedt 		cpu_buffer->entries--;
7707a8e76a3SSteven Rostedt 	}
7717a8e76a3SSteven Rostedt }
7727a8e76a3SSteven Rostedt 
7737a8e76a3SSteven Rostedt static inline void rb_inc_page(struct ring_buffer_per_cpu *cpu_buffer,
774044fa782SSteven Rostedt 			       struct buffer_page **bpage)
7757a8e76a3SSteven Rostedt {
776044fa782SSteven Rostedt 	struct list_head *p = (*bpage)->list.next;
7777a8e76a3SSteven Rostedt 
7787a8e76a3SSteven Rostedt 	if (p == &cpu_buffer->pages)
7797a8e76a3SSteven Rostedt 		p = p->next;
7807a8e76a3SSteven Rostedt 
781044fa782SSteven Rostedt 	*bpage = list_entry(p, struct buffer_page, list);
7827a8e76a3SSteven Rostedt }
7837a8e76a3SSteven Rostedt 
784bf41a158SSteven Rostedt static inline unsigned
785bf41a158SSteven Rostedt rb_event_index(struct ring_buffer_event *event)
7867a8e76a3SSteven Rostedt {
787bf41a158SSteven Rostedt 	unsigned long addr = (unsigned long)event;
788bf41a158SSteven Rostedt 
789bf41a158SSteven Rostedt 	return (addr & ~PAGE_MASK) - (PAGE_SIZE - BUF_PAGE_SIZE);
7907a8e76a3SSteven Rostedt }
7917a8e76a3SSteven Rostedt 
792bf41a158SSteven Rostedt static inline int
793bf41a158SSteven Rostedt rb_is_commit(struct ring_buffer_per_cpu *cpu_buffer,
794bf41a158SSteven Rostedt 	     struct ring_buffer_event *event)
7957a8e76a3SSteven Rostedt {
796bf41a158SSteven Rostedt 	unsigned long addr = (unsigned long)event;
797bf41a158SSteven Rostedt 	unsigned long index;
798bf41a158SSteven Rostedt 
799bf41a158SSteven Rostedt 	index = rb_event_index(event);
800bf41a158SSteven Rostedt 	addr &= PAGE_MASK;
801bf41a158SSteven Rostedt 
802bf41a158SSteven Rostedt 	return cpu_buffer->commit_page->page == (void *)addr &&
803bf41a158SSteven Rostedt 		rb_commit_index(cpu_buffer) == index;
804bf41a158SSteven Rostedt }
805bf41a158SSteven Rostedt 
806bf41a158SSteven Rostedt static inline void
807bf41a158SSteven Rostedt rb_set_commit_event(struct ring_buffer_per_cpu *cpu_buffer,
808bf41a158SSteven Rostedt 		    struct ring_buffer_event *event)
809bf41a158SSteven Rostedt {
810bf41a158SSteven Rostedt 	unsigned long addr = (unsigned long)event;
811bf41a158SSteven Rostedt 	unsigned long index;
812bf41a158SSteven Rostedt 
813bf41a158SSteven Rostedt 	index = rb_event_index(event);
814bf41a158SSteven Rostedt 	addr &= PAGE_MASK;
815bf41a158SSteven Rostedt 
816bf41a158SSteven Rostedt 	while (cpu_buffer->commit_page->page != (void *)addr) {
8173e89c7bbSSteven Rostedt 		if (RB_WARN_ON(cpu_buffer,
8183e89c7bbSSteven Rostedt 			  cpu_buffer->commit_page == cpu_buffer->tail_page))
8193e89c7bbSSteven Rostedt 			return;
820abc9b56dSSteven Rostedt 		cpu_buffer->commit_page->page->commit =
821bf41a158SSteven Rostedt 			cpu_buffer->commit_page->write;
822bf41a158SSteven Rostedt 		rb_inc_page(cpu_buffer, &cpu_buffer->commit_page);
823abc9b56dSSteven Rostedt 		cpu_buffer->write_stamp =
824abc9b56dSSteven Rostedt 			cpu_buffer->commit_page->page->time_stamp;
825bf41a158SSteven Rostedt 	}
826bf41a158SSteven Rostedt 
827bf41a158SSteven Rostedt 	/* Now set the commit to the event's index */
828abc9b56dSSteven Rostedt 	local_set(&cpu_buffer->commit_page->page->commit, index);
829bf41a158SSteven Rostedt }
830bf41a158SSteven Rostedt 
831bf41a158SSteven Rostedt static inline void
832bf41a158SSteven Rostedt rb_set_commit_to_write(struct ring_buffer_per_cpu *cpu_buffer)
833bf41a158SSteven Rostedt {
834bf41a158SSteven Rostedt 	/*
835bf41a158SSteven Rostedt 	 * We only race with interrupts and NMIs on this CPU.
836bf41a158SSteven Rostedt 	 * If we own the commit event, then we can commit
837bf41a158SSteven Rostedt 	 * all others that interrupted us, since the interruptions
838bf41a158SSteven Rostedt 	 * are in stack format (they finish before they come
839bf41a158SSteven Rostedt 	 * back to us). This allows us to do a simple loop to
840bf41a158SSteven Rostedt 	 * assign the commit to the tail.
841bf41a158SSteven Rostedt 	 */
842bf41a158SSteven Rostedt 	while (cpu_buffer->commit_page != cpu_buffer->tail_page) {
843abc9b56dSSteven Rostedt 		cpu_buffer->commit_page->page->commit =
844bf41a158SSteven Rostedt 			cpu_buffer->commit_page->write;
845bf41a158SSteven Rostedt 		rb_inc_page(cpu_buffer, &cpu_buffer->commit_page);
846abc9b56dSSteven Rostedt 		cpu_buffer->write_stamp =
847abc9b56dSSteven Rostedt 			cpu_buffer->commit_page->page->time_stamp;
848bf41a158SSteven Rostedt 		/* add barrier to keep gcc from optimizing too much */
849bf41a158SSteven Rostedt 		barrier();
850bf41a158SSteven Rostedt 	}
851bf41a158SSteven Rostedt 	while (rb_commit_index(cpu_buffer) !=
852bf41a158SSteven Rostedt 	       rb_page_write(cpu_buffer->commit_page)) {
853abc9b56dSSteven Rostedt 		cpu_buffer->commit_page->page->commit =
854bf41a158SSteven Rostedt 			cpu_buffer->commit_page->write;
855bf41a158SSteven Rostedt 		barrier();
856bf41a158SSteven Rostedt 	}
8577a8e76a3SSteven Rostedt }
8587a8e76a3SSteven Rostedt 
859d769041fSSteven Rostedt static void rb_reset_reader_page(struct ring_buffer_per_cpu *cpu_buffer)
8607a8e76a3SSteven Rostedt {
861abc9b56dSSteven Rostedt 	cpu_buffer->read_stamp = cpu_buffer->reader_page->page->time_stamp;
8626f807acdSSteven Rostedt 	cpu_buffer->reader_page->read = 0;
863d769041fSSteven Rostedt }
864d769041fSSteven Rostedt 
865d769041fSSteven Rostedt static inline void rb_inc_iter(struct ring_buffer_iter *iter)
866d769041fSSteven Rostedt {
867d769041fSSteven Rostedt 	struct ring_buffer_per_cpu *cpu_buffer = iter->cpu_buffer;
868d769041fSSteven Rostedt 
869d769041fSSteven Rostedt 	/*
870d769041fSSteven Rostedt 	 * The iterator could be on the reader page (it starts there).
871d769041fSSteven Rostedt 	 * But the head could have moved, since the reader was
872d769041fSSteven Rostedt 	 * found. Check for this case and assign the iterator
873d769041fSSteven Rostedt 	 * to the head page instead of next.
874d769041fSSteven Rostedt 	 */
875d769041fSSteven Rostedt 	if (iter->head_page == cpu_buffer->reader_page)
876d769041fSSteven Rostedt 		iter->head_page = cpu_buffer->head_page;
877d769041fSSteven Rostedt 	else
878d769041fSSteven Rostedt 		rb_inc_page(cpu_buffer, &iter->head_page);
879d769041fSSteven Rostedt 
880abc9b56dSSteven Rostedt 	iter->read_stamp = iter->head_page->page->time_stamp;
8817a8e76a3SSteven Rostedt 	iter->head = 0;
8827a8e76a3SSteven Rostedt }
8837a8e76a3SSteven Rostedt 
8847a8e76a3SSteven Rostedt /**
8857a8e76a3SSteven Rostedt  * ring_buffer_update_event - update event type and data
8867a8e76a3SSteven Rostedt  * @event: the even to update
8877a8e76a3SSteven Rostedt  * @type: the type of event
8887a8e76a3SSteven Rostedt  * @length: the size of the event field in the ring buffer
8897a8e76a3SSteven Rostedt  *
8907a8e76a3SSteven Rostedt  * Update the type and data fields of the event. The length
8917a8e76a3SSteven Rostedt  * is the actual size that is written to the ring buffer,
8927a8e76a3SSteven Rostedt  * and with this, we can determine what to place into the
8937a8e76a3SSteven Rostedt  * data field.
8947a8e76a3SSteven Rostedt  */
8957a8e76a3SSteven Rostedt static inline void
8967a8e76a3SSteven Rostedt rb_update_event(struct ring_buffer_event *event,
8977a8e76a3SSteven Rostedt 			 unsigned type, unsigned length)
8987a8e76a3SSteven Rostedt {
8997a8e76a3SSteven Rostedt 	event->type = type;
9007a8e76a3SSteven Rostedt 
9017a8e76a3SSteven Rostedt 	switch (type) {
9027a8e76a3SSteven Rostedt 
9037a8e76a3SSteven Rostedt 	case RINGBUF_TYPE_PADDING:
9047a8e76a3SSteven Rostedt 		break;
9057a8e76a3SSteven Rostedt 
9067a8e76a3SSteven Rostedt 	case RINGBUF_TYPE_TIME_EXTEND:
9077a8e76a3SSteven Rostedt 		event->len =
9087a8e76a3SSteven Rostedt 			(RB_LEN_TIME_EXTEND + (RB_ALIGNMENT-1))
9097a8e76a3SSteven Rostedt 			>> RB_ALIGNMENT_SHIFT;
9107a8e76a3SSteven Rostedt 		break;
9117a8e76a3SSteven Rostedt 
9127a8e76a3SSteven Rostedt 	case RINGBUF_TYPE_TIME_STAMP:
9137a8e76a3SSteven Rostedt 		event->len =
9147a8e76a3SSteven Rostedt 			(RB_LEN_TIME_STAMP + (RB_ALIGNMENT-1))
9157a8e76a3SSteven Rostedt 			>> RB_ALIGNMENT_SHIFT;
9167a8e76a3SSteven Rostedt 		break;
9177a8e76a3SSteven Rostedt 
9187a8e76a3SSteven Rostedt 	case RINGBUF_TYPE_DATA:
9197a8e76a3SSteven Rostedt 		length -= RB_EVNT_HDR_SIZE;
9207a8e76a3SSteven Rostedt 		if (length > RB_MAX_SMALL_DATA) {
9217a8e76a3SSteven Rostedt 			event->len = 0;
9227a8e76a3SSteven Rostedt 			event->array[0] = length;
9237a8e76a3SSteven Rostedt 		} else
9247a8e76a3SSteven Rostedt 			event->len =
9257a8e76a3SSteven Rostedt 				(length + (RB_ALIGNMENT-1))
9267a8e76a3SSteven Rostedt 				>> RB_ALIGNMENT_SHIFT;
9277a8e76a3SSteven Rostedt 		break;
9287a8e76a3SSteven Rostedt 	default:
9297a8e76a3SSteven Rostedt 		BUG();
9307a8e76a3SSteven Rostedt 	}
9317a8e76a3SSteven Rostedt }
9327a8e76a3SSteven Rostedt 
9337a8e76a3SSteven Rostedt static inline unsigned rb_calculate_event_length(unsigned length)
9347a8e76a3SSteven Rostedt {
9357a8e76a3SSteven Rostedt 	struct ring_buffer_event event; /* Used only for sizeof array */
9367a8e76a3SSteven Rostedt 
9377a8e76a3SSteven Rostedt 	/* zero length can cause confusions */
9387a8e76a3SSteven Rostedt 	if (!length)
9397a8e76a3SSteven Rostedt 		length = 1;
9407a8e76a3SSteven Rostedt 
9417a8e76a3SSteven Rostedt 	if (length > RB_MAX_SMALL_DATA)
9427a8e76a3SSteven Rostedt 		length += sizeof(event.array[0]);
9437a8e76a3SSteven Rostedt 
9447a8e76a3SSteven Rostedt 	length += RB_EVNT_HDR_SIZE;
9457a8e76a3SSteven Rostedt 	length = ALIGN(length, RB_ALIGNMENT);
9467a8e76a3SSteven Rostedt 
9477a8e76a3SSteven Rostedt 	return length;
9487a8e76a3SSteven Rostedt }
9497a8e76a3SSteven Rostedt 
9507a8e76a3SSteven Rostedt static struct ring_buffer_event *
9517a8e76a3SSteven Rostedt __rb_reserve_next(struct ring_buffer_per_cpu *cpu_buffer,
9527a8e76a3SSteven Rostedt 		  unsigned type, unsigned long length, u64 *ts)
9537a8e76a3SSteven Rostedt {
954d769041fSSteven Rostedt 	struct buffer_page *tail_page, *head_page, *reader_page;
955bf41a158SSteven Rostedt 	unsigned long tail, write;
9567a8e76a3SSteven Rostedt 	struct ring_buffer *buffer = cpu_buffer->buffer;
9577a8e76a3SSteven Rostedt 	struct ring_buffer_event *event;
958bf41a158SSteven Rostedt 	unsigned long flags;
9597a8e76a3SSteven Rostedt 
9607a8e76a3SSteven Rostedt 	tail_page = cpu_buffer->tail_page;
961bf41a158SSteven Rostedt 	write = local_add_return(length, &tail_page->write);
962bf41a158SSteven Rostedt 	tail = write - length;
9637a8e76a3SSteven Rostedt 
964bf41a158SSteven Rostedt 	/* See if we shot pass the end of this buffer page */
965bf41a158SSteven Rostedt 	if (write > BUF_PAGE_SIZE) {
9667a8e76a3SSteven Rostedt 		struct buffer_page *next_page = tail_page;
9677a8e76a3SSteven Rostedt 
9683e03fb7fSSteven Rostedt 		local_irq_save(flags);
9693e03fb7fSSteven Rostedt 		__raw_spin_lock(&cpu_buffer->lock);
970bf41a158SSteven Rostedt 
9717a8e76a3SSteven Rostedt 		rb_inc_page(cpu_buffer, &next_page);
9727a8e76a3SSteven Rostedt 
973d769041fSSteven Rostedt 		head_page = cpu_buffer->head_page;
974d769041fSSteven Rostedt 		reader_page = cpu_buffer->reader_page;
975d769041fSSteven Rostedt 
976d769041fSSteven Rostedt 		/* we grabbed the lock before incrementing */
9773e89c7bbSSteven Rostedt 		if (RB_WARN_ON(cpu_buffer, next_page == reader_page))
9783e89c7bbSSteven Rostedt 			goto out_unlock;
979bf41a158SSteven Rostedt 
980bf41a158SSteven Rostedt 		/*
981bf41a158SSteven Rostedt 		 * If for some reason, we had an interrupt storm that made
982bf41a158SSteven Rostedt 		 * it all the way around the buffer, bail, and warn
983bf41a158SSteven Rostedt 		 * about it.
984bf41a158SSteven Rostedt 		 */
985bf41a158SSteven Rostedt 		if (unlikely(next_page == cpu_buffer->commit_page)) {
986bf41a158SSteven Rostedt 			WARN_ON_ONCE(1);
987bf41a158SSteven Rostedt 			goto out_unlock;
988bf41a158SSteven Rostedt 		}
989d769041fSSteven Rostedt 
9907a8e76a3SSteven Rostedt 		if (next_page == head_page) {
991d769041fSSteven Rostedt 			if (!(buffer->flags & RB_FL_OVERWRITE)) {
992bf41a158SSteven Rostedt 				/* reset write */
993bf41a158SSteven Rostedt 				if (tail <= BUF_PAGE_SIZE)
994bf41a158SSteven Rostedt 					local_set(&tail_page->write, tail);
995bf41a158SSteven Rostedt 				goto out_unlock;
996d769041fSSteven Rostedt 			}
9977a8e76a3SSteven Rostedt 
998bf41a158SSteven Rostedt 			/* tail_page has not moved yet? */
999bf41a158SSteven Rostedt 			if (tail_page == cpu_buffer->tail_page) {
10007a8e76a3SSteven Rostedt 				/* count overflows */
10017a8e76a3SSteven Rostedt 				rb_update_overflow(cpu_buffer);
10027a8e76a3SSteven Rostedt 
10037a8e76a3SSteven Rostedt 				rb_inc_page(cpu_buffer, &head_page);
10047a8e76a3SSteven Rostedt 				cpu_buffer->head_page = head_page;
1005bf41a158SSteven Rostedt 				cpu_buffer->head_page->read = 0;
1006bf41a158SSteven Rostedt 			}
10077a8e76a3SSteven Rostedt 		}
10087a8e76a3SSteven Rostedt 
1009bf41a158SSteven Rostedt 		/*
1010bf41a158SSteven Rostedt 		 * If the tail page is still the same as what we think
1011bf41a158SSteven Rostedt 		 * it is, then it is up to us to update the tail
1012bf41a158SSteven Rostedt 		 * pointer.
1013bf41a158SSteven Rostedt 		 */
1014bf41a158SSteven Rostedt 		if (tail_page == cpu_buffer->tail_page) {
1015bf41a158SSteven Rostedt 			local_set(&next_page->write, 0);
1016abc9b56dSSteven Rostedt 			local_set(&next_page->page->commit, 0);
1017bf41a158SSteven Rostedt 			cpu_buffer->tail_page = next_page;
1018bf41a158SSteven Rostedt 
1019bf41a158SSteven Rostedt 			/* reread the time stamp */
1020bf41a158SSteven Rostedt 			*ts = ring_buffer_time_stamp(cpu_buffer->cpu);
1021abc9b56dSSteven Rostedt 			cpu_buffer->tail_page->page->time_stamp = *ts;
1022bf41a158SSteven Rostedt 		}
1023bf41a158SSteven Rostedt 
1024bf41a158SSteven Rostedt 		/*
1025bf41a158SSteven Rostedt 		 * The actual tail page has moved forward.
1026bf41a158SSteven Rostedt 		 */
1027bf41a158SSteven Rostedt 		if (tail < BUF_PAGE_SIZE) {
1028bf41a158SSteven Rostedt 			/* Mark the rest of the page with padding */
10296f807acdSSteven Rostedt 			event = __rb_page_index(tail_page, tail);
10307a8e76a3SSteven Rostedt 			event->type = RINGBUF_TYPE_PADDING;
10317a8e76a3SSteven Rostedt 		}
10327a8e76a3SSteven Rostedt 
1033bf41a158SSteven Rostedt 		if (tail <= BUF_PAGE_SIZE)
1034bf41a158SSteven Rostedt 			/* Set the write back to the previous setting */
1035bf41a158SSteven Rostedt 			local_set(&tail_page->write, tail);
1036bf41a158SSteven Rostedt 
1037bf41a158SSteven Rostedt 		/*
1038bf41a158SSteven Rostedt 		 * If this was a commit entry that failed,
1039bf41a158SSteven Rostedt 		 * increment that too
1040bf41a158SSteven Rostedt 		 */
1041bf41a158SSteven Rostedt 		if (tail_page == cpu_buffer->commit_page &&
1042bf41a158SSteven Rostedt 		    tail == rb_commit_index(cpu_buffer)) {
1043bf41a158SSteven Rostedt 			rb_set_commit_to_write(cpu_buffer);
10447a8e76a3SSteven Rostedt 		}
10457a8e76a3SSteven Rostedt 
10463e03fb7fSSteven Rostedt 		__raw_spin_unlock(&cpu_buffer->lock);
10473e03fb7fSSteven Rostedt 		local_irq_restore(flags);
1048bf41a158SSteven Rostedt 
1049bf41a158SSteven Rostedt 		/* fail and let the caller try again */
1050bf41a158SSteven Rostedt 		return ERR_PTR(-EAGAIN);
1051bf41a158SSteven Rostedt 	}
1052bf41a158SSteven Rostedt 
1053bf41a158SSteven Rostedt 	/* We reserved something on the buffer */
1054bf41a158SSteven Rostedt 
10553e89c7bbSSteven Rostedt 	if (RB_WARN_ON(cpu_buffer, write > BUF_PAGE_SIZE))
10563e89c7bbSSteven Rostedt 		return NULL;
10577a8e76a3SSteven Rostedt 
10586f807acdSSteven Rostedt 	event = __rb_page_index(tail_page, tail);
10597a8e76a3SSteven Rostedt 	rb_update_event(event, type, length);
10607a8e76a3SSteven Rostedt 
1061bf41a158SSteven Rostedt 	/*
1062bf41a158SSteven Rostedt 	 * If this is a commit and the tail is zero, then update
1063bf41a158SSteven Rostedt 	 * this page's time stamp.
1064bf41a158SSteven Rostedt 	 */
1065bf41a158SSteven Rostedt 	if (!tail && rb_is_commit(cpu_buffer, event))
1066abc9b56dSSteven Rostedt 		cpu_buffer->commit_page->page->time_stamp = *ts;
1067bf41a158SSteven Rostedt 
10687a8e76a3SSteven Rostedt 	return event;
1069bf41a158SSteven Rostedt 
1070bf41a158SSteven Rostedt  out_unlock:
10713e03fb7fSSteven Rostedt 	__raw_spin_unlock(&cpu_buffer->lock);
10723e03fb7fSSteven Rostedt 	local_irq_restore(flags);
1073bf41a158SSteven Rostedt 	return NULL;
10747a8e76a3SSteven Rostedt }
10757a8e76a3SSteven Rostedt 
10767a8e76a3SSteven Rostedt static int
10777a8e76a3SSteven Rostedt rb_add_time_stamp(struct ring_buffer_per_cpu *cpu_buffer,
10787a8e76a3SSteven Rostedt 		  u64 *ts, u64 *delta)
10797a8e76a3SSteven Rostedt {
10807a8e76a3SSteven Rostedt 	struct ring_buffer_event *event;
10817a8e76a3SSteven Rostedt 	static int once;
1082bf41a158SSteven Rostedt 	int ret;
10837a8e76a3SSteven Rostedt 
10847a8e76a3SSteven Rostedt 	if (unlikely(*delta > (1ULL << 59) && !once++)) {
10857a8e76a3SSteven Rostedt 		printk(KERN_WARNING "Delta way too big! %llu"
10867a8e76a3SSteven Rostedt 		       " ts=%llu write stamp = %llu\n",
1087e2862c94SStephen Rothwell 		       (unsigned long long)*delta,
1088e2862c94SStephen Rothwell 		       (unsigned long long)*ts,
1089e2862c94SStephen Rothwell 		       (unsigned long long)cpu_buffer->write_stamp);
10907a8e76a3SSteven Rostedt 		WARN_ON(1);
10917a8e76a3SSteven Rostedt 	}
10927a8e76a3SSteven Rostedt 
10937a8e76a3SSteven Rostedt 	/*
10947a8e76a3SSteven Rostedt 	 * The delta is too big, we to add a
10957a8e76a3SSteven Rostedt 	 * new timestamp.
10967a8e76a3SSteven Rostedt 	 */
10977a8e76a3SSteven Rostedt 	event = __rb_reserve_next(cpu_buffer,
10987a8e76a3SSteven Rostedt 				  RINGBUF_TYPE_TIME_EXTEND,
10997a8e76a3SSteven Rostedt 				  RB_LEN_TIME_EXTEND,
11007a8e76a3SSteven Rostedt 				  ts);
11017a8e76a3SSteven Rostedt 	if (!event)
1102bf41a158SSteven Rostedt 		return -EBUSY;
11037a8e76a3SSteven Rostedt 
1104bf41a158SSteven Rostedt 	if (PTR_ERR(event) == -EAGAIN)
1105bf41a158SSteven Rostedt 		return -EAGAIN;
1106bf41a158SSteven Rostedt 
1107bf41a158SSteven Rostedt 	/* Only a commited time event can update the write stamp */
1108bf41a158SSteven Rostedt 	if (rb_is_commit(cpu_buffer, event)) {
1109bf41a158SSteven Rostedt 		/*
1110bf41a158SSteven Rostedt 		 * If this is the first on the page, then we need to
1111bf41a158SSteven Rostedt 		 * update the page itself, and just put in a zero.
1112bf41a158SSteven Rostedt 		 */
1113bf41a158SSteven Rostedt 		if (rb_event_index(event)) {
11147a8e76a3SSteven Rostedt 			event->time_delta = *delta & TS_MASK;
11157a8e76a3SSteven Rostedt 			event->array[0] = *delta >> TS_SHIFT;
1116bf41a158SSteven Rostedt 		} else {
1117abc9b56dSSteven Rostedt 			cpu_buffer->commit_page->page->time_stamp = *ts;
1118bf41a158SSteven Rostedt 			event->time_delta = 0;
1119bf41a158SSteven Rostedt 			event->array[0] = 0;
1120bf41a158SSteven Rostedt 		}
11217a8e76a3SSteven Rostedt 		cpu_buffer->write_stamp = *ts;
1122bf41a158SSteven Rostedt 		/* let the caller know this was the commit */
1123bf41a158SSteven Rostedt 		ret = 1;
1124bf41a158SSteven Rostedt 	} else {
1125bf41a158SSteven Rostedt 		/* Darn, this is just wasted space */
1126bf41a158SSteven Rostedt 		event->time_delta = 0;
1127bf41a158SSteven Rostedt 		event->array[0] = 0;
1128bf41a158SSteven Rostedt 		ret = 0;
11297a8e76a3SSteven Rostedt 	}
11307a8e76a3SSteven Rostedt 
1131bf41a158SSteven Rostedt 	*delta = 0;
1132bf41a158SSteven Rostedt 
1133bf41a158SSteven Rostedt 	return ret;
11347a8e76a3SSteven Rostedt }
11357a8e76a3SSteven Rostedt 
11367a8e76a3SSteven Rostedt static struct ring_buffer_event *
11377a8e76a3SSteven Rostedt rb_reserve_next_event(struct ring_buffer_per_cpu *cpu_buffer,
11387a8e76a3SSteven Rostedt 		      unsigned type, unsigned long length)
11397a8e76a3SSteven Rostedt {
11407a8e76a3SSteven Rostedt 	struct ring_buffer_event *event;
11417a8e76a3SSteven Rostedt 	u64 ts, delta;
1142bf41a158SSteven Rostedt 	int commit = 0;
1143818e3dd3SSteven Rostedt 	int nr_loops = 0;
11447a8e76a3SSteven Rostedt 
1145bf41a158SSteven Rostedt  again:
1146818e3dd3SSteven Rostedt 	/*
1147818e3dd3SSteven Rostedt 	 * We allow for interrupts to reenter here and do a trace.
1148818e3dd3SSteven Rostedt 	 * If one does, it will cause this original code to loop
1149818e3dd3SSteven Rostedt 	 * back here. Even with heavy interrupts happening, this
1150818e3dd3SSteven Rostedt 	 * should only happen a few times in a row. If this happens
1151818e3dd3SSteven Rostedt 	 * 1000 times in a row, there must be either an interrupt
1152818e3dd3SSteven Rostedt 	 * storm or we have something buggy.
1153818e3dd3SSteven Rostedt 	 * Bail!
1154818e3dd3SSteven Rostedt 	 */
11553e89c7bbSSteven Rostedt 	if (RB_WARN_ON(cpu_buffer, ++nr_loops > 1000))
1156818e3dd3SSteven Rostedt 		return NULL;
1157818e3dd3SSteven Rostedt 
11587a8e76a3SSteven Rostedt 	ts = ring_buffer_time_stamp(cpu_buffer->cpu);
11597a8e76a3SSteven Rostedt 
1160bf41a158SSteven Rostedt 	/*
1161bf41a158SSteven Rostedt 	 * Only the first commit can update the timestamp.
1162bf41a158SSteven Rostedt 	 * Yes there is a race here. If an interrupt comes in
1163bf41a158SSteven Rostedt 	 * just after the conditional and it traces too, then it
1164bf41a158SSteven Rostedt 	 * will also check the deltas. More than one timestamp may
1165bf41a158SSteven Rostedt 	 * also be made. But only the entry that did the actual
1166bf41a158SSteven Rostedt 	 * commit will be something other than zero.
1167bf41a158SSteven Rostedt 	 */
1168bf41a158SSteven Rostedt 	if (cpu_buffer->tail_page == cpu_buffer->commit_page &&
1169bf41a158SSteven Rostedt 	    rb_page_write(cpu_buffer->tail_page) ==
1170bf41a158SSteven Rostedt 	    rb_commit_index(cpu_buffer)) {
1171bf41a158SSteven Rostedt 
11727a8e76a3SSteven Rostedt 		delta = ts - cpu_buffer->write_stamp;
11737a8e76a3SSteven Rostedt 
1174bf41a158SSteven Rostedt 		/* make sure this delta is calculated here */
1175bf41a158SSteven Rostedt 		barrier();
11767a8e76a3SSteven Rostedt 
1177bf41a158SSteven Rostedt 		/* Did the write stamp get updated already? */
1178bf41a158SSteven Rostedt 		if (unlikely(ts < cpu_buffer->write_stamp))
11794143c5cbSSteven Rostedt 			delta = 0;
1180bf41a158SSteven Rostedt 
1181bf41a158SSteven Rostedt 		if (test_time_stamp(delta)) {
1182bf41a158SSteven Rostedt 
1183bf41a158SSteven Rostedt 			commit = rb_add_time_stamp(cpu_buffer, &ts, &delta);
1184bf41a158SSteven Rostedt 
1185bf41a158SSteven Rostedt 			if (commit == -EBUSY)
11867a8e76a3SSteven Rostedt 				return NULL;
1187bf41a158SSteven Rostedt 
1188bf41a158SSteven Rostedt 			if (commit == -EAGAIN)
1189bf41a158SSteven Rostedt 				goto again;
1190bf41a158SSteven Rostedt 
1191bf41a158SSteven Rostedt 			RB_WARN_ON(cpu_buffer, commit < 0);
11927a8e76a3SSteven Rostedt 		}
1193bf41a158SSteven Rostedt 	} else
1194bf41a158SSteven Rostedt 		/* Non commits have zero deltas */
11957a8e76a3SSteven Rostedt 		delta = 0;
11967a8e76a3SSteven Rostedt 
11977a8e76a3SSteven Rostedt 	event = __rb_reserve_next(cpu_buffer, type, length, &ts);
1198bf41a158SSteven Rostedt 	if (PTR_ERR(event) == -EAGAIN)
1199bf41a158SSteven Rostedt 		goto again;
12007a8e76a3SSteven Rostedt 
1201bf41a158SSteven Rostedt 	if (!event) {
1202bf41a158SSteven Rostedt 		if (unlikely(commit))
1203bf41a158SSteven Rostedt 			/*
1204bf41a158SSteven Rostedt 			 * Ouch! We needed a timestamp and it was commited. But
1205bf41a158SSteven Rostedt 			 * we didn't get our event reserved.
1206bf41a158SSteven Rostedt 			 */
1207bf41a158SSteven Rostedt 			rb_set_commit_to_write(cpu_buffer);
1208bf41a158SSteven Rostedt 		return NULL;
1209bf41a158SSteven Rostedt 	}
1210bf41a158SSteven Rostedt 
1211bf41a158SSteven Rostedt 	/*
1212bf41a158SSteven Rostedt 	 * If the timestamp was commited, make the commit our entry
1213bf41a158SSteven Rostedt 	 * now so that we will update it when needed.
1214bf41a158SSteven Rostedt 	 */
1215bf41a158SSteven Rostedt 	if (commit)
1216bf41a158SSteven Rostedt 		rb_set_commit_event(cpu_buffer, event);
1217bf41a158SSteven Rostedt 	else if (!rb_is_commit(cpu_buffer, event))
12187a8e76a3SSteven Rostedt 		delta = 0;
12197a8e76a3SSteven Rostedt 
12207a8e76a3SSteven Rostedt 	event->time_delta = delta;
12217a8e76a3SSteven Rostedt 
12227a8e76a3SSteven Rostedt 	return event;
12237a8e76a3SSteven Rostedt }
12247a8e76a3SSteven Rostedt 
1225bf41a158SSteven Rostedt static DEFINE_PER_CPU(int, rb_need_resched);
1226bf41a158SSteven Rostedt 
12277a8e76a3SSteven Rostedt /**
12287a8e76a3SSteven Rostedt  * ring_buffer_lock_reserve - reserve a part of the buffer
12297a8e76a3SSteven Rostedt  * @buffer: the ring buffer to reserve from
12307a8e76a3SSteven Rostedt  * @length: the length of the data to reserve (excluding event header)
12317a8e76a3SSteven Rostedt  * @flags: a pointer to save the interrupt flags
12327a8e76a3SSteven Rostedt  *
12337a8e76a3SSteven Rostedt  * Returns a reseverd event on the ring buffer to copy directly to.
12347a8e76a3SSteven Rostedt  * The user of this interface will need to get the body to write into
12357a8e76a3SSteven Rostedt  * and can use the ring_buffer_event_data() interface.
12367a8e76a3SSteven Rostedt  *
12377a8e76a3SSteven Rostedt  * The length is the length of the data needed, not the event length
12387a8e76a3SSteven Rostedt  * which also includes the event header.
12397a8e76a3SSteven Rostedt  *
12407a8e76a3SSteven Rostedt  * Must be paired with ring_buffer_unlock_commit, unless NULL is returned.
12417a8e76a3SSteven Rostedt  * If NULL is returned, then nothing has been allocated or locked.
12427a8e76a3SSteven Rostedt  */
12437a8e76a3SSteven Rostedt struct ring_buffer_event *
12447a8e76a3SSteven Rostedt ring_buffer_lock_reserve(struct ring_buffer *buffer,
12457a8e76a3SSteven Rostedt 			 unsigned long length,
12467a8e76a3SSteven Rostedt 			 unsigned long *flags)
12477a8e76a3SSteven Rostedt {
12487a8e76a3SSteven Rostedt 	struct ring_buffer_per_cpu *cpu_buffer;
12497a8e76a3SSteven Rostedt 	struct ring_buffer_event *event;
1250bf41a158SSteven Rostedt 	int cpu, resched;
12517a8e76a3SSteven Rostedt 
1252033601a3SSteven Rostedt 	if (ring_buffer_flags != RB_BUFFERS_ON)
1253a3583244SSteven Rostedt 		return NULL;
1254a3583244SSteven Rostedt 
12557a8e76a3SSteven Rostedt 	if (atomic_read(&buffer->record_disabled))
12567a8e76a3SSteven Rostedt 		return NULL;
12577a8e76a3SSteven Rostedt 
1258bf41a158SSteven Rostedt 	/* If we are tracing schedule, we don't want to recurse */
1259182e9f5fSSteven Rostedt 	resched = ftrace_preempt_disable();
1260bf41a158SSteven Rostedt 
12617a8e76a3SSteven Rostedt 	cpu = raw_smp_processor_id();
12627a8e76a3SSteven Rostedt 
12637a8e76a3SSteven Rostedt 	if (!cpu_isset(cpu, buffer->cpumask))
1264d769041fSSteven Rostedt 		goto out;
12657a8e76a3SSteven Rostedt 
12667a8e76a3SSteven Rostedt 	cpu_buffer = buffer->buffers[cpu];
12677a8e76a3SSteven Rostedt 
12687a8e76a3SSteven Rostedt 	if (atomic_read(&cpu_buffer->record_disabled))
1269d769041fSSteven Rostedt 		goto out;
12707a8e76a3SSteven Rostedt 
12717a8e76a3SSteven Rostedt 	length = rb_calculate_event_length(length);
12727a8e76a3SSteven Rostedt 	if (length > BUF_PAGE_SIZE)
1273bf41a158SSteven Rostedt 		goto out;
12747a8e76a3SSteven Rostedt 
12757a8e76a3SSteven Rostedt 	event = rb_reserve_next_event(cpu_buffer, RINGBUF_TYPE_DATA, length);
12767a8e76a3SSteven Rostedt 	if (!event)
1277d769041fSSteven Rostedt 		goto out;
12787a8e76a3SSteven Rostedt 
1279bf41a158SSteven Rostedt 	/*
1280bf41a158SSteven Rostedt 	 * Need to store resched state on this cpu.
1281bf41a158SSteven Rostedt 	 * Only the first needs to.
1282bf41a158SSteven Rostedt 	 */
1283bf41a158SSteven Rostedt 
1284bf41a158SSteven Rostedt 	if (preempt_count() == 1)
1285bf41a158SSteven Rostedt 		per_cpu(rb_need_resched, cpu) = resched;
1286bf41a158SSteven Rostedt 
12877a8e76a3SSteven Rostedt 	return event;
12887a8e76a3SSteven Rostedt 
1289d769041fSSteven Rostedt  out:
1290182e9f5fSSteven Rostedt 	ftrace_preempt_enable(resched);
12917a8e76a3SSteven Rostedt 	return NULL;
12927a8e76a3SSteven Rostedt }
12937a8e76a3SSteven Rostedt 
12947a8e76a3SSteven Rostedt static void rb_commit(struct ring_buffer_per_cpu *cpu_buffer,
12957a8e76a3SSteven Rostedt 		      struct ring_buffer_event *event)
12967a8e76a3SSteven Rostedt {
12977a8e76a3SSteven Rostedt 	cpu_buffer->entries++;
1298bf41a158SSteven Rostedt 
1299bf41a158SSteven Rostedt 	/* Only process further if we own the commit */
1300bf41a158SSteven Rostedt 	if (!rb_is_commit(cpu_buffer, event))
1301bf41a158SSteven Rostedt 		return;
1302bf41a158SSteven Rostedt 
1303bf41a158SSteven Rostedt 	cpu_buffer->write_stamp += event->time_delta;
1304bf41a158SSteven Rostedt 
1305bf41a158SSteven Rostedt 	rb_set_commit_to_write(cpu_buffer);
13067a8e76a3SSteven Rostedt }
13077a8e76a3SSteven Rostedt 
13087a8e76a3SSteven Rostedt /**
13097a8e76a3SSteven Rostedt  * ring_buffer_unlock_commit - commit a reserved
13107a8e76a3SSteven Rostedt  * @buffer: The buffer to commit to
13117a8e76a3SSteven Rostedt  * @event: The event pointer to commit.
13127a8e76a3SSteven Rostedt  * @flags: the interrupt flags received from ring_buffer_lock_reserve.
13137a8e76a3SSteven Rostedt  *
13147a8e76a3SSteven Rostedt  * This commits the data to the ring buffer, and releases any locks held.
13157a8e76a3SSteven Rostedt  *
13167a8e76a3SSteven Rostedt  * Must be paired with ring_buffer_lock_reserve.
13177a8e76a3SSteven Rostedt  */
13187a8e76a3SSteven Rostedt int ring_buffer_unlock_commit(struct ring_buffer *buffer,
13197a8e76a3SSteven Rostedt 			      struct ring_buffer_event *event,
13207a8e76a3SSteven Rostedt 			      unsigned long flags)
13217a8e76a3SSteven Rostedt {
13227a8e76a3SSteven Rostedt 	struct ring_buffer_per_cpu *cpu_buffer;
13237a8e76a3SSteven Rostedt 	int cpu = raw_smp_processor_id();
13247a8e76a3SSteven Rostedt 
13257a8e76a3SSteven Rostedt 	cpu_buffer = buffer->buffers[cpu];
13267a8e76a3SSteven Rostedt 
13277a8e76a3SSteven Rostedt 	rb_commit(cpu_buffer, event);
13287a8e76a3SSteven Rostedt 
1329bf41a158SSteven Rostedt 	/*
1330bf41a158SSteven Rostedt 	 * Only the last preempt count needs to restore preemption.
1331bf41a158SSteven Rostedt 	 */
1332182e9f5fSSteven Rostedt 	if (preempt_count() == 1)
1333182e9f5fSSteven Rostedt 		ftrace_preempt_enable(per_cpu(rb_need_resched, cpu));
1334bf41a158SSteven Rostedt 	else
1335bf41a158SSteven Rostedt 		preempt_enable_no_resched_notrace();
13367a8e76a3SSteven Rostedt 
13377a8e76a3SSteven Rostedt 	return 0;
13387a8e76a3SSteven Rostedt }
13397a8e76a3SSteven Rostedt 
13407a8e76a3SSteven Rostedt /**
13417a8e76a3SSteven Rostedt  * ring_buffer_write - write data to the buffer without reserving
13427a8e76a3SSteven Rostedt  * @buffer: The ring buffer to write to.
13437a8e76a3SSteven Rostedt  * @length: The length of the data being written (excluding the event header)
13447a8e76a3SSteven Rostedt  * @data: The data to write to the buffer.
13457a8e76a3SSteven Rostedt  *
13467a8e76a3SSteven Rostedt  * This is like ring_buffer_lock_reserve and ring_buffer_unlock_commit as
13477a8e76a3SSteven Rostedt  * one function. If you already have the data to write to the buffer, it
13487a8e76a3SSteven Rostedt  * may be easier to simply call this function.
13497a8e76a3SSteven Rostedt  *
13507a8e76a3SSteven Rostedt  * Note, like ring_buffer_lock_reserve, the length is the length of the data
13517a8e76a3SSteven Rostedt  * and not the length of the event which would hold the header.
13527a8e76a3SSteven Rostedt  */
13537a8e76a3SSteven Rostedt int ring_buffer_write(struct ring_buffer *buffer,
13547a8e76a3SSteven Rostedt 			unsigned long length,
13557a8e76a3SSteven Rostedt 			void *data)
13567a8e76a3SSteven Rostedt {
13577a8e76a3SSteven Rostedt 	struct ring_buffer_per_cpu *cpu_buffer;
13587a8e76a3SSteven Rostedt 	struct ring_buffer_event *event;
1359bf41a158SSteven Rostedt 	unsigned long event_length;
13607a8e76a3SSteven Rostedt 	void *body;
13617a8e76a3SSteven Rostedt 	int ret = -EBUSY;
1362bf41a158SSteven Rostedt 	int cpu, resched;
13637a8e76a3SSteven Rostedt 
1364033601a3SSteven Rostedt 	if (ring_buffer_flags != RB_BUFFERS_ON)
1365a3583244SSteven Rostedt 		return -EBUSY;
1366a3583244SSteven Rostedt 
13677a8e76a3SSteven Rostedt 	if (atomic_read(&buffer->record_disabled))
13687a8e76a3SSteven Rostedt 		return -EBUSY;
13697a8e76a3SSteven Rostedt 
1370182e9f5fSSteven Rostedt 	resched = ftrace_preempt_disable();
1371bf41a158SSteven Rostedt 
13727a8e76a3SSteven Rostedt 	cpu = raw_smp_processor_id();
13737a8e76a3SSteven Rostedt 
13747a8e76a3SSteven Rostedt 	if (!cpu_isset(cpu, buffer->cpumask))
1375d769041fSSteven Rostedt 		goto out;
13767a8e76a3SSteven Rostedt 
13777a8e76a3SSteven Rostedt 	cpu_buffer = buffer->buffers[cpu];
13787a8e76a3SSteven Rostedt 
13797a8e76a3SSteven Rostedt 	if (atomic_read(&cpu_buffer->record_disabled))
13807a8e76a3SSteven Rostedt 		goto out;
13817a8e76a3SSteven Rostedt 
13827a8e76a3SSteven Rostedt 	event_length = rb_calculate_event_length(length);
13837a8e76a3SSteven Rostedt 	event = rb_reserve_next_event(cpu_buffer,
13847a8e76a3SSteven Rostedt 				      RINGBUF_TYPE_DATA, event_length);
13857a8e76a3SSteven Rostedt 	if (!event)
13867a8e76a3SSteven Rostedt 		goto out;
13877a8e76a3SSteven Rostedt 
13887a8e76a3SSteven Rostedt 	body = rb_event_data(event);
13897a8e76a3SSteven Rostedt 
13907a8e76a3SSteven Rostedt 	memcpy(body, data, length);
13917a8e76a3SSteven Rostedt 
13927a8e76a3SSteven Rostedt 	rb_commit(cpu_buffer, event);
13937a8e76a3SSteven Rostedt 
13947a8e76a3SSteven Rostedt 	ret = 0;
13957a8e76a3SSteven Rostedt  out:
1396182e9f5fSSteven Rostedt 	ftrace_preempt_enable(resched);
13977a8e76a3SSteven Rostedt 
13987a8e76a3SSteven Rostedt 	return ret;
13997a8e76a3SSteven Rostedt }
14007a8e76a3SSteven Rostedt 
1401bf41a158SSteven Rostedt static inline int rb_per_cpu_empty(struct ring_buffer_per_cpu *cpu_buffer)
1402bf41a158SSteven Rostedt {
1403bf41a158SSteven Rostedt 	struct buffer_page *reader = cpu_buffer->reader_page;
1404bf41a158SSteven Rostedt 	struct buffer_page *head = cpu_buffer->head_page;
1405bf41a158SSteven Rostedt 	struct buffer_page *commit = cpu_buffer->commit_page;
1406bf41a158SSteven Rostedt 
1407bf41a158SSteven Rostedt 	return reader->read == rb_page_commit(reader) &&
1408bf41a158SSteven Rostedt 		(commit == reader ||
1409bf41a158SSteven Rostedt 		 (commit == head &&
1410bf41a158SSteven Rostedt 		  head->read == rb_page_commit(commit)));
1411bf41a158SSteven Rostedt }
1412bf41a158SSteven Rostedt 
14137a8e76a3SSteven Rostedt /**
14147a8e76a3SSteven Rostedt  * ring_buffer_record_disable - stop all writes into the buffer
14157a8e76a3SSteven Rostedt  * @buffer: The ring buffer to stop writes to.
14167a8e76a3SSteven Rostedt  *
14177a8e76a3SSteven Rostedt  * This prevents all writes to the buffer. Any attempt to write
14187a8e76a3SSteven Rostedt  * to the buffer after this will fail and return NULL.
14197a8e76a3SSteven Rostedt  *
14207a8e76a3SSteven Rostedt  * The caller should call synchronize_sched() after this.
14217a8e76a3SSteven Rostedt  */
14227a8e76a3SSteven Rostedt void ring_buffer_record_disable(struct ring_buffer *buffer)
14237a8e76a3SSteven Rostedt {
14247a8e76a3SSteven Rostedt 	atomic_inc(&buffer->record_disabled);
14257a8e76a3SSteven Rostedt }
14267a8e76a3SSteven Rostedt 
14277a8e76a3SSteven Rostedt /**
14287a8e76a3SSteven Rostedt  * ring_buffer_record_enable - enable writes to the buffer
14297a8e76a3SSteven Rostedt  * @buffer: The ring buffer to enable writes
14307a8e76a3SSteven Rostedt  *
14317a8e76a3SSteven Rostedt  * Note, multiple disables will need the same number of enables
14327a8e76a3SSteven Rostedt  * to truely enable the writing (much like preempt_disable).
14337a8e76a3SSteven Rostedt  */
14347a8e76a3SSteven Rostedt void ring_buffer_record_enable(struct ring_buffer *buffer)
14357a8e76a3SSteven Rostedt {
14367a8e76a3SSteven Rostedt 	atomic_dec(&buffer->record_disabled);
14377a8e76a3SSteven Rostedt }
14387a8e76a3SSteven Rostedt 
14397a8e76a3SSteven Rostedt /**
14407a8e76a3SSteven Rostedt  * ring_buffer_record_disable_cpu - stop all writes into the cpu_buffer
14417a8e76a3SSteven Rostedt  * @buffer: The ring buffer to stop writes to.
14427a8e76a3SSteven Rostedt  * @cpu: The CPU buffer to stop
14437a8e76a3SSteven Rostedt  *
14447a8e76a3SSteven Rostedt  * This prevents all writes to the buffer. Any attempt to write
14457a8e76a3SSteven Rostedt  * to the buffer after this will fail and return NULL.
14467a8e76a3SSteven Rostedt  *
14477a8e76a3SSteven Rostedt  * The caller should call synchronize_sched() after this.
14487a8e76a3SSteven Rostedt  */
14497a8e76a3SSteven Rostedt void ring_buffer_record_disable_cpu(struct ring_buffer *buffer, int cpu)
14507a8e76a3SSteven Rostedt {
14517a8e76a3SSteven Rostedt 	struct ring_buffer_per_cpu *cpu_buffer;
14527a8e76a3SSteven Rostedt 
14537a8e76a3SSteven Rostedt 	if (!cpu_isset(cpu, buffer->cpumask))
14547a8e76a3SSteven Rostedt 		return;
14557a8e76a3SSteven Rostedt 
14567a8e76a3SSteven Rostedt 	cpu_buffer = buffer->buffers[cpu];
14577a8e76a3SSteven Rostedt 	atomic_inc(&cpu_buffer->record_disabled);
14587a8e76a3SSteven Rostedt }
14597a8e76a3SSteven Rostedt 
14607a8e76a3SSteven Rostedt /**
14617a8e76a3SSteven Rostedt  * ring_buffer_record_enable_cpu - enable writes to the buffer
14627a8e76a3SSteven Rostedt  * @buffer: The ring buffer to enable writes
14637a8e76a3SSteven Rostedt  * @cpu: The CPU to enable.
14647a8e76a3SSteven Rostedt  *
14657a8e76a3SSteven Rostedt  * Note, multiple disables will need the same number of enables
14667a8e76a3SSteven Rostedt  * to truely enable the writing (much like preempt_disable).
14677a8e76a3SSteven Rostedt  */
14687a8e76a3SSteven Rostedt void ring_buffer_record_enable_cpu(struct ring_buffer *buffer, int cpu)
14697a8e76a3SSteven Rostedt {
14707a8e76a3SSteven Rostedt 	struct ring_buffer_per_cpu *cpu_buffer;
14717a8e76a3SSteven Rostedt 
14727a8e76a3SSteven Rostedt 	if (!cpu_isset(cpu, buffer->cpumask))
14737a8e76a3SSteven Rostedt 		return;
14747a8e76a3SSteven Rostedt 
14757a8e76a3SSteven Rostedt 	cpu_buffer = buffer->buffers[cpu];
14767a8e76a3SSteven Rostedt 	atomic_dec(&cpu_buffer->record_disabled);
14777a8e76a3SSteven Rostedt }
14787a8e76a3SSteven Rostedt 
14797a8e76a3SSteven Rostedt /**
14807a8e76a3SSteven Rostedt  * ring_buffer_entries_cpu - get the number of entries in a cpu buffer
14817a8e76a3SSteven Rostedt  * @buffer: The ring buffer
14827a8e76a3SSteven Rostedt  * @cpu: The per CPU buffer to get the entries from.
14837a8e76a3SSteven Rostedt  */
14847a8e76a3SSteven Rostedt unsigned long ring_buffer_entries_cpu(struct ring_buffer *buffer, int cpu)
14857a8e76a3SSteven Rostedt {
14867a8e76a3SSteven Rostedt 	struct ring_buffer_per_cpu *cpu_buffer;
14877a8e76a3SSteven Rostedt 
14887a8e76a3SSteven Rostedt 	if (!cpu_isset(cpu, buffer->cpumask))
14897a8e76a3SSteven Rostedt 		return 0;
14907a8e76a3SSteven Rostedt 
14917a8e76a3SSteven Rostedt 	cpu_buffer = buffer->buffers[cpu];
14927a8e76a3SSteven Rostedt 	return cpu_buffer->entries;
14937a8e76a3SSteven Rostedt }
14947a8e76a3SSteven Rostedt 
14957a8e76a3SSteven Rostedt /**
14967a8e76a3SSteven Rostedt  * ring_buffer_overrun_cpu - get the number of overruns in a cpu_buffer
14977a8e76a3SSteven Rostedt  * @buffer: The ring buffer
14987a8e76a3SSteven Rostedt  * @cpu: The per CPU buffer to get the number of overruns from
14997a8e76a3SSteven Rostedt  */
15007a8e76a3SSteven Rostedt unsigned long ring_buffer_overrun_cpu(struct ring_buffer *buffer, int cpu)
15017a8e76a3SSteven Rostedt {
15027a8e76a3SSteven Rostedt 	struct ring_buffer_per_cpu *cpu_buffer;
15037a8e76a3SSteven Rostedt 
15047a8e76a3SSteven Rostedt 	if (!cpu_isset(cpu, buffer->cpumask))
15057a8e76a3SSteven Rostedt 		return 0;
15067a8e76a3SSteven Rostedt 
15077a8e76a3SSteven Rostedt 	cpu_buffer = buffer->buffers[cpu];
15087a8e76a3SSteven Rostedt 	return cpu_buffer->overrun;
15097a8e76a3SSteven Rostedt }
15107a8e76a3SSteven Rostedt 
15117a8e76a3SSteven Rostedt /**
15127a8e76a3SSteven Rostedt  * ring_buffer_entries - get the number of entries in a buffer
15137a8e76a3SSteven Rostedt  * @buffer: The ring buffer
15147a8e76a3SSteven Rostedt  *
15157a8e76a3SSteven Rostedt  * Returns the total number of entries in the ring buffer
15167a8e76a3SSteven Rostedt  * (all CPU entries)
15177a8e76a3SSteven Rostedt  */
15187a8e76a3SSteven Rostedt unsigned long ring_buffer_entries(struct ring_buffer *buffer)
15197a8e76a3SSteven Rostedt {
15207a8e76a3SSteven Rostedt 	struct ring_buffer_per_cpu *cpu_buffer;
15217a8e76a3SSteven Rostedt 	unsigned long entries = 0;
15227a8e76a3SSteven Rostedt 	int cpu;
15237a8e76a3SSteven Rostedt 
15247a8e76a3SSteven Rostedt 	/* if you care about this being correct, lock the buffer */
15257a8e76a3SSteven Rostedt 	for_each_buffer_cpu(buffer, cpu) {
15267a8e76a3SSteven Rostedt 		cpu_buffer = buffer->buffers[cpu];
15277a8e76a3SSteven Rostedt 		entries += cpu_buffer->entries;
15287a8e76a3SSteven Rostedt 	}
15297a8e76a3SSteven Rostedt 
15307a8e76a3SSteven Rostedt 	return entries;
15317a8e76a3SSteven Rostedt }
15327a8e76a3SSteven Rostedt 
15337a8e76a3SSteven Rostedt /**
15347a8e76a3SSteven Rostedt  * ring_buffer_overrun_cpu - get the number of overruns in buffer
15357a8e76a3SSteven Rostedt  * @buffer: The ring buffer
15367a8e76a3SSteven Rostedt  *
15377a8e76a3SSteven Rostedt  * Returns the total number of overruns in the ring buffer
15387a8e76a3SSteven Rostedt  * (all CPU entries)
15397a8e76a3SSteven Rostedt  */
15407a8e76a3SSteven Rostedt unsigned long ring_buffer_overruns(struct ring_buffer *buffer)
15417a8e76a3SSteven Rostedt {
15427a8e76a3SSteven Rostedt 	struct ring_buffer_per_cpu *cpu_buffer;
15437a8e76a3SSteven Rostedt 	unsigned long overruns = 0;
15447a8e76a3SSteven Rostedt 	int cpu;
15457a8e76a3SSteven Rostedt 
15467a8e76a3SSteven Rostedt 	/* if you care about this being correct, lock the buffer */
15477a8e76a3SSteven Rostedt 	for_each_buffer_cpu(buffer, cpu) {
15487a8e76a3SSteven Rostedt 		cpu_buffer = buffer->buffers[cpu];
15497a8e76a3SSteven Rostedt 		overruns += cpu_buffer->overrun;
15507a8e76a3SSteven Rostedt 	}
15517a8e76a3SSteven Rostedt 
15527a8e76a3SSteven Rostedt 	return overruns;
15537a8e76a3SSteven Rostedt }
15547a8e76a3SSteven Rostedt 
1555642edba5SSteven Rostedt static void rb_iter_reset(struct ring_buffer_iter *iter)
15567a8e76a3SSteven Rostedt {
15577a8e76a3SSteven Rostedt 	struct ring_buffer_per_cpu *cpu_buffer = iter->cpu_buffer;
15587a8e76a3SSteven Rostedt 
1559d769041fSSteven Rostedt 	/* Iterator usage is expected to have record disabled */
1560d769041fSSteven Rostedt 	if (list_empty(&cpu_buffer->reader_page->list)) {
15617a8e76a3SSteven Rostedt 		iter->head_page = cpu_buffer->head_page;
15626f807acdSSteven Rostedt 		iter->head = cpu_buffer->head_page->read;
1563d769041fSSteven Rostedt 	} else {
1564d769041fSSteven Rostedt 		iter->head_page = cpu_buffer->reader_page;
15656f807acdSSteven Rostedt 		iter->head = cpu_buffer->reader_page->read;
1566d769041fSSteven Rostedt 	}
1567d769041fSSteven Rostedt 	if (iter->head)
1568d769041fSSteven Rostedt 		iter->read_stamp = cpu_buffer->read_stamp;
1569d769041fSSteven Rostedt 	else
1570abc9b56dSSteven Rostedt 		iter->read_stamp = iter->head_page->page->time_stamp;
1571642edba5SSteven Rostedt }
1572f83c9d0fSSteven Rostedt 
1573642edba5SSteven Rostedt /**
1574642edba5SSteven Rostedt  * ring_buffer_iter_reset - reset an iterator
1575642edba5SSteven Rostedt  * @iter: The iterator to reset
1576642edba5SSteven Rostedt  *
1577642edba5SSteven Rostedt  * Resets the iterator, so that it will start from the beginning
1578642edba5SSteven Rostedt  * again.
1579642edba5SSteven Rostedt  */
1580642edba5SSteven Rostedt void ring_buffer_iter_reset(struct ring_buffer_iter *iter)
1581642edba5SSteven Rostedt {
1582642edba5SSteven Rostedt 	struct ring_buffer_per_cpu *cpu_buffer = iter->cpu_buffer;
1583642edba5SSteven Rostedt 	unsigned long flags;
1584642edba5SSteven Rostedt 
1585642edba5SSteven Rostedt 	spin_lock_irqsave(&cpu_buffer->reader_lock, flags);
1586642edba5SSteven Rostedt 	rb_iter_reset(iter);
1587f83c9d0fSSteven Rostedt 	spin_unlock_irqrestore(&cpu_buffer->reader_lock, flags);
15887a8e76a3SSteven Rostedt }
15897a8e76a3SSteven Rostedt 
15907a8e76a3SSteven Rostedt /**
15917a8e76a3SSteven Rostedt  * ring_buffer_iter_empty - check if an iterator has no more to read
15927a8e76a3SSteven Rostedt  * @iter: The iterator to check
15937a8e76a3SSteven Rostedt  */
15947a8e76a3SSteven Rostedt int ring_buffer_iter_empty(struct ring_buffer_iter *iter)
15957a8e76a3SSteven Rostedt {
15967a8e76a3SSteven Rostedt 	struct ring_buffer_per_cpu *cpu_buffer;
15977a8e76a3SSteven Rostedt 
15987a8e76a3SSteven Rostedt 	cpu_buffer = iter->cpu_buffer;
15997a8e76a3SSteven Rostedt 
1600bf41a158SSteven Rostedt 	return iter->head_page == cpu_buffer->commit_page &&
1601bf41a158SSteven Rostedt 		iter->head == rb_commit_index(cpu_buffer);
16027a8e76a3SSteven Rostedt }
16037a8e76a3SSteven Rostedt 
16047a8e76a3SSteven Rostedt static void
16057a8e76a3SSteven Rostedt rb_update_read_stamp(struct ring_buffer_per_cpu *cpu_buffer,
16067a8e76a3SSteven Rostedt 		     struct ring_buffer_event *event)
16077a8e76a3SSteven Rostedt {
16087a8e76a3SSteven Rostedt 	u64 delta;
16097a8e76a3SSteven Rostedt 
16107a8e76a3SSteven Rostedt 	switch (event->type) {
16117a8e76a3SSteven Rostedt 	case RINGBUF_TYPE_PADDING:
16127a8e76a3SSteven Rostedt 		return;
16137a8e76a3SSteven Rostedt 
16147a8e76a3SSteven Rostedt 	case RINGBUF_TYPE_TIME_EXTEND:
16157a8e76a3SSteven Rostedt 		delta = event->array[0];
16167a8e76a3SSteven Rostedt 		delta <<= TS_SHIFT;
16177a8e76a3SSteven Rostedt 		delta += event->time_delta;
16187a8e76a3SSteven Rostedt 		cpu_buffer->read_stamp += delta;
16197a8e76a3SSteven Rostedt 		return;
16207a8e76a3SSteven Rostedt 
16217a8e76a3SSteven Rostedt 	case RINGBUF_TYPE_TIME_STAMP:
16227a8e76a3SSteven Rostedt 		/* FIXME: not implemented */
16237a8e76a3SSteven Rostedt 		return;
16247a8e76a3SSteven Rostedt 
16257a8e76a3SSteven Rostedt 	case RINGBUF_TYPE_DATA:
16267a8e76a3SSteven Rostedt 		cpu_buffer->read_stamp += event->time_delta;
16277a8e76a3SSteven Rostedt 		return;
16287a8e76a3SSteven Rostedt 
16297a8e76a3SSteven Rostedt 	default:
16307a8e76a3SSteven Rostedt 		BUG();
16317a8e76a3SSteven Rostedt 	}
16327a8e76a3SSteven Rostedt 	return;
16337a8e76a3SSteven Rostedt }
16347a8e76a3SSteven Rostedt 
16357a8e76a3SSteven Rostedt static void
16367a8e76a3SSteven Rostedt rb_update_iter_read_stamp(struct ring_buffer_iter *iter,
16377a8e76a3SSteven Rostedt 			  struct ring_buffer_event *event)
16387a8e76a3SSteven Rostedt {
16397a8e76a3SSteven Rostedt 	u64 delta;
16407a8e76a3SSteven Rostedt 
16417a8e76a3SSteven Rostedt 	switch (event->type) {
16427a8e76a3SSteven Rostedt 	case RINGBUF_TYPE_PADDING:
16437a8e76a3SSteven Rostedt 		return;
16447a8e76a3SSteven Rostedt 
16457a8e76a3SSteven Rostedt 	case RINGBUF_TYPE_TIME_EXTEND:
16467a8e76a3SSteven Rostedt 		delta = event->array[0];
16477a8e76a3SSteven Rostedt 		delta <<= TS_SHIFT;
16487a8e76a3SSteven Rostedt 		delta += event->time_delta;
16497a8e76a3SSteven Rostedt 		iter->read_stamp += delta;
16507a8e76a3SSteven Rostedt 		return;
16517a8e76a3SSteven Rostedt 
16527a8e76a3SSteven Rostedt 	case RINGBUF_TYPE_TIME_STAMP:
16537a8e76a3SSteven Rostedt 		/* FIXME: not implemented */
16547a8e76a3SSteven Rostedt 		return;
16557a8e76a3SSteven Rostedt 
16567a8e76a3SSteven Rostedt 	case RINGBUF_TYPE_DATA:
16577a8e76a3SSteven Rostedt 		iter->read_stamp += event->time_delta;
16587a8e76a3SSteven Rostedt 		return;
16597a8e76a3SSteven Rostedt 
16607a8e76a3SSteven Rostedt 	default:
16617a8e76a3SSteven Rostedt 		BUG();
16627a8e76a3SSteven Rostedt 	}
16637a8e76a3SSteven Rostedt 	return;
16647a8e76a3SSteven Rostedt }
16657a8e76a3SSteven Rostedt 
1666d769041fSSteven Rostedt static struct buffer_page *
1667d769041fSSteven Rostedt rb_get_reader_page(struct ring_buffer_per_cpu *cpu_buffer)
16687a8e76a3SSteven Rostedt {
1669d769041fSSteven Rostedt 	struct buffer_page *reader = NULL;
1670d769041fSSteven Rostedt 	unsigned long flags;
1671818e3dd3SSteven Rostedt 	int nr_loops = 0;
1672d769041fSSteven Rostedt 
16733e03fb7fSSteven Rostedt 	local_irq_save(flags);
16743e03fb7fSSteven Rostedt 	__raw_spin_lock(&cpu_buffer->lock);
1675d769041fSSteven Rostedt 
1676d769041fSSteven Rostedt  again:
1677818e3dd3SSteven Rostedt 	/*
1678818e3dd3SSteven Rostedt 	 * This should normally only loop twice. But because the
1679818e3dd3SSteven Rostedt 	 * start of the reader inserts an empty page, it causes
1680818e3dd3SSteven Rostedt 	 * a case where we will loop three times. There should be no
1681818e3dd3SSteven Rostedt 	 * reason to loop four times (that I know of).
1682818e3dd3SSteven Rostedt 	 */
16833e89c7bbSSteven Rostedt 	if (RB_WARN_ON(cpu_buffer, ++nr_loops > 3)) {
1684818e3dd3SSteven Rostedt 		reader = NULL;
1685818e3dd3SSteven Rostedt 		goto out;
1686818e3dd3SSteven Rostedt 	}
1687818e3dd3SSteven Rostedt 
1688d769041fSSteven Rostedt 	reader = cpu_buffer->reader_page;
1689d769041fSSteven Rostedt 
1690d769041fSSteven Rostedt 	/* If there's more to read, return this page */
1691bf41a158SSteven Rostedt 	if (cpu_buffer->reader_page->read < rb_page_size(reader))
1692d769041fSSteven Rostedt 		goto out;
1693d769041fSSteven Rostedt 
1694d769041fSSteven Rostedt 	/* Never should we have an index greater than the size */
16953e89c7bbSSteven Rostedt 	if (RB_WARN_ON(cpu_buffer,
16963e89c7bbSSteven Rostedt 		       cpu_buffer->reader_page->read > rb_page_size(reader)))
16973e89c7bbSSteven Rostedt 		goto out;
1698d769041fSSteven Rostedt 
1699d769041fSSteven Rostedt 	/* check if we caught up to the tail */
1700d769041fSSteven Rostedt 	reader = NULL;
1701bf41a158SSteven Rostedt 	if (cpu_buffer->commit_page == cpu_buffer->reader_page)
1702d769041fSSteven Rostedt 		goto out;
17037a8e76a3SSteven Rostedt 
17047a8e76a3SSteven Rostedt 	/*
1705d769041fSSteven Rostedt 	 * Splice the empty reader page into the list around the head.
1706d769041fSSteven Rostedt 	 * Reset the reader page to size zero.
17077a8e76a3SSteven Rostedt 	 */
1708d769041fSSteven Rostedt 
1709d769041fSSteven Rostedt 	reader = cpu_buffer->head_page;
1710d769041fSSteven Rostedt 	cpu_buffer->reader_page->list.next = reader->list.next;
1711d769041fSSteven Rostedt 	cpu_buffer->reader_page->list.prev = reader->list.prev;
1712bf41a158SSteven Rostedt 
1713bf41a158SSteven Rostedt 	local_set(&cpu_buffer->reader_page->write, 0);
1714abc9b56dSSteven Rostedt 	local_set(&cpu_buffer->reader_page->page->commit, 0);
1715d769041fSSteven Rostedt 
1716d769041fSSteven Rostedt 	/* Make the reader page now replace the head */
1717d769041fSSteven Rostedt 	reader->list.prev->next = &cpu_buffer->reader_page->list;
1718d769041fSSteven Rostedt 	reader->list.next->prev = &cpu_buffer->reader_page->list;
1719d769041fSSteven Rostedt 
1720d769041fSSteven Rostedt 	/*
1721d769041fSSteven Rostedt 	 * If the tail is on the reader, then we must set the head
1722d769041fSSteven Rostedt 	 * to the inserted page, otherwise we set it one before.
1723d769041fSSteven Rostedt 	 */
1724d769041fSSteven Rostedt 	cpu_buffer->head_page = cpu_buffer->reader_page;
1725d769041fSSteven Rostedt 
1726bf41a158SSteven Rostedt 	if (cpu_buffer->commit_page != reader)
17277a8e76a3SSteven Rostedt 		rb_inc_page(cpu_buffer, &cpu_buffer->head_page);
1728d769041fSSteven Rostedt 
1729d769041fSSteven Rostedt 	/* Finally update the reader page to the new head */
1730d769041fSSteven Rostedt 	cpu_buffer->reader_page = reader;
1731d769041fSSteven Rostedt 	rb_reset_reader_page(cpu_buffer);
1732d769041fSSteven Rostedt 
1733d769041fSSteven Rostedt 	goto again;
1734d769041fSSteven Rostedt 
1735d769041fSSteven Rostedt  out:
17363e03fb7fSSteven Rostedt 	__raw_spin_unlock(&cpu_buffer->lock);
17373e03fb7fSSteven Rostedt 	local_irq_restore(flags);
1738d769041fSSteven Rostedt 
1739d769041fSSteven Rostedt 	return reader;
17407a8e76a3SSteven Rostedt }
17417a8e76a3SSteven Rostedt 
1742d769041fSSteven Rostedt static void rb_advance_reader(struct ring_buffer_per_cpu *cpu_buffer)
1743d769041fSSteven Rostedt {
1744d769041fSSteven Rostedt 	struct ring_buffer_event *event;
1745d769041fSSteven Rostedt 	struct buffer_page *reader;
1746d769041fSSteven Rostedt 	unsigned length;
1747d769041fSSteven Rostedt 
1748d769041fSSteven Rostedt 	reader = rb_get_reader_page(cpu_buffer);
1749d769041fSSteven Rostedt 
1750d769041fSSteven Rostedt 	/* This function should not be called when buffer is empty */
17513e89c7bbSSteven Rostedt 	if (RB_WARN_ON(cpu_buffer, !reader))
17523e89c7bbSSteven Rostedt 		return;
1753d769041fSSteven Rostedt 
1754d769041fSSteven Rostedt 	event = rb_reader_event(cpu_buffer);
17557a8e76a3SSteven Rostedt 
17567a8e76a3SSteven Rostedt 	if (event->type == RINGBUF_TYPE_DATA)
17577a8e76a3SSteven Rostedt 		cpu_buffer->entries--;
17587a8e76a3SSteven Rostedt 
17597a8e76a3SSteven Rostedt 	rb_update_read_stamp(cpu_buffer, event);
17607a8e76a3SSteven Rostedt 
1761d769041fSSteven Rostedt 	length = rb_event_length(event);
17626f807acdSSteven Rostedt 	cpu_buffer->reader_page->read += length;
17637a8e76a3SSteven Rostedt }
17647a8e76a3SSteven Rostedt 
17657a8e76a3SSteven Rostedt static void rb_advance_iter(struct ring_buffer_iter *iter)
17667a8e76a3SSteven Rostedt {
17677a8e76a3SSteven Rostedt 	struct ring_buffer *buffer;
17687a8e76a3SSteven Rostedt 	struct ring_buffer_per_cpu *cpu_buffer;
17697a8e76a3SSteven Rostedt 	struct ring_buffer_event *event;
17707a8e76a3SSteven Rostedt 	unsigned length;
17717a8e76a3SSteven Rostedt 
17727a8e76a3SSteven Rostedt 	cpu_buffer = iter->cpu_buffer;
17737a8e76a3SSteven Rostedt 	buffer = cpu_buffer->buffer;
17747a8e76a3SSteven Rostedt 
17757a8e76a3SSteven Rostedt 	/*
17767a8e76a3SSteven Rostedt 	 * Check if we are at the end of the buffer.
17777a8e76a3SSteven Rostedt 	 */
1778bf41a158SSteven Rostedt 	if (iter->head >= rb_page_size(iter->head_page)) {
17793e89c7bbSSteven Rostedt 		if (RB_WARN_ON(buffer,
17803e89c7bbSSteven Rostedt 			       iter->head_page == cpu_buffer->commit_page))
17813e89c7bbSSteven Rostedt 			return;
1782d769041fSSteven Rostedt 		rb_inc_iter(iter);
17837a8e76a3SSteven Rostedt 		return;
17847a8e76a3SSteven Rostedt 	}
17857a8e76a3SSteven Rostedt 
17867a8e76a3SSteven Rostedt 	event = rb_iter_head_event(iter);
17877a8e76a3SSteven Rostedt 
17887a8e76a3SSteven Rostedt 	length = rb_event_length(event);
17897a8e76a3SSteven Rostedt 
17907a8e76a3SSteven Rostedt 	/*
17917a8e76a3SSteven Rostedt 	 * This should not be called to advance the header if we are
17927a8e76a3SSteven Rostedt 	 * at the tail of the buffer.
17937a8e76a3SSteven Rostedt 	 */
17943e89c7bbSSteven Rostedt 	if (RB_WARN_ON(cpu_buffer,
1795f536aafcSSteven Rostedt 		       (iter->head_page == cpu_buffer->commit_page) &&
17963e89c7bbSSteven Rostedt 		       (iter->head + length > rb_commit_index(cpu_buffer))))
17973e89c7bbSSteven Rostedt 		return;
17987a8e76a3SSteven Rostedt 
17997a8e76a3SSteven Rostedt 	rb_update_iter_read_stamp(iter, event);
18007a8e76a3SSteven Rostedt 
18017a8e76a3SSteven Rostedt 	iter->head += length;
18027a8e76a3SSteven Rostedt 
18037a8e76a3SSteven Rostedt 	/* check for end of page padding */
1804bf41a158SSteven Rostedt 	if ((iter->head >= rb_page_size(iter->head_page)) &&
1805bf41a158SSteven Rostedt 	    (iter->head_page != cpu_buffer->commit_page))
18067a8e76a3SSteven Rostedt 		rb_advance_iter(iter);
18077a8e76a3SSteven Rostedt }
18087a8e76a3SSteven Rostedt 
1809f83c9d0fSSteven Rostedt static struct ring_buffer_event *
1810f83c9d0fSSteven Rostedt rb_buffer_peek(struct ring_buffer *buffer, int cpu, u64 *ts)
18117a8e76a3SSteven Rostedt {
18127a8e76a3SSteven Rostedt 	struct ring_buffer_per_cpu *cpu_buffer;
18137a8e76a3SSteven Rostedt 	struct ring_buffer_event *event;
1814d769041fSSteven Rostedt 	struct buffer_page *reader;
1815818e3dd3SSteven Rostedt 	int nr_loops = 0;
18167a8e76a3SSteven Rostedt 
18177a8e76a3SSteven Rostedt 	if (!cpu_isset(cpu, buffer->cpumask))
18187a8e76a3SSteven Rostedt 		return NULL;
18197a8e76a3SSteven Rostedt 
18207a8e76a3SSteven Rostedt 	cpu_buffer = buffer->buffers[cpu];
18217a8e76a3SSteven Rostedt 
18227a8e76a3SSteven Rostedt  again:
1823818e3dd3SSteven Rostedt 	/*
1824818e3dd3SSteven Rostedt 	 * We repeat when a timestamp is encountered. It is possible
1825818e3dd3SSteven Rostedt 	 * to get multiple timestamps from an interrupt entering just
1826818e3dd3SSteven Rostedt 	 * as one timestamp is about to be written. The max times
1827818e3dd3SSteven Rostedt 	 * that this can happen is the number of nested interrupts we
1828818e3dd3SSteven Rostedt 	 * can have.  Nesting 10 deep of interrupts is clearly
1829818e3dd3SSteven Rostedt 	 * an anomaly.
1830818e3dd3SSteven Rostedt 	 */
18313e89c7bbSSteven Rostedt 	if (RB_WARN_ON(cpu_buffer, ++nr_loops > 10))
1832818e3dd3SSteven Rostedt 		return NULL;
1833818e3dd3SSteven Rostedt 
1834d769041fSSteven Rostedt 	reader = rb_get_reader_page(cpu_buffer);
1835d769041fSSteven Rostedt 	if (!reader)
18367a8e76a3SSteven Rostedt 		return NULL;
18377a8e76a3SSteven Rostedt 
1838d769041fSSteven Rostedt 	event = rb_reader_event(cpu_buffer);
18397a8e76a3SSteven Rostedt 
18407a8e76a3SSteven Rostedt 	switch (event->type) {
18417a8e76a3SSteven Rostedt 	case RINGBUF_TYPE_PADDING:
1842bf41a158SSteven Rostedt 		RB_WARN_ON(cpu_buffer, 1);
1843d769041fSSteven Rostedt 		rb_advance_reader(cpu_buffer);
1844d769041fSSteven Rostedt 		return NULL;
18457a8e76a3SSteven Rostedt 
18467a8e76a3SSteven Rostedt 	case RINGBUF_TYPE_TIME_EXTEND:
18477a8e76a3SSteven Rostedt 		/* Internal data, OK to advance */
1848d769041fSSteven Rostedt 		rb_advance_reader(cpu_buffer);
18497a8e76a3SSteven Rostedt 		goto again;
18507a8e76a3SSteven Rostedt 
18517a8e76a3SSteven Rostedt 	case RINGBUF_TYPE_TIME_STAMP:
18527a8e76a3SSteven Rostedt 		/* FIXME: not implemented */
1853d769041fSSteven Rostedt 		rb_advance_reader(cpu_buffer);
18547a8e76a3SSteven Rostedt 		goto again;
18557a8e76a3SSteven Rostedt 
18567a8e76a3SSteven Rostedt 	case RINGBUF_TYPE_DATA:
18577a8e76a3SSteven Rostedt 		if (ts) {
18587a8e76a3SSteven Rostedt 			*ts = cpu_buffer->read_stamp + event->time_delta;
18597a8e76a3SSteven Rostedt 			ring_buffer_normalize_time_stamp(cpu_buffer->cpu, ts);
18607a8e76a3SSteven Rostedt 		}
18617a8e76a3SSteven Rostedt 		return event;
18627a8e76a3SSteven Rostedt 
18637a8e76a3SSteven Rostedt 	default:
18647a8e76a3SSteven Rostedt 		BUG();
18657a8e76a3SSteven Rostedt 	}
18667a8e76a3SSteven Rostedt 
18677a8e76a3SSteven Rostedt 	return NULL;
18687a8e76a3SSteven Rostedt }
18697a8e76a3SSteven Rostedt 
1870f83c9d0fSSteven Rostedt static struct ring_buffer_event *
1871f83c9d0fSSteven Rostedt rb_iter_peek(struct ring_buffer_iter *iter, u64 *ts)
18727a8e76a3SSteven Rostedt {
18737a8e76a3SSteven Rostedt 	struct ring_buffer *buffer;
18747a8e76a3SSteven Rostedt 	struct ring_buffer_per_cpu *cpu_buffer;
18757a8e76a3SSteven Rostedt 	struct ring_buffer_event *event;
1876818e3dd3SSteven Rostedt 	int nr_loops = 0;
18777a8e76a3SSteven Rostedt 
18787a8e76a3SSteven Rostedt 	if (ring_buffer_iter_empty(iter))
18797a8e76a3SSteven Rostedt 		return NULL;
18807a8e76a3SSteven Rostedt 
18817a8e76a3SSteven Rostedt 	cpu_buffer = iter->cpu_buffer;
18827a8e76a3SSteven Rostedt 	buffer = cpu_buffer->buffer;
18837a8e76a3SSteven Rostedt 
18847a8e76a3SSteven Rostedt  again:
1885818e3dd3SSteven Rostedt 	/*
1886818e3dd3SSteven Rostedt 	 * We repeat when a timestamp is encountered. It is possible
1887818e3dd3SSteven Rostedt 	 * to get multiple timestamps from an interrupt entering just
1888818e3dd3SSteven Rostedt 	 * as one timestamp is about to be written. The max times
1889818e3dd3SSteven Rostedt 	 * that this can happen is the number of nested interrupts we
1890818e3dd3SSteven Rostedt 	 * can have. Nesting 10 deep of interrupts is clearly
1891818e3dd3SSteven Rostedt 	 * an anomaly.
1892818e3dd3SSteven Rostedt 	 */
18933e89c7bbSSteven Rostedt 	if (RB_WARN_ON(cpu_buffer, ++nr_loops > 10))
1894818e3dd3SSteven Rostedt 		return NULL;
1895818e3dd3SSteven Rostedt 
18967a8e76a3SSteven Rostedt 	if (rb_per_cpu_empty(cpu_buffer))
18977a8e76a3SSteven Rostedt 		return NULL;
18987a8e76a3SSteven Rostedt 
18997a8e76a3SSteven Rostedt 	event = rb_iter_head_event(iter);
19007a8e76a3SSteven Rostedt 
19017a8e76a3SSteven Rostedt 	switch (event->type) {
19027a8e76a3SSteven Rostedt 	case RINGBUF_TYPE_PADDING:
1903d769041fSSteven Rostedt 		rb_inc_iter(iter);
19047a8e76a3SSteven Rostedt 		goto again;
19057a8e76a3SSteven Rostedt 
19067a8e76a3SSteven Rostedt 	case RINGBUF_TYPE_TIME_EXTEND:
19077a8e76a3SSteven Rostedt 		/* Internal data, OK to advance */
19087a8e76a3SSteven Rostedt 		rb_advance_iter(iter);
19097a8e76a3SSteven Rostedt 		goto again;
19107a8e76a3SSteven Rostedt 
19117a8e76a3SSteven Rostedt 	case RINGBUF_TYPE_TIME_STAMP:
19127a8e76a3SSteven Rostedt 		/* FIXME: not implemented */
19137a8e76a3SSteven Rostedt 		rb_advance_iter(iter);
19147a8e76a3SSteven Rostedt 		goto again;
19157a8e76a3SSteven Rostedt 
19167a8e76a3SSteven Rostedt 	case RINGBUF_TYPE_DATA:
19177a8e76a3SSteven Rostedt 		if (ts) {
19187a8e76a3SSteven Rostedt 			*ts = iter->read_stamp + event->time_delta;
19197a8e76a3SSteven Rostedt 			ring_buffer_normalize_time_stamp(cpu_buffer->cpu, ts);
19207a8e76a3SSteven Rostedt 		}
19217a8e76a3SSteven Rostedt 		return event;
19227a8e76a3SSteven Rostedt 
19237a8e76a3SSteven Rostedt 	default:
19247a8e76a3SSteven Rostedt 		BUG();
19257a8e76a3SSteven Rostedt 	}
19267a8e76a3SSteven Rostedt 
19277a8e76a3SSteven Rostedt 	return NULL;
19287a8e76a3SSteven Rostedt }
19297a8e76a3SSteven Rostedt 
19307a8e76a3SSteven Rostedt /**
1931f83c9d0fSSteven Rostedt  * ring_buffer_peek - peek at the next event to be read
1932f83c9d0fSSteven Rostedt  * @buffer: The ring buffer to read
1933f83c9d0fSSteven Rostedt  * @cpu: The cpu to peak at
1934f83c9d0fSSteven Rostedt  * @ts: The timestamp counter of this event.
1935f83c9d0fSSteven Rostedt  *
1936f83c9d0fSSteven Rostedt  * This will return the event that will be read next, but does
1937f83c9d0fSSteven Rostedt  * not consume the data.
1938f83c9d0fSSteven Rostedt  */
1939f83c9d0fSSteven Rostedt struct ring_buffer_event *
1940f83c9d0fSSteven Rostedt ring_buffer_peek(struct ring_buffer *buffer, int cpu, u64 *ts)
1941f83c9d0fSSteven Rostedt {
1942f83c9d0fSSteven Rostedt 	struct ring_buffer_per_cpu *cpu_buffer = buffer->buffers[cpu];
1943f83c9d0fSSteven Rostedt 	struct ring_buffer_event *event;
1944f83c9d0fSSteven Rostedt 	unsigned long flags;
1945f83c9d0fSSteven Rostedt 
1946f83c9d0fSSteven Rostedt 	spin_lock_irqsave(&cpu_buffer->reader_lock, flags);
1947f83c9d0fSSteven Rostedt 	event = rb_buffer_peek(buffer, cpu, ts);
1948f83c9d0fSSteven Rostedt 	spin_unlock_irqrestore(&cpu_buffer->reader_lock, flags);
1949f83c9d0fSSteven Rostedt 
1950f83c9d0fSSteven Rostedt 	return event;
1951f83c9d0fSSteven Rostedt }
1952f83c9d0fSSteven Rostedt 
1953f83c9d0fSSteven Rostedt /**
1954f83c9d0fSSteven Rostedt  * ring_buffer_iter_peek - peek at the next event to be read
1955f83c9d0fSSteven Rostedt  * @iter: The ring buffer iterator
1956f83c9d0fSSteven Rostedt  * @ts: The timestamp counter of this event.
1957f83c9d0fSSteven Rostedt  *
1958f83c9d0fSSteven Rostedt  * This will return the event that will be read next, but does
1959f83c9d0fSSteven Rostedt  * not increment the iterator.
1960f83c9d0fSSteven Rostedt  */
1961f83c9d0fSSteven Rostedt struct ring_buffer_event *
1962f83c9d0fSSteven Rostedt ring_buffer_iter_peek(struct ring_buffer_iter *iter, u64 *ts)
1963f83c9d0fSSteven Rostedt {
1964f83c9d0fSSteven Rostedt 	struct ring_buffer_per_cpu *cpu_buffer = iter->cpu_buffer;
1965f83c9d0fSSteven Rostedt 	struct ring_buffer_event *event;
1966f83c9d0fSSteven Rostedt 	unsigned long flags;
1967f83c9d0fSSteven Rostedt 
1968f83c9d0fSSteven Rostedt 	spin_lock_irqsave(&cpu_buffer->reader_lock, flags);
1969f83c9d0fSSteven Rostedt 	event = rb_iter_peek(iter, ts);
1970f83c9d0fSSteven Rostedt 	spin_unlock_irqrestore(&cpu_buffer->reader_lock, flags);
1971f83c9d0fSSteven Rostedt 
1972f83c9d0fSSteven Rostedt 	return event;
1973f83c9d0fSSteven Rostedt }
1974f83c9d0fSSteven Rostedt 
1975f83c9d0fSSteven Rostedt /**
19767a8e76a3SSteven Rostedt  * ring_buffer_consume - return an event and consume it
19777a8e76a3SSteven Rostedt  * @buffer: The ring buffer to get the next event from
19787a8e76a3SSteven Rostedt  *
19797a8e76a3SSteven Rostedt  * Returns the next event in the ring buffer, and that event is consumed.
19807a8e76a3SSteven Rostedt  * Meaning, that sequential reads will keep returning a different event,
19817a8e76a3SSteven Rostedt  * and eventually empty the ring buffer if the producer is slower.
19827a8e76a3SSteven Rostedt  */
19837a8e76a3SSteven Rostedt struct ring_buffer_event *
19847a8e76a3SSteven Rostedt ring_buffer_consume(struct ring_buffer *buffer, int cpu, u64 *ts)
19857a8e76a3SSteven Rostedt {
1986f83c9d0fSSteven Rostedt 	struct ring_buffer_per_cpu *cpu_buffer = buffer->buffers[cpu];
19877a8e76a3SSteven Rostedt 	struct ring_buffer_event *event;
1988f83c9d0fSSteven Rostedt 	unsigned long flags;
19897a8e76a3SSteven Rostedt 
19907a8e76a3SSteven Rostedt 	if (!cpu_isset(cpu, buffer->cpumask))
19917a8e76a3SSteven Rostedt 		return NULL;
19927a8e76a3SSteven Rostedt 
1993f83c9d0fSSteven Rostedt 	spin_lock_irqsave(&cpu_buffer->reader_lock, flags);
19947a8e76a3SSteven Rostedt 
1995f83c9d0fSSteven Rostedt 	event = rb_buffer_peek(buffer, cpu, ts);
1996f83c9d0fSSteven Rostedt 	if (!event)
1997f83c9d0fSSteven Rostedt 		goto out;
1998f83c9d0fSSteven Rostedt 
1999d769041fSSteven Rostedt 	rb_advance_reader(cpu_buffer);
20007a8e76a3SSteven Rostedt 
2001f83c9d0fSSteven Rostedt  out:
2002f83c9d0fSSteven Rostedt 	spin_unlock_irqrestore(&cpu_buffer->reader_lock, flags);
2003f83c9d0fSSteven Rostedt 
20047a8e76a3SSteven Rostedt 	return event;
20057a8e76a3SSteven Rostedt }
20067a8e76a3SSteven Rostedt 
20077a8e76a3SSteven Rostedt /**
20087a8e76a3SSteven Rostedt  * ring_buffer_read_start - start a non consuming read of the buffer
20097a8e76a3SSteven Rostedt  * @buffer: The ring buffer to read from
20107a8e76a3SSteven Rostedt  * @cpu: The cpu buffer to iterate over
20117a8e76a3SSteven Rostedt  *
20127a8e76a3SSteven Rostedt  * This starts up an iteration through the buffer. It also disables
20137a8e76a3SSteven Rostedt  * the recording to the buffer until the reading is finished.
20147a8e76a3SSteven Rostedt  * This prevents the reading from being corrupted. This is not
20157a8e76a3SSteven Rostedt  * a consuming read, so a producer is not expected.
20167a8e76a3SSteven Rostedt  *
20177a8e76a3SSteven Rostedt  * Must be paired with ring_buffer_finish.
20187a8e76a3SSteven Rostedt  */
20197a8e76a3SSteven Rostedt struct ring_buffer_iter *
20207a8e76a3SSteven Rostedt ring_buffer_read_start(struct ring_buffer *buffer, int cpu)
20217a8e76a3SSteven Rostedt {
20227a8e76a3SSteven Rostedt 	struct ring_buffer_per_cpu *cpu_buffer;
20237a8e76a3SSteven Rostedt 	struct ring_buffer_iter *iter;
2024d769041fSSteven Rostedt 	unsigned long flags;
20257a8e76a3SSteven Rostedt 
20267a8e76a3SSteven Rostedt 	if (!cpu_isset(cpu, buffer->cpumask))
20277a8e76a3SSteven Rostedt 		return NULL;
20287a8e76a3SSteven Rostedt 
20297a8e76a3SSteven Rostedt 	iter = kmalloc(sizeof(*iter), GFP_KERNEL);
20307a8e76a3SSteven Rostedt 	if (!iter)
20317a8e76a3SSteven Rostedt 		return NULL;
20327a8e76a3SSteven Rostedt 
20337a8e76a3SSteven Rostedt 	cpu_buffer = buffer->buffers[cpu];
20347a8e76a3SSteven Rostedt 
20357a8e76a3SSteven Rostedt 	iter->cpu_buffer = cpu_buffer;
20367a8e76a3SSteven Rostedt 
20377a8e76a3SSteven Rostedt 	atomic_inc(&cpu_buffer->record_disabled);
20387a8e76a3SSteven Rostedt 	synchronize_sched();
20397a8e76a3SSteven Rostedt 
2040f83c9d0fSSteven Rostedt 	spin_lock_irqsave(&cpu_buffer->reader_lock, flags);
20413e03fb7fSSteven Rostedt 	__raw_spin_lock(&cpu_buffer->lock);
2042642edba5SSteven Rostedt 	rb_iter_reset(iter);
20433e03fb7fSSteven Rostedt 	__raw_spin_unlock(&cpu_buffer->lock);
2044f83c9d0fSSteven Rostedt 	spin_unlock_irqrestore(&cpu_buffer->reader_lock, flags);
20457a8e76a3SSteven Rostedt 
20467a8e76a3SSteven Rostedt 	return iter;
20477a8e76a3SSteven Rostedt }
20487a8e76a3SSteven Rostedt 
20497a8e76a3SSteven Rostedt /**
20507a8e76a3SSteven Rostedt  * ring_buffer_finish - finish reading the iterator of the buffer
20517a8e76a3SSteven Rostedt  * @iter: The iterator retrieved by ring_buffer_start
20527a8e76a3SSteven Rostedt  *
20537a8e76a3SSteven Rostedt  * This re-enables the recording to the buffer, and frees the
20547a8e76a3SSteven Rostedt  * iterator.
20557a8e76a3SSteven Rostedt  */
20567a8e76a3SSteven Rostedt void
20577a8e76a3SSteven Rostedt ring_buffer_read_finish(struct ring_buffer_iter *iter)
20587a8e76a3SSteven Rostedt {
20597a8e76a3SSteven Rostedt 	struct ring_buffer_per_cpu *cpu_buffer = iter->cpu_buffer;
20607a8e76a3SSteven Rostedt 
20617a8e76a3SSteven Rostedt 	atomic_dec(&cpu_buffer->record_disabled);
20627a8e76a3SSteven Rostedt 	kfree(iter);
20637a8e76a3SSteven Rostedt }
20647a8e76a3SSteven Rostedt 
20657a8e76a3SSteven Rostedt /**
20667a8e76a3SSteven Rostedt  * ring_buffer_read - read the next item in the ring buffer by the iterator
20677a8e76a3SSteven Rostedt  * @iter: The ring buffer iterator
20687a8e76a3SSteven Rostedt  * @ts: The time stamp of the event read.
20697a8e76a3SSteven Rostedt  *
20707a8e76a3SSteven Rostedt  * This reads the next event in the ring buffer and increments the iterator.
20717a8e76a3SSteven Rostedt  */
20727a8e76a3SSteven Rostedt struct ring_buffer_event *
20737a8e76a3SSteven Rostedt ring_buffer_read(struct ring_buffer_iter *iter, u64 *ts)
20747a8e76a3SSteven Rostedt {
20757a8e76a3SSteven Rostedt 	struct ring_buffer_event *event;
2076f83c9d0fSSteven Rostedt 	struct ring_buffer_per_cpu *cpu_buffer = iter->cpu_buffer;
2077f83c9d0fSSteven Rostedt 	unsigned long flags;
20787a8e76a3SSteven Rostedt 
2079f83c9d0fSSteven Rostedt 	spin_lock_irqsave(&cpu_buffer->reader_lock, flags);
2080f83c9d0fSSteven Rostedt 	event = rb_iter_peek(iter, ts);
20817a8e76a3SSteven Rostedt 	if (!event)
2082f83c9d0fSSteven Rostedt 		goto out;
20837a8e76a3SSteven Rostedt 
20847a8e76a3SSteven Rostedt 	rb_advance_iter(iter);
2085f83c9d0fSSteven Rostedt  out:
2086f83c9d0fSSteven Rostedt 	spin_unlock_irqrestore(&cpu_buffer->reader_lock, flags);
20877a8e76a3SSteven Rostedt 
20887a8e76a3SSteven Rostedt 	return event;
20897a8e76a3SSteven Rostedt }
20907a8e76a3SSteven Rostedt 
20917a8e76a3SSteven Rostedt /**
20927a8e76a3SSteven Rostedt  * ring_buffer_size - return the size of the ring buffer (in bytes)
20937a8e76a3SSteven Rostedt  * @buffer: The ring buffer.
20947a8e76a3SSteven Rostedt  */
20957a8e76a3SSteven Rostedt unsigned long ring_buffer_size(struct ring_buffer *buffer)
20967a8e76a3SSteven Rostedt {
20977a8e76a3SSteven Rostedt 	return BUF_PAGE_SIZE * buffer->pages;
20987a8e76a3SSteven Rostedt }
20997a8e76a3SSteven Rostedt 
21007a8e76a3SSteven Rostedt static void
21017a8e76a3SSteven Rostedt rb_reset_cpu(struct ring_buffer_per_cpu *cpu_buffer)
21027a8e76a3SSteven Rostedt {
21037a8e76a3SSteven Rostedt 	cpu_buffer->head_page
21047a8e76a3SSteven Rostedt 		= list_entry(cpu_buffer->pages.next, struct buffer_page, list);
2105bf41a158SSteven Rostedt 	local_set(&cpu_buffer->head_page->write, 0);
2106abc9b56dSSteven Rostedt 	local_set(&cpu_buffer->head_page->page->commit, 0);
21077a8e76a3SSteven Rostedt 
21086f807acdSSteven Rostedt 	cpu_buffer->head_page->read = 0;
2109bf41a158SSteven Rostedt 
2110bf41a158SSteven Rostedt 	cpu_buffer->tail_page = cpu_buffer->head_page;
2111bf41a158SSteven Rostedt 	cpu_buffer->commit_page = cpu_buffer->head_page;
2112bf41a158SSteven Rostedt 
2113bf41a158SSteven Rostedt 	INIT_LIST_HEAD(&cpu_buffer->reader_page->list);
2114bf41a158SSteven Rostedt 	local_set(&cpu_buffer->reader_page->write, 0);
2115abc9b56dSSteven Rostedt 	local_set(&cpu_buffer->reader_page->page->commit, 0);
21166f807acdSSteven Rostedt 	cpu_buffer->reader_page->read = 0;
2117d769041fSSteven Rostedt 
21187a8e76a3SSteven Rostedt 	cpu_buffer->overrun = 0;
21197a8e76a3SSteven Rostedt 	cpu_buffer->entries = 0;
21207a8e76a3SSteven Rostedt }
21217a8e76a3SSteven Rostedt 
21227a8e76a3SSteven Rostedt /**
21237a8e76a3SSteven Rostedt  * ring_buffer_reset_cpu - reset a ring buffer per CPU buffer
21247a8e76a3SSteven Rostedt  * @buffer: The ring buffer to reset a per cpu buffer of
21257a8e76a3SSteven Rostedt  * @cpu: The CPU buffer to be reset
21267a8e76a3SSteven Rostedt  */
21277a8e76a3SSteven Rostedt void ring_buffer_reset_cpu(struct ring_buffer *buffer, int cpu)
21287a8e76a3SSteven Rostedt {
21297a8e76a3SSteven Rostedt 	struct ring_buffer_per_cpu *cpu_buffer = buffer->buffers[cpu];
21307a8e76a3SSteven Rostedt 	unsigned long flags;
21317a8e76a3SSteven Rostedt 
21327a8e76a3SSteven Rostedt 	if (!cpu_isset(cpu, buffer->cpumask))
21337a8e76a3SSteven Rostedt 		return;
21347a8e76a3SSteven Rostedt 
2135f83c9d0fSSteven Rostedt 	spin_lock_irqsave(&cpu_buffer->reader_lock, flags);
2136f83c9d0fSSteven Rostedt 
21373e03fb7fSSteven Rostedt 	__raw_spin_lock(&cpu_buffer->lock);
21387a8e76a3SSteven Rostedt 
21397a8e76a3SSteven Rostedt 	rb_reset_cpu(cpu_buffer);
21407a8e76a3SSteven Rostedt 
21413e03fb7fSSteven Rostedt 	__raw_spin_unlock(&cpu_buffer->lock);
2142f83c9d0fSSteven Rostedt 
2143f83c9d0fSSteven Rostedt 	spin_unlock_irqrestore(&cpu_buffer->reader_lock, flags);
21447a8e76a3SSteven Rostedt }
21457a8e76a3SSteven Rostedt 
21467a8e76a3SSteven Rostedt /**
21477a8e76a3SSteven Rostedt  * ring_buffer_reset - reset a ring buffer
21487a8e76a3SSteven Rostedt  * @buffer: The ring buffer to reset all cpu buffers
21497a8e76a3SSteven Rostedt  */
21507a8e76a3SSteven Rostedt void ring_buffer_reset(struct ring_buffer *buffer)
21517a8e76a3SSteven Rostedt {
21527a8e76a3SSteven Rostedt 	int cpu;
21537a8e76a3SSteven Rostedt 
21547a8e76a3SSteven Rostedt 	for_each_buffer_cpu(buffer, cpu)
2155d769041fSSteven Rostedt 		ring_buffer_reset_cpu(buffer, cpu);
21567a8e76a3SSteven Rostedt }
21577a8e76a3SSteven Rostedt 
21587a8e76a3SSteven Rostedt /**
21597a8e76a3SSteven Rostedt  * rind_buffer_empty - is the ring buffer empty?
21607a8e76a3SSteven Rostedt  * @buffer: The ring buffer to test
21617a8e76a3SSteven Rostedt  */
21627a8e76a3SSteven Rostedt int ring_buffer_empty(struct ring_buffer *buffer)
21637a8e76a3SSteven Rostedt {
21647a8e76a3SSteven Rostedt 	struct ring_buffer_per_cpu *cpu_buffer;
21657a8e76a3SSteven Rostedt 	int cpu;
21667a8e76a3SSteven Rostedt 
21677a8e76a3SSteven Rostedt 	/* yes this is racy, but if you don't like the race, lock the buffer */
21687a8e76a3SSteven Rostedt 	for_each_buffer_cpu(buffer, cpu) {
21697a8e76a3SSteven Rostedt 		cpu_buffer = buffer->buffers[cpu];
21707a8e76a3SSteven Rostedt 		if (!rb_per_cpu_empty(cpu_buffer))
21717a8e76a3SSteven Rostedt 			return 0;
21727a8e76a3SSteven Rostedt 	}
21737a8e76a3SSteven Rostedt 	return 1;
21747a8e76a3SSteven Rostedt }
21757a8e76a3SSteven Rostedt 
21767a8e76a3SSteven Rostedt /**
21777a8e76a3SSteven Rostedt  * ring_buffer_empty_cpu - is a cpu buffer of a ring buffer empty?
21787a8e76a3SSteven Rostedt  * @buffer: The ring buffer
21797a8e76a3SSteven Rostedt  * @cpu: The CPU buffer to test
21807a8e76a3SSteven Rostedt  */
21817a8e76a3SSteven Rostedt int ring_buffer_empty_cpu(struct ring_buffer *buffer, int cpu)
21827a8e76a3SSteven Rostedt {
21837a8e76a3SSteven Rostedt 	struct ring_buffer_per_cpu *cpu_buffer;
21847a8e76a3SSteven Rostedt 
21857a8e76a3SSteven Rostedt 	if (!cpu_isset(cpu, buffer->cpumask))
21867a8e76a3SSteven Rostedt 		return 1;
21877a8e76a3SSteven Rostedt 
21887a8e76a3SSteven Rostedt 	cpu_buffer = buffer->buffers[cpu];
21897a8e76a3SSteven Rostedt 	return rb_per_cpu_empty(cpu_buffer);
21907a8e76a3SSteven Rostedt }
21917a8e76a3SSteven Rostedt 
21927a8e76a3SSteven Rostedt /**
21937a8e76a3SSteven Rostedt  * ring_buffer_swap_cpu - swap a CPU buffer between two ring buffers
21947a8e76a3SSteven Rostedt  * @buffer_a: One buffer to swap with
21957a8e76a3SSteven Rostedt  * @buffer_b: The other buffer to swap with
21967a8e76a3SSteven Rostedt  *
21977a8e76a3SSteven Rostedt  * This function is useful for tracers that want to take a "snapshot"
21987a8e76a3SSteven Rostedt  * of a CPU buffer and has another back up buffer lying around.
21997a8e76a3SSteven Rostedt  * it is expected that the tracer handles the cpu buffer not being
22007a8e76a3SSteven Rostedt  * used at the moment.
22017a8e76a3SSteven Rostedt  */
22027a8e76a3SSteven Rostedt int ring_buffer_swap_cpu(struct ring_buffer *buffer_a,
22037a8e76a3SSteven Rostedt 			 struct ring_buffer *buffer_b, int cpu)
22047a8e76a3SSteven Rostedt {
22057a8e76a3SSteven Rostedt 	struct ring_buffer_per_cpu *cpu_buffer_a;
22067a8e76a3SSteven Rostedt 	struct ring_buffer_per_cpu *cpu_buffer_b;
22077a8e76a3SSteven Rostedt 
22087a8e76a3SSteven Rostedt 	if (!cpu_isset(cpu, buffer_a->cpumask) ||
22097a8e76a3SSteven Rostedt 	    !cpu_isset(cpu, buffer_b->cpumask))
22107a8e76a3SSteven Rostedt 		return -EINVAL;
22117a8e76a3SSteven Rostedt 
22127a8e76a3SSteven Rostedt 	/* At least make sure the two buffers are somewhat the same */
22137a8e76a3SSteven Rostedt 	if (buffer_a->size != buffer_b->size ||
22147a8e76a3SSteven Rostedt 	    buffer_a->pages != buffer_b->pages)
22157a8e76a3SSteven Rostedt 		return -EINVAL;
22167a8e76a3SSteven Rostedt 
22177a8e76a3SSteven Rostedt 	cpu_buffer_a = buffer_a->buffers[cpu];
22187a8e76a3SSteven Rostedt 	cpu_buffer_b = buffer_b->buffers[cpu];
22197a8e76a3SSteven Rostedt 
22207a8e76a3SSteven Rostedt 	/*
22217a8e76a3SSteven Rostedt 	 * We can't do a synchronize_sched here because this
22227a8e76a3SSteven Rostedt 	 * function can be called in atomic context.
22237a8e76a3SSteven Rostedt 	 * Normally this will be called from the same CPU as cpu.
22247a8e76a3SSteven Rostedt 	 * If not it's up to the caller to protect this.
22257a8e76a3SSteven Rostedt 	 */
22267a8e76a3SSteven Rostedt 	atomic_inc(&cpu_buffer_a->record_disabled);
22277a8e76a3SSteven Rostedt 	atomic_inc(&cpu_buffer_b->record_disabled);
22287a8e76a3SSteven Rostedt 
22297a8e76a3SSteven Rostedt 	buffer_a->buffers[cpu] = cpu_buffer_b;
22307a8e76a3SSteven Rostedt 	buffer_b->buffers[cpu] = cpu_buffer_a;
22317a8e76a3SSteven Rostedt 
22327a8e76a3SSteven Rostedt 	cpu_buffer_b->buffer = buffer_a;
22337a8e76a3SSteven Rostedt 	cpu_buffer_a->buffer = buffer_b;
22347a8e76a3SSteven Rostedt 
22357a8e76a3SSteven Rostedt 	atomic_dec(&cpu_buffer_a->record_disabled);
22367a8e76a3SSteven Rostedt 	atomic_dec(&cpu_buffer_b->record_disabled);
22377a8e76a3SSteven Rostedt 
22387a8e76a3SSteven Rostedt 	return 0;
22397a8e76a3SSteven Rostedt }
22407a8e76a3SSteven Rostedt 
22418789a9e7SSteven Rostedt static void rb_remove_entries(struct ring_buffer_per_cpu *cpu_buffer,
2242044fa782SSteven Rostedt 			      struct buffer_data_page *bpage)
22438789a9e7SSteven Rostedt {
22448789a9e7SSteven Rostedt 	struct ring_buffer_event *event;
22458789a9e7SSteven Rostedt 	unsigned long head;
22468789a9e7SSteven Rostedt 
22478789a9e7SSteven Rostedt 	__raw_spin_lock(&cpu_buffer->lock);
2248044fa782SSteven Rostedt 	for (head = 0; head < local_read(&bpage->commit);
22498789a9e7SSteven Rostedt 	     head += rb_event_length(event)) {
22508789a9e7SSteven Rostedt 
2251044fa782SSteven Rostedt 		event = __rb_data_page_index(bpage, head);
22528789a9e7SSteven Rostedt 		if (RB_WARN_ON(cpu_buffer, rb_null_event(event)))
22538789a9e7SSteven Rostedt 			return;
22548789a9e7SSteven Rostedt 		/* Only count data entries */
22558789a9e7SSteven Rostedt 		if (event->type != RINGBUF_TYPE_DATA)
22568789a9e7SSteven Rostedt 			continue;
22578789a9e7SSteven Rostedt 		cpu_buffer->entries--;
22588789a9e7SSteven Rostedt 	}
22598789a9e7SSteven Rostedt 	__raw_spin_unlock(&cpu_buffer->lock);
22608789a9e7SSteven Rostedt }
22618789a9e7SSteven Rostedt 
22628789a9e7SSteven Rostedt /**
22638789a9e7SSteven Rostedt  * ring_buffer_alloc_read_page - allocate a page to read from buffer
22648789a9e7SSteven Rostedt  * @buffer: the buffer to allocate for.
22658789a9e7SSteven Rostedt  *
22668789a9e7SSteven Rostedt  * This function is used in conjunction with ring_buffer_read_page.
22678789a9e7SSteven Rostedt  * When reading a full page from the ring buffer, these functions
22688789a9e7SSteven Rostedt  * can be used to speed up the process. The calling function should
22698789a9e7SSteven Rostedt  * allocate a few pages first with this function. Then when it
22708789a9e7SSteven Rostedt  * needs to get pages from the ring buffer, it passes the result
22718789a9e7SSteven Rostedt  * of this function into ring_buffer_read_page, which will swap
22728789a9e7SSteven Rostedt  * the page that was allocated, with the read page of the buffer.
22738789a9e7SSteven Rostedt  *
22748789a9e7SSteven Rostedt  * Returns:
22758789a9e7SSteven Rostedt  *  The page allocated, or NULL on error.
22768789a9e7SSteven Rostedt  */
22778789a9e7SSteven Rostedt void *ring_buffer_alloc_read_page(struct ring_buffer *buffer)
22788789a9e7SSteven Rostedt {
22798789a9e7SSteven Rostedt 	unsigned long addr;
2280044fa782SSteven Rostedt 	struct buffer_data_page *bpage;
22818789a9e7SSteven Rostedt 
22828789a9e7SSteven Rostedt 	addr = __get_free_page(GFP_KERNEL);
22838789a9e7SSteven Rostedt 	if (!addr)
22848789a9e7SSteven Rostedt 		return NULL;
22858789a9e7SSteven Rostedt 
2286044fa782SSteven Rostedt 	bpage = (void *)addr;
22878789a9e7SSteven Rostedt 
2288044fa782SSteven Rostedt 	return bpage;
22898789a9e7SSteven Rostedt }
22908789a9e7SSteven Rostedt 
22918789a9e7SSteven Rostedt /**
22928789a9e7SSteven Rostedt  * ring_buffer_free_read_page - free an allocated read page
22938789a9e7SSteven Rostedt  * @buffer: the buffer the page was allocate for
22948789a9e7SSteven Rostedt  * @data: the page to free
22958789a9e7SSteven Rostedt  *
22968789a9e7SSteven Rostedt  * Free a page allocated from ring_buffer_alloc_read_page.
22978789a9e7SSteven Rostedt  */
22988789a9e7SSteven Rostedt void ring_buffer_free_read_page(struct ring_buffer *buffer, void *data)
22998789a9e7SSteven Rostedt {
23008789a9e7SSteven Rostedt 	free_page((unsigned long)data);
23018789a9e7SSteven Rostedt }
23028789a9e7SSteven Rostedt 
23038789a9e7SSteven Rostedt /**
23048789a9e7SSteven Rostedt  * ring_buffer_read_page - extract a page from the ring buffer
23058789a9e7SSteven Rostedt  * @buffer: buffer to extract from
23068789a9e7SSteven Rostedt  * @data_page: the page to use allocated from ring_buffer_alloc_read_page
23078789a9e7SSteven Rostedt  * @cpu: the cpu of the buffer to extract
23088789a9e7SSteven Rostedt  * @full: should the extraction only happen when the page is full.
23098789a9e7SSteven Rostedt  *
23108789a9e7SSteven Rostedt  * This function will pull out a page from the ring buffer and consume it.
23118789a9e7SSteven Rostedt  * @data_page must be the address of the variable that was returned
23128789a9e7SSteven Rostedt  * from ring_buffer_alloc_read_page. This is because the page might be used
23138789a9e7SSteven Rostedt  * to swap with a page in the ring buffer.
23148789a9e7SSteven Rostedt  *
23158789a9e7SSteven Rostedt  * for example:
23168789a9e7SSteven Rostedt  *	rpage = ring_buffer_alloc_page(buffer);
23178789a9e7SSteven Rostedt  *	if (!rpage)
23188789a9e7SSteven Rostedt  *		return error;
23198789a9e7SSteven Rostedt  *	ret = ring_buffer_read_page(buffer, &rpage, cpu, 0);
23208789a9e7SSteven Rostedt  *	if (ret)
23218789a9e7SSteven Rostedt  *		process_page(rpage);
23228789a9e7SSteven Rostedt  *
23238789a9e7SSteven Rostedt  * When @full is set, the function will not return true unless
23248789a9e7SSteven Rostedt  * the writer is off the reader page.
23258789a9e7SSteven Rostedt  *
23268789a9e7SSteven Rostedt  * Note: it is up to the calling functions to handle sleeps and wakeups.
23278789a9e7SSteven Rostedt  *  The ring buffer can be used anywhere in the kernel and can not
23288789a9e7SSteven Rostedt  *  blindly call wake_up. The layer that uses the ring buffer must be
23298789a9e7SSteven Rostedt  *  responsible for that.
23308789a9e7SSteven Rostedt  *
23318789a9e7SSteven Rostedt  * Returns:
23328789a9e7SSteven Rostedt  *  1 if data has been transferred
23338789a9e7SSteven Rostedt  *  0 if no data has been transferred.
23348789a9e7SSteven Rostedt  */
23358789a9e7SSteven Rostedt int ring_buffer_read_page(struct ring_buffer *buffer,
23368789a9e7SSteven Rostedt 			    void **data_page, int cpu, int full)
23378789a9e7SSteven Rostedt {
23388789a9e7SSteven Rostedt 	struct ring_buffer_per_cpu *cpu_buffer = buffer->buffers[cpu];
23398789a9e7SSteven Rostedt 	struct ring_buffer_event *event;
2340044fa782SSteven Rostedt 	struct buffer_data_page *bpage;
23418789a9e7SSteven Rostedt 	unsigned long flags;
23428789a9e7SSteven Rostedt 	int ret = 0;
23438789a9e7SSteven Rostedt 
23448789a9e7SSteven Rostedt 	if (!data_page)
23458789a9e7SSteven Rostedt 		return 0;
23468789a9e7SSteven Rostedt 
2347044fa782SSteven Rostedt 	bpage = *data_page;
2348044fa782SSteven Rostedt 	if (!bpage)
23498789a9e7SSteven Rostedt 		return 0;
23508789a9e7SSteven Rostedt 
23518789a9e7SSteven Rostedt 	spin_lock_irqsave(&cpu_buffer->reader_lock, flags);
23528789a9e7SSteven Rostedt 
23538789a9e7SSteven Rostedt 	/*
23548789a9e7SSteven Rostedt 	 * rb_buffer_peek will get the next ring buffer if
23558789a9e7SSteven Rostedt 	 * the current reader page is empty.
23568789a9e7SSteven Rostedt 	 */
23578789a9e7SSteven Rostedt 	event = rb_buffer_peek(buffer, cpu, NULL);
23588789a9e7SSteven Rostedt 	if (!event)
23598789a9e7SSteven Rostedt 		goto out;
23608789a9e7SSteven Rostedt 
23618789a9e7SSteven Rostedt 	/* check for data */
23628789a9e7SSteven Rostedt 	if (!local_read(&cpu_buffer->reader_page->page->commit))
23638789a9e7SSteven Rostedt 		goto out;
23648789a9e7SSteven Rostedt 	/*
23658789a9e7SSteven Rostedt 	 * If the writer is already off of the read page, then simply
23668789a9e7SSteven Rostedt 	 * switch the read page with the given page. Otherwise
23678789a9e7SSteven Rostedt 	 * we need to copy the data from the reader to the writer.
23688789a9e7SSteven Rostedt 	 */
23698789a9e7SSteven Rostedt 	if (cpu_buffer->reader_page == cpu_buffer->commit_page) {
23708789a9e7SSteven Rostedt 		unsigned int read = cpu_buffer->reader_page->read;
23718789a9e7SSteven Rostedt 
23728789a9e7SSteven Rostedt 		if (full)
23738789a9e7SSteven Rostedt 			goto out;
23748789a9e7SSteven Rostedt 		/* The writer is still on the reader page, we must copy */
2375044fa782SSteven Rostedt 		bpage = cpu_buffer->reader_page->page;
2376044fa782SSteven Rostedt 		memcpy(bpage->data,
23778789a9e7SSteven Rostedt 		       cpu_buffer->reader_page->page->data + read,
2378044fa782SSteven Rostedt 		       local_read(&bpage->commit) - read);
23798789a9e7SSteven Rostedt 
23808789a9e7SSteven Rostedt 		/* consume what was read */
23818789a9e7SSteven Rostedt 		cpu_buffer->reader_page += read;
23828789a9e7SSteven Rostedt 
23838789a9e7SSteven Rostedt 	} else {
23848789a9e7SSteven Rostedt 		/* swap the pages */
2385044fa782SSteven Rostedt 		rb_init_page(bpage);
2386044fa782SSteven Rostedt 		bpage = cpu_buffer->reader_page->page;
23878789a9e7SSteven Rostedt 		cpu_buffer->reader_page->page = *data_page;
23888789a9e7SSteven Rostedt 		cpu_buffer->reader_page->read = 0;
2389044fa782SSteven Rostedt 		*data_page = bpage;
23908789a9e7SSteven Rostedt 	}
23918789a9e7SSteven Rostedt 	ret = 1;
23928789a9e7SSteven Rostedt 
23938789a9e7SSteven Rostedt 	/* update the entry counter */
2394044fa782SSteven Rostedt 	rb_remove_entries(cpu_buffer, bpage);
23958789a9e7SSteven Rostedt  out:
23968789a9e7SSteven Rostedt 	spin_unlock_irqrestore(&cpu_buffer->reader_lock, flags);
23978789a9e7SSteven Rostedt 
23988789a9e7SSteven Rostedt 	return ret;
23998789a9e7SSteven Rostedt }
24008789a9e7SSteven Rostedt 
2401a3583244SSteven Rostedt static ssize_t
2402a3583244SSteven Rostedt rb_simple_read(struct file *filp, char __user *ubuf,
2403a3583244SSteven Rostedt 	       size_t cnt, loff_t *ppos)
2404a3583244SSteven Rostedt {
2405033601a3SSteven Rostedt 	long *p = filp->private_data;
2406a3583244SSteven Rostedt 	char buf[64];
2407a3583244SSteven Rostedt 	int r;
2408a3583244SSteven Rostedt 
2409033601a3SSteven Rostedt 	if (test_bit(RB_BUFFERS_DISABLED_BIT, p))
2410033601a3SSteven Rostedt 		r = sprintf(buf, "permanently disabled\n");
2411033601a3SSteven Rostedt 	else
2412033601a3SSteven Rostedt 		r = sprintf(buf, "%d\n", test_bit(RB_BUFFERS_ON_BIT, p));
2413a3583244SSteven Rostedt 
2414a3583244SSteven Rostedt 	return simple_read_from_buffer(ubuf, cnt, ppos, buf, r);
2415a3583244SSteven Rostedt }
2416a3583244SSteven Rostedt 
2417a3583244SSteven Rostedt static ssize_t
2418a3583244SSteven Rostedt rb_simple_write(struct file *filp, const char __user *ubuf,
2419a3583244SSteven Rostedt 		size_t cnt, loff_t *ppos)
2420a3583244SSteven Rostedt {
2421033601a3SSteven Rostedt 	long *p = filp->private_data;
2422a3583244SSteven Rostedt 	char buf[64];
2423a3583244SSteven Rostedt 	long val;
2424a3583244SSteven Rostedt 	int ret;
2425a3583244SSteven Rostedt 
2426a3583244SSteven Rostedt 	if (cnt >= sizeof(buf))
2427a3583244SSteven Rostedt 		return -EINVAL;
2428a3583244SSteven Rostedt 
2429a3583244SSteven Rostedt 	if (copy_from_user(&buf, ubuf, cnt))
2430a3583244SSteven Rostedt 		return -EFAULT;
2431a3583244SSteven Rostedt 
2432a3583244SSteven Rostedt 	buf[cnt] = 0;
2433a3583244SSteven Rostedt 
2434a3583244SSteven Rostedt 	ret = strict_strtoul(buf, 10, &val);
2435a3583244SSteven Rostedt 	if (ret < 0)
2436a3583244SSteven Rostedt 		return ret;
2437a3583244SSteven Rostedt 
2438033601a3SSteven Rostedt 	if (val)
2439033601a3SSteven Rostedt 		set_bit(RB_BUFFERS_ON_BIT, p);
2440033601a3SSteven Rostedt 	else
2441033601a3SSteven Rostedt 		clear_bit(RB_BUFFERS_ON_BIT, p);
2442a3583244SSteven Rostedt 
2443a3583244SSteven Rostedt 	(*ppos)++;
2444a3583244SSteven Rostedt 
2445a3583244SSteven Rostedt 	return cnt;
2446a3583244SSteven Rostedt }
2447a3583244SSteven Rostedt 
2448a3583244SSteven Rostedt static struct file_operations rb_simple_fops = {
2449a3583244SSteven Rostedt 	.open		= tracing_open_generic,
2450a3583244SSteven Rostedt 	.read		= rb_simple_read,
2451a3583244SSteven Rostedt 	.write		= rb_simple_write,
2452a3583244SSteven Rostedt };
2453a3583244SSteven Rostedt 
2454a3583244SSteven Rostedt 
2455a3583244SSteven Rostedt static __init int rb_init_debugfs(void)
2456a3583244SSteven Rostedt {
2457a3583244SSteven Rostedt 	struct dentry *d_tracer;
2458a3583244SSteven Rostedt 	struct dentry *entry;
2459a3583244SSteven Rostedt 
2460a3583244SSteven Rostedt 	d_tracer = tracing_init_dentry();
2461a3583244SSteven Rostedt 
2462a3583244SSteven Rostedt 	entry = debugfs_create_file("tracing_on", 0644, d_tracer,
2463033601a3SSteven Rostedt 				    &ring_buffer_flags, &rb_simple_fops);
2464a3583244SSteven Rostedt 	if (!entry)
2465a3583244SSteven Rostedt 		pr_warning("Could not create debugfs 'tracing_on' entry\n");
2466a3583244SSteven Rostedt 
2467a3583244SSteven Rostedt 	return 0;
2468a3583244SSteven Rostedt }
2469a3583244SSteven Rostedt 
2470a3583244SSteven Rostedt fs_initcall(rb_init_debugfs);
2471