xref: /linux-6.15/kernel/trace/ring_buffer.c (revision 59222efe)
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>
714131f2fSIngo Molnar #include <linux/trace_clock.h>
878d904b4SSteven Rostedt #include <linux/ftrace_irq.h>
97a8e76a3SSteven Rostedt #include <linux/spinlock.h>
107a8e76a3SSteven Rostedt #include <linux/debugfs.h>
117a8e76a3SSteven Rostedt #include <linux/uaccess.h>
12a81bd80aSSteven Rostedt #include <linux/hardirq.h>
137a8e76a3SSteven Rostedt #include <linux/module.h>
147a8e76a3SSteven Rostedt #include <linux/percpu.h>
157a8e76a3SSteven Rostedt #include <linux/mutex.h>
167a8e76a3SSteven Rostedt #include <linux/init.h>
177a8e76a3SSteven Rostedt #include <linux/hash.h>
187a8e76a3SSteven Rostedt #include <linux/list.h>
19554f786eSSteven Rostedt #include <linux/cpu.h>
207a8e76a3SSteven Rostedt #include <linux/fs.h>
217a8e76a3SSteven Rostedt 
22182e9f5fSSteven Rostedt #include "trace.h"
23182e9f5fSSteven Rostedt 
24033601a3SSteven Rostedt /*
25033601a3SSteven Rostedt  * A fast way to enable or disable all ring buffers is to
26033601a3SSteven Rostedt  * call tracing_on or tracing_off. Turning off the ring buffers
27033601a3SSteven Rostedt  * prevents all ring buffers from being recorded to.
28033601a3SSteven Rostedt  * Turning this switch on, makes it OK to write to the
29033601a3SSteven Rostedt  * ring buffer, if the ring buffer is enabled itself.
30033601a3SSteven Rostedt  *
31033601a3SSteven Rostedt  * There's three layers that must be on in order to write
32033601a3SSteven Rostedt  * to the ring buffer.
33033601a3SSteven Rostedt  *
34033601a3SSteven Rostedt  * 1) This global flag must be set.
35033601a3SSteven Rostedt  * 2) The ring buffer must be enabled for recording.
36033601a3SSteven Rostedt  * 3) The per cpu buffer must be enabled for recording.
37033601a3SSteven Rostedt  *
38033601a3SSteven Rostedt  * In case of an anomaly, this global flag has a bit set that
39033601a3SSteven Rostedt  * will permantly disable all ring buffers.
40033601a3SSteven Rostedt  */
41033601a3SSteven Rostedt 
42033601a3SSteven Rostedt /*
43033601a3SSteven Rostedt  * Global flag to disable all recording to ring buffers
44033601a3SSteven Rostedt  *  This has two bits: ON, DISABLED
45033601a3SSteven Rostedt  *
46033601a3SSteven Rostedt  *  ON   DISABLED
47033601a3SSteven Rostedt  * ---- ----------
48033601a3SSteven Rostedt  *   0      0        : ring buffers are off
49033601a3SSteven Rostedt  *   1      0        : ring buffers are on
50033601a3SSteven Rostedt  *   X      1        : ring buffers are permanently disabled
51033601a3SSteven Rostedt  */
52033601a3SSteven Rostedt 
53033601a3SSteven Rostedt enum {
54033601a3SSteven Rostedt 	RB_BUFFERS_ON_BIT	= 0,
55033601a3SSteven Rostedt 	RB_BUFFERS_DISABLED_BIT	= 1,
56033601a3SSteven Rostedt };
57033601a3SSteven Rostedt 
58033601a3SSteven Rostedt enum {
59033601a3SSteven Rostedt 	RB_BUFFERS_ON		= 1 << RB_BUFFERS_ON_BIT,
60033601a3SSteven Rostedt 	RB_BUFFERS_DISABLED	= 1 << RB_BUFFERS_DISABLED_BIT,
61033601a3SSteven Rostedt };
62033601a3SSteven Rostedt 
635e39841cSHannes Eder static unsigned long ring_buffer_flags __read_mostly = RB_BUFFERS_ON;
64a3583244SSteven Rostedt 
65474d32b6SSteven Rostedt #define BUF_PAGE_HDR_SIZE offsetof(struct buffer_data_page, data)
66474d32b6SSteven Rostedt 
67a3583244SSteven Rostedt /**
68a3583244SSteven Rostedt  * tracing_on - enable all tracing buffers
69a3583244SSteven Rostedt  *
70a3583244SSteven Rostedt  * This function enables all tracing buffers that may have been
71a3583244SSteven Rostedt  * disabled with tracing_off.
72a3583244SSteven Rostedt  */
73a3583244SSteven Rostedt void tracing_on(void)
74a3583244SSteven Rostedt {
75033601a3SSteven Rostedt 	set_bit(RB_BUFFERS_ON_BIT, &ring_buffer_flags);
76a3583244SSteven Rostedt }
77c4f50183SRobert Richter EXPORT_SYMBOL_GPL(tracing_on);
78a3583244SSteven Rostedt 
79a3583244SSteven Rostedt /**
80a3583244SSteven Rostedt  * tracing_off - turn off all tracing buffers
81a3583244SSteven Rostedt  *
82a3583244SSteven Rostedt  * This function stops all tracing buffers from recording data.
83a3583244SSteven Rostedt  * It does not disable any overhead the tracers themselves may
84a3583244SSteven Rostedt  * be causing. This function simply causes all recording to
85a3583244SSteven Rostedt  * the ring buffers to fail.
86a3583244SSteven Rostedt  */
87a3583244SSteven Rostedt void tracing_off(void)
88a3583244SSteven Rostedt {
89033601a3SSteven Rostedt 	clear_bit(RB_BUFFERS_ON_BIT, &ring_buffer_flags);
90033601a3SSteven Rostedt }
91c4f50183SRobert Richter EXPORT_SYMBOL_GPL(tracing_off);
92033601a3SSteven Rostedt 
93033601a3SSteven Rostedt /**
94033601a3SSteven Rostedt  * tracing_off_permanent - permanently disable ring buffers
95033601a3SSteven Rostedt  *
96033601a3SSteven Rostedt  * This function, once called, will disable all ring buffers
97c3706f00SWenji Huang  * permanently.
98033601a3SSteven Rostedt  */
99033601a3SSteven Rostedt void tracing_off_permanent(void)
100033601a3SSteven Rostedt {
101033601a3SSteven Rostedt 	set_bit(RB_BUFFERS_DISABLED_BIT, &ring_buffer_flags);
102a3583244SSteven Rostedt }
103a3583244SSteven Rostedt 
104988ae9d6SSteven Rostedt /**
105988ae9d6SSteven Rostedt  * tracing_is_on - show state of ring buffers enabled
106988ae9d6SSteven Rostedt  */
107988ae9d6SSteven Rostedt int tracing_is_on(void)
108988ae9d6SSteven Rostedt {
109988ae9d6SSteven Rostedt 	return ring_buffer_flags == RB_BUFFERS_ON;
110988ae9d6SSteven Rostedt }
111988ae9d6SSteven Rostedt EXPORT_SYMBOL_GPL(tracing_is_on);
112988ae9d6SSteven Rostedt 
113d06bbd66SIngo Molnar #include "trace.h"
114d06bbd66SIngo Molnar 
1157a8e76a3SSteven Rostedt /* Up this if you want to test the TIME_EXTENTS and normalization */
1167a8e76a3SSteven Rostedt #define DEBUG_SHIFT 0
1177a8e76a3SSteven Rostedt 
1187a8e76a3SSteven Rostedt u64 ring_buffer_time_stamp(int cpu)
1197a8e76a3SSteven Rostedt {
12047e74f2bSSteven Rostedt 	u64 time;
12147e74f2bSSteven Rostedt 
12247e74f2bSSteven Rostedt 	preempt_disable_notrace();
1237a8e76a3SSteven Rostedt 	/* shift to debug/test normalization and TIME_EXTENTS */
12414131f2fSIngo Molnar 	time = trace_clock_local() << DEBUG_SHIFT;
1252c2d7329SFrederic Weisbecker 	preempt_enable_no_resched_notrace();
12647e74f2bSSteven Rostedt 
12747e74f2bSSteven Rostedt 	return time;
1287a8e76a3SSteven Rostedt }
129c4f50183SRobert Richter EXPORT_SYMBOL_GPL(ring_buffer_time_stamp);
1307a8e76a3SSteven Rostedt 
1317a8e76a3SSteven Rostedt void ring_buffer_normalize_time_stamp(int cpu, u64 *ts)
1327a8e76a3SSteven Rostedt {
1337a8e76a3SSteven Rostedt 	/* Just stupid testing the normalize function and deltas */
1347a8e76a3SSteven Rostedt 	*ts >>= DEBUG_SHIFT;
1357a8e76a3SSteven Rostedt }
136c4f50183SRobert Richter EXPORT_SYMBOL_GPL(ring_buffer_normalize_time_stamp);
1377a8e76a3SSteven Rostedt 
138e3d6bf0aSSteven Rostedt #define RB_EVNT_HDR_SIZE (offsetof(struct ring_buffer_event, array))
13967d34724SAndrew Morton #define RB_ALIGNMENT		4U
1407a8e76a3SSteven Rostedt #define RB_MAX_SMALL_DATA	28
1417a8e76a3SSteven Rostedt 
1427a8e76a3SSteven Rostedt enum {
1437a8e76a3SSteven Rostedt 	RB_LEN_TIME_EXTEND = 8,
1447a8e76a3SSteven Rostedt 	RB_LEN_TIME_STAMP = 16,
1457a8e76a3SSteven Rostedt };
1467a8e76a3SSteven Rostedt 
1477a8e76a3SSteven Rostedt /* inline for ring buffer fast paths */
14834a148bfSAndrew Morton static unsigned
1497a8e76a3SSteven Rostedt rb_event_length(struct ring_buffer_event *event)
1507a8e76a3SSteven Rostedt {
1517a8e76a3SSteven Rostedt 	unsigned length;
1527a8e76a3SSteven Rostedt 
1537a8e76a3SSteven Rostedt 	switch (event->type) {
1547a8e76a3SSteven Rostedt 	case RINGBUF_TYPE_PADDING:
1557a8e76a3SSteven Rostedt 		/* undefined */
1567a8e76a3SSteven Rostedt 		return -1;
1577a8e76a3SSteven Rostedt 
1587a8e76a3SSteven Rostedt 	case RINGBUF_TYPE_TIME_EXTEND:
1597a8e76a3SSteven Rostedt 		return RB_LEN_TIME_EXTEND;
1607a8e76a3SSteven Rostedt 
1617a8e76a3SSteven Rostedt 	case RINGBUF_TYPE_TIME_STAMP:
1627a8e76a3SSteven Rostedt 		return RB_LEN_TIME_STAMP;
1637a8e76a3SSteven Rostedt 
1647a8e76a3SSteven Rostedt 	case RINGBUF_TYPE_DATA:
1657a8e76a3SSteven Rostedt 		if (event->len)
16667d34724SAndrew Morton 			length = event->len * RB_ALIGNMENT;
1677a8e76a3SSteven Rostedt 		else
1687a8e76a3SSteven Rostedt 			length = event->array[0];
1697a8e76a3SSteven Rostedt 		return length + RB_EVNT_HDR_SIZE;
1707a8e76a3SSteven Rostedt 	default:
1717a8e76a3SSteven Rostedt 		BUG();
1727a8e76a3SSteven Rostedt 	}
1737a8e76a3SSteven Rostedt 	/* not hit */
1747a8e76a3SSteven Rostedt 	return 0;
1757a8e76a3SSteven Rostedt }
1767a8e76a3SSteven Rostedt 
1777a8e76a3SSteven Rostedt /**
1787a8e76a3SSteven Rostedt  * ring_buffer_event_length - return the length of the event
1797a8e76a3SSteven Rostedt  * @event: the event to get the length of
1807a8e76a3SSteven Rostedt  */
1817a8e76a3SSteven Rostedt unsigned ring_buffer_event_length(struct ring_buffer_event *event)
1827a8e76a3SSteven Rostedt {
183465634adSRobert Richter 	unsigned length = rb_event_length(event);
184465634adSRobert Richter 	if (event->type != RINGBUF_TYPE_DATA)
185465634adSRobert Richter 		return length;
186465634adSRobert Richter 	length -= RB_EVNT_HDR_SIZE;
187465634adSRobert Richter 	if (length > RB_MAX_SMALL_DATA + sizeof(event->array[0]))
188465634adSRobert Richter                 length -= sizeof(event->array[0]);
189465634adSRobert Richter 	return length;
1907a8e76a3SSteven Rostedt }
191c4f50183SRobert Richter EXPORT_SYMBOL_GPL(ring_buffer_event_length);
1927a8e76a3SSteven Rostedt 
1937a8e76a3SSteven Rostedt /* inline for ring buffer fast paths */
19434a148bfSAndrew Morton static void *
1957a8e76a3SSteven Rostedt rb_event_data(struct ring_buffer_event *event)
1967a8e76a3SSteven Rostedt {
1977a8e76a3SSteven Rostedt 	BUG_ON(event->type != RINGBUF_TYPE_DATA);
1987a8e76a3SSteven Rostedt 	/* If length is in len field, then array[0] has the data */
1997a8e76a3SSteven Rostedt 	if (event->len)
2007a8e76a3SSteven Rostedt 		return (void *)&event->array[0];
2017a8e76a3SSteven Rostedt 	/* Otherwise length is in array[0] and array[1] has the data */
2027a8e76a3SSteven Rostedt 	return (void *)&event->array[1];
2037a8e76a3SSteven Rostedt }
2047a8e76a3SSteven Rostedt 
2057a8e76a3SSteven Rostedt /**
2067a8e76a3SSteven Rostedt  * ring_buffer_event_data - return the data of the event
2077a8e76a3SSteven Rostedt  * @event: the event to get the data from
2087a8e76a3SSteven Rostedt  */
2097a8e76a3SSteven Rostedt void *ring_buffer_event_data(struct ring_buffer_event *event)
2107a8e76a3SSteven Rostedt {
2117a8e76a3SSteven Rostedt 	return rb_event_data(event);
2127a8e76a3SSteven Rostedt }
213c4f50183SRobert Richter EXPORT_SYMBOL_GPL(ring_buffer_event_data);
2147a8e76a3SSteven Rostedt 
2157a8e76a3SSteven Rostedt #define for_each_buffer_cpu(buffer, cpu)		\
2169e01c1b7SRusty Russell 	for_each_cpu(cpu, buffer->cpumask)
2177a8e76a3SSteven Rostedt 
2187a8e76a3SSteven Rostedt #define TS_SHIFT	27
2197a8e76a3SSteven Rostedt #define TS_MASK		((1ULL << TS_SHIFT) - 1)
2207a8e76a3SSteven Rostedt #define TS_DELTA_TEST	(~TS_MASK)
2217a8e76a3SSteven Rostedt 
222abc9b56dSSteven Rostedt struct buffer_data_page {
2237a8e76a3SSteven Rostedt 	u64		 time_stamp;	/* page time stamp */
224c3706f00SWenji Huang 	local_t		 commit;	/* write committed index */
225abc9b56dSSteven Rostedt 	unsigned char	 data[];	/* data of buffer page */
226abc9b56dSSteven Rostedt };
227abc9b56dSSteven Rostedt 
228abc9b56dSSteven Rostedt struct buffer_page {
229abc9b56dSSteven Rostedt 	local_t		 write;		/* index for next write */
2306f807acdSSteven Rostedt 	unsigned	 read;		/* index for next read */
2317a8e76a3SSteven Rostedt 	struct list_head list;		/* list of free pages */
232abc9b56dSSteven Rostedt 	struct buffer_data_page *page;	/* Actual data page */
2337a8e76a3SSteven Rostedt };
2347a8e76a3SSteven Rostedt 
235044fa782SSteven Rostedt static void rb_init_page(struct buffer_data_page *bpage)
236abc9b56dSSteven Rostedt {
237044fa782SSteven Rostedt 	local_set(&bpage->commit, 0);
238abc9b56dSSteven Rostedt }
239abc9b56dSSteven Rostedt 
240474d32b6SSteven Rostedt /**
241474d32b6SSteven Rostedt  * ring_buffer_page_len - the size of data on the page.
242474d32b6SSteven Rostedt  * @page: The page to read
243474d32b6SSteven Rostedt  *
244474d32b6SSteven Rostedt  * Returns the amount of data on the page, including buffer page header.
245474d32b6SSteven Rostedt  */
246ef7a4a16SSteven Rostedt size_t ring_buffer_page_len(void *page)
247ef7a4a16SSteven Rostedt {
248474d32b6SSteven Rostedt 	return local_read(&((struct buffer_data_page *)page)->commit)
249474d32b6SSteven Rostedt 		+ BUF_PAGE_HDR_SIZE;
250ef7a4a16SSteven Rostedt }
251ef7a4a16SSteven Rostedt 
2527a8e76a3SSteven Rostedt /*
253ed56829cSSteven Rostedt  * Also stolen from mm/slob.c. Thanks to Mathieu Desnoyers for pointing
254ed56829cSSteven Rostedt  * this issue out.
255ed56829cSSteven Rostedt  */
25634a148bfSAndrew Morton static void free_buffer_page(struct buffer_page *bpage)
257ed56829cSSteven Rostedt {
2586ae2a076SSteven Rostedt 	free_page((unsigned long)bpage->page);
259e4c2ce82SSteven Rostedt 	kfree(bpage);
260ed56829cSSteven Rostedt }
261ed56829cSSteven Rostedt 
262ed56829cSSteven Rostedt /*
2637a8e76a3SSteven Rostedt  * We need to fit the time_stamp delta into 27 bits.
2647a8e76a3SSteven Rostedt  */
2657a8e76a3SSteven Rostedt static inline int test_time_stamp(u64 delta)
2667a8e76a3SSteven Rostedt {
2677a8e76a3SSteven Rostedt 	if (delta & TS_DELTA_TEST)
2687a8e76a3SSteven Rostedt 		return 1;
2697a8e76a3SSteven Rostedt 	return 0;
2707a8e76a3SSteven Rostedt }
2717a8e76a3SSteven Rostedt 
272474d32b6SSteven Rostedt #define BUF_PAGE_SIZE (PAGE_SIZE - BUF_PAGE_HDR_SIZE)
2737a8e76a3SSteven Rostedt 
2747a8e76a3SSteven Rostedt /*
2757a8e76a3SSteven Rostedt  * head_page == tail_page && head == tail then buffer is empty.
2767a8e76a3SSteven Rostedt  */
2777a8e76a3SSteven Rostedt struct ring_buffer_per_cpu {
2787a8e76a3SSteven Rostedt 	int				cpu;
2797a8e76a3SSteven Rostedt 	struct ring_buffer		*buffer;
280f83c9d0fSSteven Rostedt 	spinlock_t			reader_lock; /* serialize readers */
2813e03fb7fSSteven Rostedt 	raw_spinlock_t			lock;
2827a8e76a3SSteven Rostedt 	struct lock_class_key		lock_key;
2837a8e76a3SSteven Rostedt 	struct list_head		pages;
2846f807acdSSteven Rostedt 	struct buffer_page		*head_page;	/* read from head */
2856f807acdSSteven Rostedt 	struct buffer_page		*tail_page;	/* write to tail */
286c3706f00SWenji Huang 	struct buffer_page		*commit_page;	/* committed pages */
287d769041fSSteven Rostedt 	struct buffer_page		*reader_page;
2887a8e76a3SSteven Rostedt 	unsigned long			overrun;
2897a8e76a3SSteven Rostedt 	unsigned long			entries;
2907a8e76a3SSteven Rostedt 	u64				write_stamp;
2917a8e76a3SSteven Rostedt 	u64				read_stamp;
2927a8e76a3SSteven Rostedt 	atomic_t			record_disabled;
2937a8e76a3SSteven Rostedt };
2947a8e76a3SSteven Rostedt 
2957a8e76a3SSteven Rostedt struct ring_buffer {
2967a8e76a3SSteven Rostedt 	unsigned			pages;
2977a8e76a3SSteven Rostedt 	unsigned			flags;
2987a8e76a3SSteven Rostedt 	int				cpus;
2997a8e76a3SSteven Rostedt 	atomic_t			record_disabled;
30000f62f61SArnaldo Carvalho de Melo 	cpumask_var_t			cpumask;
3017a8e76a3SSteven Rostedt 
3027a8e76a3SSteven Rostedt 	struct mutex			mutex;
3037a8e76a3SSteven Rostedt 
3047a8e76a3SSteven Rostedt 	struct ring_buffer_per_cpu	**buffers;
305554f786eSSteven Rostedt 
306*59222efeSSteven Rostedt #ifdef CONFIG_HOTPLUG_CPU
307554f786eSSteven Rostedt 	struct notifier_block		cpu_notify;
308554f786eSSteven Rostedt #endif
3097a8e76a3SSteven Rostedt };
3107a8e76a3SSteven Rostedt 
3117a8e76a3SSteven Rostedt struct ring_buffer_iter {
3127a8e76a3SSteven Rostedt 	struct ring_buffer_per_cpu	*cpu_buffer;
3137a8e76a3SSteven Rostedt 	unsigned long			head;
3147a8e76a3SSteven Rostedt 	struct buffer_page		*head_page;
3157a8e76a3SSteven Rostedt 	u64				read_stamp;
3167a8e76a3SSteven Rostedt };
3177a8e76a3SSteven Rostedt 
318f536aafcSSteven Rostedt /* buffer may be either ring_buffer or ring_buffer_per_cpu */
3197a8e76a3SSteven Rostedt #define RB_WARN_ON(buffer, cond)				\
3203e89c7bbSSteven Rostedt 	({							\
3213e89c7bbSSteven Rostedt 		int _____ret = unlikely(cond);			\
3223e89c7bbSSteven Rostedt 		if (_____ret) {					\
323bf41a158SSteven Rostedt 			atomic_inc(&buffer->record_disabled);	\
324bf41a158SSteven Rostedt 			WARN_ON(1);				\
325bf41a158SSteven Rostedt 		}						\
3263e89c7bbSSteven Rostedt 		_____ret;					\
3273e89c7bbSSteven Rostedt 	})
328f536aafcSSteven Rostedt 
3297a8e76a3SSteven Rostedt /**
3307a8e76a3SSteven Rostedt  * check_pages - integrity check of buffer pages
3317a8e76a3SSteven Rostedt  * @cpu_buffer: CPU buffer with pages to test
3327a8e76a3SSteven Rostedt  *
333c3706f00SWenji Huang  * As a safety measure we check to make sure the data pages have not
3347a8e76a3SSteven Rostedt  * been corrupted.
3357a8e76a3SSteven Rostedt  */
3367a8e76a3SSteven Rostedt static int rb_check_pages(struct ring_buffer_per_cpu *cpu_buffer)
3377a8e76a3SSteven Rostedt {
3387a8e76a3SSteven Rostedt 	struct list_head *head = &cpu_buffer->pages;
339044fa782SSteven Rostedt 	struct buffer_page *bpage, *tmp;
3407a8e76a3SSteven Rostedt 
3413e89c7bbSSteven Rostedt 	if (RB_WARN_ON(cpu_buffer, head->next->prev != head))
3423e89c7bbSSteven Rostedt 		return -1;
3433e89c7bbSSteven Rostedt 	if (RB_WARN_ON(cpu_buffer, head->prev->next != head))
3443e89c7bbSSteven Rostedt 		return -1;
3457a8e76a3SSteven Rostedt 
346044fa782SSteven Rostedt 	list_for_each_entry_safe(bpage, tmp, head, list) {
3473e89c7bbSSteven Rostedt 		if (RB_WARN_ON(cpu_buffer,
348044fa782SSteven Rostedt 			       bpage->list.next->prev != &bpage->list))
3493e89c7bbSSteven Rostedt 			return -1;
3503e89c7bbSSteven Rostedt 		if (RB_WARN_ON(cpu_buffer,
351044fa782SSteven Rostedt 			       bpage->list.prev->next != &bpage->list))
3523e89c7bbSSteven Rostedt 			return -1;
3537a8e76a3SSteven Rostedt 	}
3547a8e76a3SSteven Rostedt 
3557a8e76a3SSteven Rostedt 	return 0;
3567a8e76a3SSteven Rostedt }
3577a8e76a3SSteven Rostedt 
3587a8e76a3SSteven Rostedt static int rb_allocate_pages(struct ring_buffer_per_cpu *cpu_buffer,
3597a8e76a3SSteven Rostedt 			     unsigned nr_pages)
3607a8e76a3SSteven Rostedt {
3617a8e76a3SSteven Rostedt 	struct list_head *head = &cpu_buffer->pages;
362044fa782SSteven Rostedt 	struct buffer_page *bpage, *tmp;
3637a8e76a3SSteven Rostedt 	unsigned long addr;
3647a8e76a3SSteven Rostedt 	LIST_HEAD(pages);
3657a8e76a3SSteven Rostedt 	unsigned i;
3667a8e76a3SSteven Rostedt 
3677a8e76a3SSteven Rostedt 	for (i = 0; i < nr_pages; i++) {
368044fa782SSteven Rostedt 		bpage = kzalloc_node(ALIGN(sizeof(*bpage), cache_line_size()),
369aa1e0e3bSSteven Rostedt 				    GFP_KERNEL, cpu_to_node(cpu_buffer->cpu));
370044fa782SSteven Rostedt 		if (!bpage)
371e4c2ce82SSteven Rostedt 			goto free_pages;
372044fa782SSteven Rostedt 		list_add(&bpage->list, &pages);
373e4c2ce82SSteven Rostedt 
3747a8e76a3SSteven Rostedt 		addr = __get_free_page(GFP_KERNEL);
3757a8e76a3SSteven Rostedt 		if (!addr)
3767a8e76a3SSteven Rostedt 			goto free_pages;
377044fa782SSteven Rostedt 		bpage->page = (void *)addr;
378044fa782SSteven Rostedt 		rb_init_page(bpage->page);
3797a8e76a3SSteven Rostedt 	}
3807a8e76a3SSteven Rostedt 
3817a8e76a3SSteven Rostedt 	list_splice(&pages, head);
3827a8e76a3SSteven Rostedt 
3837a8e76a3SSteven Rostedt 	rb_check_pages(cpu_buffer);
3847a8e76a3SSteven Rostedt 
3857a8e76a3SSteven Rostedt 	return 0;
3867a8e76a3SSteven Rostedt 
3877a8e76a3SSteven Rostedt  free_pages:
388044fa782SSteven Rostedt 	list_for_each_entry_safe(bpage, tmp, &pages, list) {
389044fa782SSteven Rostedt 		list_del_init(&bpage->list);
390044fa782SSteven Rostedt 		free_buffer_page(bpage);
3917a8e76a3SSteven Rostedt 	}
3927a8e76a3SSteven Rostedt 	return -ENOMEM;
3937a8e76a3SSteven Rostedt }
3947a8e76a3SSteven Rostedt 
3957a8e76a3SSteven Rostedt static struct ring_buffer_per_cpu *
3967a8e76a3SSteven Rostedt rb_allocate_cpu_buffer(struct ring_buffer *buffer, int cpu)
3977a8e76a3SSteven Rostedt {
3987a8e76a3SSteven Rostedt 	struct ring_buffer_per_cpu *cpu_buffer;
399044fa782SSteven Rostedt 	struct buffer_page *bpage;
400d769041fSSteven Rostedt 	unsigned long addr;
4017a8e76a3SSteven Rostedt 	int ret;
4027a8e76a3SSteven Rostedt 
4037a8e76a3SSteven Rostedt 	cpu_buffer = kzalloc_node(ALIGN(sizeof(*cpu_buffer), cache_line_size()),
4047a8e76a3SSteven Rostedt 				  GFP_KERNEL, cpu_to_node(cpu));
4057a8e76a3SSteven Rostedt 	if (!cpu_buffer)
4067a8e76a3SSteven Rostedt 		return NULL;
4077a8e76a3SSteven Rostedt 
4087a8e76a3SSteven Rostedt 	cpu_buffer->cpu = cpu;
4097a8e76a3SSteven Rostedt 	cpu_buffer->buffer = buffer;
410f83c9d0fSSteven Rostedt 	spin_lock_init(&cpu_buffer->reader_lock);
4113e03fb7fSSteven Rostedt 	cpu_buffer->lock = (raw_spinlock_t)__RAW_SPIN_LOCK_UNLOCKED;
4127a8e76a3SSteven Rostedt 	INIT_LIST_HEAD(&cpu_buffer->pages);
4137a8e76a3SSteven Rostedt 
414044fa782SSteven Rostedt 	bpage = kzalloc_node(ALIGN(sizeof(*bpage), cache_line_size()),
415e4c2ce82SSteven Rostedt 			    GFP_KERNEL, cpu_to_node(cpu));
416044fa782SSteven Rostedt 	if (!bpage)
417e4c2ce82SSteven Rostedt 		goto fail_free_buffer;
418e4c2ce82SSteven Rostedt 
419044fa782SSteven Rostedt 	cpu_buffer->reader_page = bpage;
420d769041fSSteven Rostedt 	addr = __get_free_page(GFP_KERNEL);
421d769041fSSteven Rostedt 	if (!addr)
422e4c2ce82SSteven Rostedt 		goto fail_free_reader;
423044fa782SSteven Rostedt 	bpage->page = (void *)addr;
424044fa782SSteven Rostedt 	rb_init_page(bpage->page);
425e4c2ce82SSteven Rostedt 
426d769041fSSteven Rostedt 	INIT_LIST_HEAD(&cpu_buffer->reader_page->list);
427d769041fSSteven Rostedt 
4287a8e76a3SSteven Rostedt 	ret = rb_allocate_pages(cpu_buffer, buffer->pages);
4297a8e76a3SSteven Rostedt 	if (ret < 0)
430d769041fSSteven Rostedt 		goto fail_free_reader;
4317a8e76a3SSteven Rostedt 
4327a8e76a3SSteven Rostedt 	cpu_buffer->head_page
4337a8e76a3SSteven Rostedt 		= list_entry(cpu_buffer->pages.next, struct buffer_page, list);
434bf41a158SSteven Rostedt 	cpu_buffer->tail_page = cpu_buffer->commit_page = cpu_buffer->head_page;
4357a8e76a3SSteven Rostedt 
4367a8e76a3SSteven Rostedt 	return cpu_buffer;
4377a8e76a3SSteven Rostedt 
438d769041fSSteven Rostedt  fail_free_reader:
439d769041fSSteven Rostedt 	free_buffer_page(cpu_buffer->reader_page);
440d769041fSSteven Rostedt 
4417a8e76a3SSteven Rostedt  fail_free_buffer:
4427a8e76a3SSteven Rostedt 	kfree(cpu_buffer);
4437a8e76a3SSteven Rostedt 	return NULL;
4447a8e76a3SSteven Rostedt }
4457a8e76a3SSteven Rostedt 
4467a8e76a3SSteven Rostedt static void rb_free_cpu_buffer(struct ring_buffer_per_cpu *cpu_buffer)
4477a8e76a3SSteven Rostedt {
4487a8e76a3SSteven Rostedt 	struct list_head *head = &cpu_buffer->pages;
449044fa782SSteven Rostedt 	struct buffer_page *bpage, *tmp;
4507a8e76a3SSteven Rostedt 
451d769041fSSteven Rostedt 	list_del_init(&cpu_buffer->reader_page->list);
452d769041fSSteven Rostedt 	free_buffer_page(cpu_buffer->reader_page);
453d769041fSSteven Rostedt 
454044fa782SSteven Rostedt 	list_for_each_entry_safe(bpage, tmp, head, list) {
455044fa782SSteven Rostedt 		list_del_init(&bpage->list);
456044fa782SSteven Rostedt 		free_buffer_page(bpage);
4577a8e76a3SSteven Rostedt 	}
4587a8e76a3SSteven Rostedt 	kfree(cpu_buffer);
4597a8e76a3SSteven Rostedt }
4607a8e76a3SSteven Rostedt 
461a7b13743SSteven Rostedt /*
462a7b13743SSteven Rostedt  * Causes compile errors if the struct buffer_page gets bigger
463a7b13743SSteven Rostedt  * than the struct page.
464a7b13743SSteven Rostedt  */
465a7b13743SSteven Rostedt extern int ring_buffer_page_too_big(void);
466a7b13743SSteven Rostedt 
467*59222efeSSteven Rostedt #ifdef CONFIG_HOTPLUG_CPU
468554f786eSSteven Rostedt static int __cpuinit rb_cpu_notify(struct notifier_block *self,
469554f786eSSteven Rostedt 				   unsigned long action, void *hcpu);
470554f786eSSteven Rostedt #endif
471554f786eSSteven Rostedt 
4727a8e76a3SSteven Rostedt /**
4737a8e76a3SSteven Rostedt  * ring_buffer_alloc - allocate a new ring_buffer
47468814b58SRobert Richter  * @size: the size in bytes per cpu that is needed.
4757a8e76a3SSteven Rostedt  * @flags: attributes to set for the ring buffer.
4767a8e76a3SSteven Rostedt  *
4777a8e76a3SSteven Rostedt  * Currently the only flag that is available is the RB_FL_OVERWRITE
4787a8e76a3SSteven Rostedt  * flag. This flag means that the buffer will overwrite old data
4797a8e76a3SSteven Rostedt  * when the buffer wraps. If this flag is not set, the buffer will
4807a8e76a3SSteven Rostedt  * drop data when the tail hits the head.
4817a8e76a3SSteven Rostedt  */
4827a8e76a3SSteven Rostedt struct ring_buffer *ring_buffer_alloc(unsigned long size, unsigned flags)
4837a8e76a3SSteven Rostedt {
4847a8e76a3SSteven Rostedt 	struct ring_buffer *buffer;
4857a8e76a3SSteven Rostedt 	int bsize;
4867a8e76a3SSteven Rostedt 	int cpu;
4877a8e76a3SSteven Rostedt 
488a7b13743SSteven Rostedt 	/* Paranoid! Optimizes out when all is well */
489a7b13743SSteven Rostedt 	if (sizeof(struct buffer_page) > sizeof(struct page))
490a7b13743SSteven Rostedt 		ring_buffer_page_too_big();
491a7b13743SSteven Rostedt 
492a7b13743SSteven Rostedt 
4937a8e76a3SSteven Rostedt 	/* keep it in its own cache line */
4947a8e76a3SSteven Rostedt 	buffer = kzalloc(ALIGN(sizeof(*buffer), cache_line_size()),
4957a8e76a3SSteven Rostedt 			 GFP_KERNEL);
4967a8e76a3SSteven Rostedt 	if (!buffer)
4977a8e76a3SSteven Rostedt 		return NULL;
4987a8e76a3SSteven Rostedt 
4999e01c1b7SRusty Russell 	if (!alloc_cpumask_var(&buffer->cpumask, GFP_KERNEL))
5009e01c1b7SRusty Russell 		goto fail_free_buffer;
5019e01c1b7SRusty Russell 
5027a8e76a3SSteven Rostedt 	buffer->pages = DIV_ROUND_UP(size, BUF_PAGE_SIZE);
5037a8e76a3SSteven Rostedt 	buffer->flags = flags;
5047a8e76a3SSteven Rostedt 
5057a8e76a3SSteven Rostedt 	/* need at least two pages */
5067a8e76a3SSteven Rostedt 	if (buffer->pages == 1)
5077a8e76a3SSteven Rostedt 		buffer->pages++;
5087a8e76a3SSteven Rostedt 
509554f786eSSteven Rostedt 	get_online_cpus();
510554f786eSSteven Rostedt 	cpumask_copy(buffer->cpumask, cpu_online_mask);
5117a8e76a3SSteven Rostedt 	buffer->cpus = nr_cpu_ids;
5127a8e76a3SSteven Rostedt 
5137a8e76a3SSteven Rostedt 	bsize = sizeof(void *) * nr_cpu_ids;
5147a8e76a3SSteven Rostedt 	buffer->buffers = kzalloc(ALIGN(bsize, cache_line_size()),
5157a8e76a3SSteven Rostedt 				  GFP_KERNEL);
5167a8e76a3SSteven Rostedt 	if (!buffer->buffers)
5179e01c1b7SRusty Russell 		goto fail_free_cpumask;
5187a8e76a3SSteven Rostedt 
5197a8e76a3SSteven Rostedt 	for_each_buffer_cpu(buffer, cpu) {
5207a8e76a3SSteven Rostedt 		buffer->buffers[cpu] =
5217a8e76a3SSteven Rostedt 			rb_allocate_cpu_buffer(buffer, cpu);
5227a8e76a3SSteven Rostedt 		if (!buffer->buffers[cpu])
5237a8e76a3SSteven Rostedt 			goto fail_free_buffers;
5247a8e76a3SSteven Rostedt 	}
5257a8e76a3SSteven Rostedt 
526*59222efeSSteven Rostedt #ifdef CONFIG_HOTPLUG_CPU
527554f786eSSteven Rostedt 	buffer->cpu_notify.notifier_call = rb_cpu_notify;
528554f786eSSteven Rostedt 	buffer->cpu_notify.priority = 0;
529554f786eSSteven Rostedt 	register_cpu_notifier(&buffer->cpu_notify);
530554f786eSSteven Rostedt #endif
531554f786eSSteven Rostedt 
532554f786eSSteven Rostedt 	put_online_cpus();
5337a8e76a3SSteven Rostedt 	mutex_init(&buffer->mutex);
5347a8e76a3SSteven Rostedt 
5357a8e76a3SSteven Rostedt 	return buffer;
5367a8e76a3SSteven Rostedt 
5377a8e76a3SSteven Rostedt  fail_free_buffers:
5387a8e76a3SSteven Rostedt 	for_each_buffer_cpu(buffer, cpu) {
5397a8e76a3SSteven Rostedt 		if (buffer->buffers[cpu])
5407a8e76a3SSteven Rostedt 			rb_free_cpu_buffer(buffer->buffers[cpu]);
5417a8e76a3SSteven Rostedt 	}
5427a8e76a3SSteven Rostedt 	kfree(buffer->buffers);
5437a8e76a3SSteven Rostedt 
5449e01c1b7SRusty Russell  fail_free_cpumask:
5459e01c1b7SRusty Russell 	free_cpumask_var(buffer->cpumask);
546554f786eSSteven Rostedt 	put_online_cpus();
5479e01c1b7SRusty Russell 
5487a8e76a3SSteven Rostedt  fail_free_buffer:
5497a8e76a3SSteven Rostedt 	kfree(buffer);
5507a8e76a3SSteven Rostedt 	return NULL;
5517a8e76a3SSteven Rostedt }
552c4f50183SRobert Richter EXPORT_SYMBOL_GPL(ring_buffer_alloc);
5537a8e76a3SSteven Rostedt 
5547a8e76a3SSteven Rostedt /**
5557a8e76a3SSteven Rostedt  * ring_buffer_free - free a ring buffer.
5567a8e76a3SSteven Rostedt  * @buffer: the buffer to free.
5577a8e76a3SSteven Rostedt  */
5587a8e76a3SSteven Rostedt void
5597a8e76a3SSteven Rostedt ring_buffer_free(struct ring_buffer *buffer)
5607a8e76a3SSteven Rostedt {
5617a8e76a3SSteven Rostedt 	int cpu;
5627a8e76a3SSteven Rostedt 
563554f786eSSteven Rostedt 	get_online_cpus();
564554f786eSSteven Rostedt 
565*59222efeSSteven Rostedt #ifdef CONFIG_HOTPLUG_CPU
566554f786eSSteven Rostedt 	unregister_cpu_notifier(&buffer->cpu_notify);
567554f786eSSteven Rostedt #endif
568554f786eSSteven Rostedt 
5697a8e76a3SSteven Rostedt 	for_each_buffer_cpu(buffer, cpu)
5707a8e76a3SSteven Rostedt 		rb_free_cpu_buffer(buffer->buffers[cpu]);
5717a8e76a3SSteven Rostedt 
572554f786eSSteven Rostedt 	put_online_cpus();
573554f786eSSteven Rostedt 
5749e01c1b7SRusty Russell 	free_cpumask_var(buffer->cpumask);
5759e01c1b7SRusty Russell 
5767a8e76a3SSteven Rostedt 	kfree(buffer);
5777a8e76a3SSteven Rostedt }
578c4f50183SRobert Richter EXPORT_SYMBOL_GPL(ring_buffer_free);
5797a8e76a3SSteven Rostedt 
5807a8e76a3SSteven Rostedt static void rb_reset_cpu(struct ring_buffer_per_cpu *cpu_buffer);
5817a8e76a3SSteven Rostedt 
5827a8e76a3SSteven Rostedt static void
5837a8e76a3SSteven Rostedt rb_remove_pages(struct ring_buffer_per_cpu *cpu_buffer, unsigned nr_pages)
5847a8e76a3SSteven Rostedt {
585044fa782SSteven Rostedt 	struct buffer_page *bpage;
5867a8e76a3SSteven Rostedt 	struct list_head *p;
5877a8e76a3SSteven Rostedt 	unsigned i;
5887a8e76a3SSteven Rostedt 
5897a8e76a3SSteven Rostedt 	atomic_inc(&cpu_buffer->record_disabled);
5907a8e76a3SSteven Rostedt 	synchronize_sched();
5917a8e76a3SSteven Rostedt 
5927a8e76a3SSteven Rostedt 	for (i = 0; i < nr_pages; i++) {
5933e89c7bbSSteven Rostedt 		if (RB_WARN_ON(cpu_buffer, list_empty(&cpu_buffer->pages)))
5943e89c7bbSSteven Rostedt 			return;
5957a8e76a3SSteven Rostedt 		p = cpu_buffer->pages.next;
596044fa782SSteven Rostedt 		bpage = list_entry(p, struct buffer_page, list);
597044fa782SSteven Rostedt 		list_del_init(&bpage->list);
598044fa782SSteven Rostedt 		free_buffer_page(bpage);
5997a8e76a3SSteven Rostedt 	}
6003e89c7bbSSteven Rostedt 	if (RB_WARN_ON(cpu_buffer, list_empty(&cpu_buffer->pages)))
6013e89c7bbSSteven Rostedt 		return;
6027a8e76a3SSteven Rostedt 
6037a8e76a3SSteven Rostedt 	rb_reset_cpu(cpu_buffer);
6047a8e76a3SSteven Rostedt 
6057a8e76a3SSteven Rostedt 	rb_check_pages(cpu_buffer);
6067a8e76a3SSteven Rostedt 
6077a8e76a3SSteven Rostedt 	atomic_dec(&cpu_buffer->record_disabled);
6087a8e76a3SSteven Rostedt 
6097a8e76a3SSteven Rostedt }
6107a8e76a3SSteven Rostedt 
6117a8e76a3SSteven Rostedt static void
6127a8e76a3SSteven Rostedt rb_insert_pages(struct ring_buffer_per_cpu *cpu_buffer,
6137a8e76a3SSteven Rostedt 		struct list_head *pages, unsigned nr_pages)
6147a8e76a3SSteven Rostedt {
615044fa782SSteven Rostedt 	struct buffer_page *bpage;
6167a8e76a3SSteven Rostedt 	struct list_head *p;
6177a8e76a3SSteven Rostedt 	unsigned i;
6187a8e76a3SSteven Rostedt 
6197a8e76a3SSteven Rostedt 	atomic_inc(&cpu_buffer->record_disabled);
6207a8e76a3SSteven Rostedt 	synchronize_sched();
6217a8e76a3SSteven Rostedt 
6227a8e76a3SSteven Rostedt 	for (i = 0; i < nr_pages; i++) {
6233e89c7bbSSteven Rostedt 		if (RB_WARN_ON(cpu_buffer, list_empty(pages)))
6243e89c7bbSSteven Rostedt 			return;
6257a8e76a3SSteven Rostedt 		p = pages->next;
626044fa782SSteven Rostedt 		bpage = list_entry(p, struct buffer_page, list);
627044fa782SSteven Rostedt 		list_del_init(&bpage->list);
628044fa782SSteven Rostedt 		list_add_tail(&bpage->list, &cpu_buffer->pages);
6297a8e76a3SSteven Rostedt 	}
6307a8e76a3SSteven Rostedt 	rb_reset_cpu(cpu_buffer);
6317a8e76a3SSteven Rostedt 
6327a8e76a3SSteven Rostedt 	rb_check_pages(cpu_buffer);
6337a8e76a3SSteven Rostedt 
6347a8e76a3SSteven Rostedt 	atomic_dec(&cpu_buffer->record_disabled);
6357a8e76a3SSteven Rostedt }
6367a8e76a3SSteven Rostedt 
6377a8e76a3SSteven Rostedt /**
6387a8e76a3SSteven Rostedt  * ring_buffer_resize - resize the ring buffer
6397a8e76a3SSteven Rostedt  * @buffer: the buffer to resize.
6407a8e76a3SSteven Rostedt  * @size: the new size.
6417a8e76a3SSteven Rostedt  *
6427a8e76a3SSteven Rostedt  * The tracer is responsible for making sure that the buffer is
6437a8e76a3SSteven Rostedt  * not being used while changing the size.
6447a8e76a3SSteven Rostedt  * Note: We may be able to change the above requirement by using
6457a8e76a3SSteven Rostedt  *  RCU synchronizations.
6467a8e76a3SSteven Rostedt  *
6477a8e76a3SSteven Rostedt  * Minimum size is 2 * BUF_PAGE_SIZE.
6487a8e76a3SSteven Rostedt  *
6497a8e76a3SSteven Rostedt  * Returns -1 on failure.
6507a8e76a3SSteven Rostedt  */
6517a8e76a3SSteven Rostedt int ring_buffer_resize(struct ring_buffer *buffer, unsigned long size)
6527a8e76a3SSteven Rostedt {
6537a8e76a3SSteven Rostedt 	struct ring_buffer_per_cpu *cpu_buffer;
6547a8e76a3SSteven Rostedt 	unsigned nr_pages, rm_pages, new_pages;
655044fa782SSteven Rostedt 	struct buffer_page *bpage, *tmp;
6567a8e76a3SSteven Rostedt 	unsigned long buffer_size;
6577a8e76a3SSteven Rostedt 	unsigned long addr;
6587a8e76a3SSteven Rostedt 	LIST_HEAD(pages);
6597a8e76a3SSteven Rostedt 	int i, cpu;
6607a8e76a3SSteven Rostedt 
661ee51a1deSIngo Molnar 	/*
662ee51a1deSIngo Molnar 	 * Always succeed at resizing a non-existent buffer:
663ee51a1deSIngo Molnar 	 */
664ee51a1deSIngo Molnar 	if (!buffer)
665ee51a1deSIngo Molnar 		return size;
666ee51a1deSIngo Molnar 
6677a8e76a3SSteven Rostedt 	size = DIV_ROUND_UP(size, BUF_PAGE_SIZE);
6687a8e76a3SSteven Rostedt 	size *= BUF_PAGE_SIZE;
6697a8e76a3SSteven Rostedt 	buffer_size = buffer->pages * BUF_PAGE_SIZE;
6707a8e76a3SSteven Rostedt 
6717a8e76a3SSteven Rostedt 	/* we need a minimum of two pages */
6727a8e76a3SSteven Rostedt 	if (size < BUF_PAGE_SIZE * 2)
6737a8e76a3SSteven Rostedt 		size = BUF_PAGE_SIZE * 2;
6747a8e76a3SSteven Rostedt 
6757a8e76a3SSteven Rostedt 	if (size == buffer_size)
6767a8e76a3SSteven Rostedt 		return size;
6777a8e76a3SSteven Rostedt 
6787a8e76a3SSteven Rostedt 	mutex_lock(&buffer->mutex);
679554f786eSSteven Rostedt 	get_online_cpus();
6807a8e76a3SSteven Rostedt 
6817a8e76a3SSteven Rostedt 	nr_pages = DIV_ROUND_UP(size, BUF_PAGE_SIZE);
6827a8e76a3SSteven Rostedt 
6837a8e76a3SSteven Rostedt 	if (size < buffer_size) {
6847a8e76a3SSteven Rostedt 
6857a8e76a3SSteven Rostedt 		/* easy case, just free pages */
686554f786eSSteven Rostedt 		if (RB_WARN_ON(buffer, nr_pages >= buffer->pages))
687554f786eSSteven Rostedt 			goto out_fail;
6887a8e76a3SSteven Rostedt 
6897a8e76a3SSteven Rostedt 		rm_pages = buffer->pages - nr_pages;
6907a8e76a3SSteven Rostedt 
6917a8e76a3SSteven Rostedt 		for_each_buffer_cpu(buffer, cpu) {
6927a8e76a3SSteven Rostedt 			cpu_buffer = buffer->buffers[cpu];
6937a8e76a3SSteven Rostedt 			rb_remove_pages(cpu_buffer, rm_pages);
6947a8e76a3SSteven Rostedt 		}
6957a8e76a3SSteven Rostedt 		goto out;
6967a8e76a3SSteven Rostedt 	}
6977a8e76a3SSteven Rostedt 
6987a8e76a3SSteven Rostedt 	/*
6997a8e76a3SSteven Rostedt 	 * This is a bit more difficult. We only want to add pages
7007a8e76a3SSteven Rostedt 	 * when we can allocate enough for all CPUs. We do this
7017a8e76a3SSteven Rostedt 	 * by allocating all the pages and storing them on a local
7027a8e76a3SSteven Rostedt 	 * link list. If we succeed in our allocation, then we
7037a8e76a3SSteven Rostedt 	 * add these pages to the cpu_buffers. Otherwise we just free
7047a8e76a3SSteven Rostedt 	 * them all and return -ENOMEM;
7057a8e76a3SSteven Rostedt 	 */
706554f786eSSteven Rostedt 	if (RB_WARN_ON(buffer, nr_pages <= buffer->pages))
707554f786eSSteven Rostedt 		goto out_fail;
708f536aafcSSteven Rostedt 
7097a8e76a3SSteven Rostedt 	new_pages = nr_pages - buffer->pages;
7107a8e76a3SSteven Rostedt 
7117a8e76a3SSteven Rostedt 	for_each_buffer_cpu(buffer, cpu) {
7127a8e76a3SSteven Rostedt 		for (i = 0; i < new_pages; i++) {
713044fa782SSteven Rostedt 			bpage = kzalloc_node(ALIGN(sizeof(*bpage),
714e4c2ce82SSteven Rostedt 						  cache_line_size()),
715e4c2ce82SSteven Rostedt 					    GFP_KERNEL, cpu_to_node(cpu));
716044fa782SSteven Rostedt 			if (!bpage)
717e4c2ce82SSteven Rostedt 				goto free_pages;
718044fa782SSteven Rostedt 			list_add(&bpage->list, &pages);
7197a8e76a3SSteven Rostedt 			addr = __get_free_page(GFP_KERNEL);
7207a8e76a3SSteven Rostedt 			if (!addr)
7217a8e76a3SSteven Rostedt 				goto free_pages;
722044fa782SSteven Rostedt 			bpage->page = (void *)addr;
723044fa782SSteven Rostedt 			rb_init_page(bpage->page);
7247a8e76a3SSteven Rostedt 		}
7257a8e76a3SSteven Rostedt 	}
7267a8e76a3SSteven Rostedt 
7277a8e76a3SSteven Rostedt 	for_each_buffer_cpu(buffer, cpu) {
7287a8e76a3SSteven Rostedt 		cpu_buffer = buffer->buffers[cpu];
7297a8e76a3SSteven Rostedt 		rb_insert_pages(cpu_buffer, &pages, new_pages);
7307a8e76a3SSteven Rostedt 	}
7317a8e76a3SSteven Rostedt 
732554f786eSSteven Rostedt 	if (RB_WARN_ON(buffer, !list_empty(&pages)))
733554f786eSSteven Rostedt 		goto out_fail;
7347a8e76a3SSteven Rostedt 
7357a8e76a3SSteven Rostedt  out:
7367a8e76a3SSteven Rostedt 	buffer->pages = nr_pages;
737554f786eSSteven Rostedt 	put_online_cpus();
7387a8e76a3SSteven Rostedt 	mutex_unlock(&buffer->mutex);
7397a8e76a3SSteven Rostedt 
7407a8e76a3SSteven Rostedt 	return size;
7417a8e76a3SSteven Rostedt 
7427a8e76a3SSteven Rostedt  free_pages:
743044fa782SSteven Rostedt 	list_for_each_entry_safe(bpage, tmp, &pages, list) {
744044fa782SSteven Rostedt 		list_del_init(&bpage->list);
745044fa782SSteven Rostedt 		free_buffer_page(bpage);
7467a8e76a3SSteven Rostedt 	}
747554f786eSSteven Rostedt 	put_online_cpus();
748641d2f63SVegard Nossum 	mutex_unlock(&buffer->mutex);
7497a8e76a3SSteven Rostedt 	return -ENOMEM;
750554f786eSSteven Rostedt 
751554f786eSSteven Rostedt 	/*
752554f786eSSteven Rostedt 	 * Something went totally wrong, and we are too paranoid
753554f786eSSteven Rostedt 	 * to even clean up the mess.
754554f786eSSteven Rostedt 	 */
755554f786eSSteven Rostedt  out_fail:
756554f786eSSteven Rostedt 	put_online_cpus();
757554f786eSSteven Rostedt 	mutex_unlock(&buffer->mutex);
758554f786eSSteven Rostedt 	return -1;
7597a8e76a3SSteven Rostedt }
760c4f50183SRobert Richter EXPORT_SYMBOL_GPL(ring_buffer_resize);
7617a8e76a3SSteven Rostedt 
7627a8e76a3SSteven Rostedt static inline int rb_null_event(struct ring_buffer_event *event)
7637a8e76a3SSteven Rostedt {
7647a8e76a3SSteven Rostedt 	return event->type == RINGBUF_TYPE_PADDING;
7657a8e76a3SSteven Rostedt }
7667a8e76a3SSteven Rostedt 
7678789a9e7SSteven Rostedt static inline void *
768044fa782SSteven Rostedt __rb_data_page_index(struct buffer_data_page *bpage, unsigned index)
7698789a9e7SSteven Rostedt {
770044fa782SSteven Rostedt 	return bpage->data + index;
7718789a9e7SSteven Rostedt }
7728789a9e7SSteven Rostedt 
773044fa782SSteven Rostedt static inline void *__rb_page_index(struct buffer_page *bpage, unsigned index)
7747a8e76a3SSteven Rostedt {
775044fa782SSteven Rostedt 	return bpage->page->data + index;
7767a8e76a3SSteven Rostedt }
7777a8e76a3SSteven Rostedt 
7787a8e76a3SSteven Rostedt static inline struct ring_buffer_event *
779d769041fSSteven Rostedt rb_reader_event(struct ring_buffer_per_cpu *cpu_buffer)
7807a8e76a3SSteven Rostedt {
7816f807acdSSteven Rostedt 	return __rb_page_index(cpu_buffer->reader_page,
7826f807acdSSteven Rostedt 			       cpu_buffer->reader_page->read);
7836f807acdSSteven Rostedt }
7846f807acdSSteven Rostedt 
7856f807acdSSteven Rostedt static inline struct ring_buffer_event *
7866f807acdSSteven Rostedt rb_head_event(struct ring_buffer_per_cpu *cpu_buffer)
7876f807acdSSteven Rostedt {
7886f807acdSSteven Rostedt 	return __rb_page_index(cpu_buffer->head_page,
7896f807acdSSteven Rostedt 			       cpu_buffer->head_page->read);
7907a8e76a3SSteven Rostedt }
7917a8e76a3SSteven Rostedt 
7927a8e76a3SSteven Rostedt static inline struct ring_buffer_event *
7937a8e76a3SSteven Rostedt rb_iter_head_event(struct ring_buffer_iter *iter)
7947a8e76a3SSteven Rostedt {
7956f807acdSSteven Rostedt 	return __rb_page_index(iter->head_page, iter->head);
7967a8e76a3SSteven Rostedt }
7977a8e76a3SSteven Rostedt 
798bf41a158SSteven Rostedt static inline unsigned rb_page_write(struct buffer_page *bpage)
799bf41a158SSteven Rostedt {
800bf41a158SSteven Rostedt 	return local_read(&bpage->write);
801bf41a158SSteven Rostedt }
802bf41a158SSteven Rostedt 
803bf41a158SSteven Rostedt static inline unsigned rb_page_commit(struct buffer_page *bpage)
804bf41a158SSteven Rostedt {
805abc9b56dSSteven Rostedt 	return local_read(&bpage->page->commit);
806bf41a158SSteven Rostedt }
807bf41a158SSteven Rostedt 
808bf41a158SSteven Rostedt /* Size is determined by what has been commited */
809bf41a158SSteven Rostedt static inline unsigned rb_page_size(struct buffer_page *bpage)
810bf41a158SSteven Rostedt {
811bf41a158SSteven Rostedt 	return rb_page_commit(bpage);
812bf41a158SSteven Rostedt }
813bf41a158SSteven Rostedt 
814bf41a158SSteven Rostedt static inline unsigned
815bf41a158SSteven Rostedt rb_commit_index(struct ring_buffer_per_cpu *cpu_buffer)
816bf41a158SSteven Rostedt {
817bf41a158SSteven Rostedt 	return rb_page_commit(cpu_buffer->commit_page);
818bf41a158SSteven Rostedt }
819bf41a158SSteven Rostedt 
820bf41a158SSteven Rostedt static inline unsigned rb_head_size(struct ring_buffer_per_cpu *cpu_buffer)
821bf41a158SSteven Rostedt {
822bf41a158SSteven Rostedt 	return rb_page_commit(cpu_buffer->head_page);
823bf41a158SSteven Rostedt }
824bf41a158SSteven Rostedt 
8257a8e76a3SSteven Rostedt /*
8267a8e76a3SSteven Rostedt  * When the tail hits the head and the buffer is in overwrite mode,
8277a8e76a3SSteven Rostedt  * the head jumps to the next page and all content on the previous
8287a8e76a3SSteven Rostedt  * page is discarded. But before doing so, we update the overrun
8297a8e76a3SSteven Rostedt  * variable of the buffer.
8307a8e76a3SSteven Rostedt  */
8317a8e76a3SSteven Rostedt static void rb_update_overflow(struct ring_buffer_per_cpu *cpu_buffer)
8327a8e76a3SSteven Rostedt {
8337a8e76a3SSteven Rostedt 	struct ring_buffer_event *event;
8347a8e76a3SSteven Rostedt 	unsigned long head;
8357a8e76a3SSteven Rostedt 
8367a8e76a3SSteven Rostedt 	for (head = 0; head < rb_head_size(cpu_buffer);
8377a8e76a3SSteven Rostedt 	     head += rb_event_length(event)) {
8387a8e76a3SSteven Rostedt 
8396f807acdSSteven Rostedt 		event = __rb_page_index(cpu_buffer->head_page, head);
8403e89c7bbSSteven Rostedt 		if (RB_WARN_ON(cpu_buffer, rb_null_event(event)))
8413e89c7bbSSteven Rostedt 			return;
8427a8e76a3SSteven Rostedt 		/* Only count data entries */
8437a8e76a3SSteven Rostedt 		if (event->type != RINGBUF_TYPE_DATA)
8447a8e76a3SSteven Rostedt 			continue;
8457a8e76a3SSteven Rostedt 		cpu_buffer->overrun++;
8467a8e76a3SSteven Rostedt 		cpu_buffer->entries--;
8477a8e76a3SSteven Rostedt 	}
8487a8e76a3SSteven Rostedt }
8497a8e76a3SSteven Rostedt 
8507a8e76a3SSteven Rostedt static inline void rb_inc_page(struct ring_buffer_per_cpu *cpu_buffer,
851044fa782SSteven Rostedt 			       struct buffer_page **bpage)
8527a8e76a3SSteven Rostedt {
853044fa782SSteven Rostedt 	struct list_head *p = (*bpage)->list.next;
8547a8e76a3SSteven Rostedt 
8557a8e76a3SSteven Rostedt 	if (p == &cpu_buffer->pages)
8567a8e76a3SSteven Rostedt 		p = p->next;
8577a8e76a3SSteven Rostedt 
858044fa782SSteven Rostedt 	*bpage = list_entry(p, struct buffer_page, list);
8597a8e76a3SSteven Rostedt }
8607a8e76a3SSteven Rostedt 
861bf41a158SSteven Rostedt static inline unsigned
862bf41a158SSteven Rostedt rb_event_index(struct ring_buffer_event *event)
8637a8e76a3SSteven Rostedt {
864bf41a158SSteven Rostedt 	unsigned long addr = (unsigned long)event;
865bf41a158SSteven Rostedt 
866bf41a158SSteven Rostedt 	return (addr & ~PAGE_MASK) - (PAGE_SIZE - BUF_PAGE_SIZE);
8677a8e76a3SSteven Rostedt }
8687a8e76a3SSteven Rostedt 
86934a148bfSAndrew Morton static int
870bf41a158SSteven Rostedt rb_is_commit(struct ring_buffer_per_cpu *cpu_buffer,
871bf41a158SSteven Rostedt 	     struct ring_buffer_event *event)
8727a8e76a3SSteven Rostedt {
873bf41a158SSteven Rostedt 	unsigned long addr = (unsigned long)event;
874bf41a158SSteven Rostedt 	unsigned long index;
875bf41a158SSteven Rostedt 
876bf41a158SSteven Rostedt 	index = rb_event_index(event);
877bf41a158SSteven Rostedt 	addr &= PAGE_MASK;
878bf41a158SSteven Rostedt 
879bf41a158SSteven Rostedt 	return cpu_buffer->commit_page->page == (void *)addr &&
880bf41a158SSteven Rostedt 		rb_commit_index(cpu_buffer) == index;
881bf41a158SSteven Rostedt }
882bf41a158SSteven Rostedt 
88334a148bfSAndrew Morton static void
884bf41a158SSteven Rostedt rb_set_commit_event(struct ring_buffer_per_cpu *cpu_buffer,
885bf41a158SSteven Rostedt 		    struct ring_buffer_event *event)
886bf41a158SSteven Rostedt {
887bf41a158SSteven Rostedt 	unsigned long addr = (unsigned long)event;
888bf41a158SSteven Rostedt 	unsigned long index;
889bf41a158SSteven Rostedt 
890bf41a158SSteven Rostedt 	index = rb_event_index(event);
891bf41a158SSteven Rostedt 	addr &= PAGE_MASK;
892bf41a158SSteven Rostedt 
893bf41a158SSteven Rostedt 	while (cpu_buffer->commit_page->page != (void *)addr) {
8943e89c7bbSSteven Rostedt 		if (RB_WARN_ON(cpu_buffer,
8953e89c7bbSSteven Rostedt 			  cpu_buffer->commit_page == cpu_buffer->tail_page))
8963e89c7bbSSteven Rostedt 			return;
897abc9b56dSSteven Rostedt 		cpu_buffer->commit_page->page->commit =
898bf41a158SSteven Rostedt 			cpu_buffer->commit_page->write;
899bf41a158SSteven Rostedt 		rb_inc_page(cpu_buffer, &cpu_buffer->commit_page);
900abc9b56dSSteven Rostedt 		cpu_buffer->write_stamp =
901abc9b56dSSteven Rostedt 			cpu_buffer->commit_page->page->time_stamp;
902bf41a158SSteven Rostedt 	}
903bf41a158SSteven Rostedt 
904bf41a158SSteven Rostedt 	/* Now set the commit to the event's index */
905abc9b56dSSteven Rostedt 	local_set(&cpu_buffer->commit_page->page->commit, index);
906bf41a158SSteven Rostedt }
907bf41a158SSteven Rostedt 
90834a148bfSAndrew Morton static void
909bf41a158SSteven Rostedt rb_set_commit_to_write(struct ring_buffer_per_cpu *cpu_buffer)
910bf41a158SSteven Rostedt {
911bf41a158SSteven Rostedt 	/*
912bf41a158SSteven Rostedt 	 * We only race with interrupts and NMIs on this CPU.
913bf41a158SSteven Rostedt 	 * If we own the commit event, then we can commit
914bf41a158SSteven Rostedt 	 * all others that interrupted us, since the interruptions
915bf41a158SSteven Rostedt 	 * are in stack format (they finish before they come
916bf41a158SSteven Rostedt 	 * back to us). This allows us to do a simple loop to
917bf41a158SSteven Rostedt 	 * assign the commit to the tail.
918bf41a158SSteven Rostedt 	 */
919a8ccf1d6SSteven Rostedt  again:
920bf41a158SSteven Rostedt 	while (cpu_buffer->commit_page != cpu_buffer->tail_page) {
921abc9b56dSSteven Rostedt 		cpu_buffer->commit_page->page->commit =
922bf41a158SSteven Rostedt 			cpu_buffer->commit_page->write;
923bf41a158SSteven Rostedt 		rb_inc_page(cpu_buffer, &cpu_buffer->commit_page);
924abc9b56dSSteven Rostedt 		cpu_buffer->write_stamp =
925abc9b56dSSteven Rostedt 			cpu_buffer->commit_page->page->time_stamp;
926bf41a158SSteven Rostedt 		/* add barrier to keep gcc from optimizing too much */
927bf41a158SSteven Rostedt 		barrier();
928bf41a158SSteven Rostedt 	}
929bf41a158SSteven Rostedt 	while (rb_commit_index(cpu_buffer) !=
930bf41a158SSteven Rostedt 	       rb_page_write(cpu_buffer->commit_page)) {
931abc9b56dSSteven Rostedt 		cpu_buffer->commit_page->page->commit =
932bf41a158SSteven Rostedt 			cpu_buffer->commit_page->write;
933bf41a158SSteven Rostedt 		barrier();
934bf41a158SSteven Rostedt 	}
935a8ccf1d6SSteven Rostedt 
936a8ccf1d6SSteven Rostedt 	/* again, keep gcc from optimizing */
937a8ccf1d6SSteven Rostedt 	barrier();
938a8ccf1d6SSteven Rostedt 
939a8ccf1d6SSteven Rostedt 	/*
940a8ccf1d6SSteven Rostedt 	 * If an interrupt came in just after the first while loop
941a8ccf1d6SSteven Rostedt 	 * and pushed the tail page forward, we will be left with
942a8ccf1d6SSteven Rostedt 	 * a dangling commit that will never go forward.
943a8ccf1d6SSteven Rostedt 	 */
944a8ccf1d6SSteven Rostedt 	if (unlikely(cpu_buffer->commit_page != cpu_buffer->tail_page))
945a8ccf1d6SSteven Rostedt 		goto again;
9467a8e76a3SSteven Rostedt }
9477a8e76a3SSteven Rostedt 
948d769041fSSteven Rostedt static void rb_reset_reader_page(struct ring_buffer_per_cpu *cpu_buffer)
9497a8e76a3SSteven Rostedt {
950abc9b56dSSteven Rostedt 	cpu_buffer->read_stamp = cpu_buffer->reader_page->page->time_stamp;
9516f807acdSSteven Rostedt 	cpu_buffer->reader_page->read = 0;
952d769041fSSteven Rostedt }
953d769041fSSteven Rostedt 
95434a148bfSAndrew Morton static void rb_inc_iter(struct ring_buffer_iter *iter)
955d769041fSSteven Rostedt {
956d769041fSSteven Rostedt 	struct ring_buffer_per_cpu *cpu_buffer = iter->cpu_buffer;
957d769041fSSteven Rostedt 
958d769041fSSteven Rostedt 	/*
959d769041fSSteven Rostedt 	 * The iterator could be on the reader page (it starts there).
960d769041fSSteven Rostedt 	 * But the head could have moved, since the reader was
961d769041fSSteven Rostedt 	 * found. Check for this case and assign the iterator
962d769041fSSteven Rostedt 	 * to the head page instead of next.
963d769041fSSteven Rostedt 	 */
964d769041fSSteven Rostedt 	if (iter->head_page == cpu_buffer->reader_page)
965d769041fSSteven Rostedt 		iter->head_page = cpu_buffer->head_page;
966d769041fSSteven Rostedt 	else
967d769041fSSteven Rostedt 		rb_inc_page(cpu_buffer, &iter->head_page);
968d769041fSSteven Rostedt 
969abc9b56dSSteven Rostedt 	iter->read_stamp = iter->head_page->page->time_stamp;
9707a8e76a3SSteven Rostedt 	iter->head = 0;
9717a8e76a3SSteven Rostedt }
9727a8e76a3SSteven Rostedt 
9737a8e76a3SSteven Rostedt /**
9747a8e76a3SSteven Rostedt  * ring_buffer_update_event - update event type and data
9757a8e76a3SSteven Rostedt  * @event: the even to update
9767a8e76a3SSteven Rostedt  * @type: the type of event
9777a8e76a3SSteven Rostedt  * @length: the size of the event field in the ring buffer
9787a8e76a3SSteven Rostedt  *
9797a8e76a3SSteven Rostedt  * Update the type and data fields of the event. The length
9807a8e76a3SSteven Rostedt  * is the actual size that is written to the ring buffer,
9817a8e76a3SSteven Rostedt  * and with this, we can determine what to place into the
9827a8e76a3SSteven Rostedt  * data field.
9837a8e76a3SSteven Rostedt  */
98434a148bfSAndrew Morton static void
9857a8e76a3SSteven Rostedt rb_update_event(struct ring_buffer_event *event,
9867a8e76a3SSteven Rostedt 			 unsigned type, unsigned length)
9877a8e76a3SSteven Rostedt {
9887a8e76a3SSteven Rostedt 	event->type = type;
9897a8e76a3SSteven Rostedt 
9907a8e76a3SSteven Rostedt 	switch (type) {
9917a8e76a3SSteven Rostedt 
9927a8e76a3SSteven Rostedt 	case RINGBUF_TYPE_PADDING:
9937a8e76a3SSteven Rostedt 		break;
9947a8e76a3SSteven Rostedt 
9957a8e76a3SSteven Rostedt 	case RINGBUF_TYPE_TIME_EXTEND:
99667d34724SAndrew Morton 		event->len = DIV_ROUND_UP(RB_LEN_TIME_EXTEND, RB_ALIGNMENT);
9977a8e76a3SSteven Rostedt 		break;
9987a8e76a3SSteven Rostedt 
9997a8e76a3SSteven Rostedt 	case RINGBUF_TYPE_TIME_STAMP:
100067d34724SAndrew Morton 		event->len = DIV_ROUND_UP(RB_LEN_TIME_STAMP, RB_ALIGNMENT);
10017a8e76a3SSteven Rostedt 		break;
10027a8e76a3SSteven Rostedt 
10037a8e76a3SSteven Rostedt 	case RINGBUF_TYPE_DATA:
10047a8e76a3SSteven Rostedt 		length -= RB_EVNT_HDR_SIZE;
10057a8e76a3SSteven Rostedt 		if (length > RB_MAX_SMALL_DATA) {
10067a8e76a3SSteven Rostedt 			event->len = 0;
10077a8e76a3SSteven Rostedt 			event->array[0] = length;
10087a8e76a3SSteven Rostedt 		} else
100967d34724SAndrew Morton 			event->len = DIV_ROUND_UP(length, RB_ALIGNMENT);
10107a8e76a3SSteven Rostedt 		break;
10117a8e76a3SSteven Rostedt 	default:
10127a8e76a3SSteven Rostedt 		BUG();
10137a8e76a3SSteven Rostedt 	}
10147a8e76a3SSteven Rostedt }
10157a8e76a3SSteven Rostedt 
101634a148bfSAndrew Morton static unsigned rb_calculate_event_length(unsigned length)
10177a8e76a3SSteven Rostedt {
10187a8e76a3SSteven Rostedt 	struct ring_buffer_event event; /* Used only for sizeof array */
10197a8e76a3SSteven Rostedt 
10207a8e76a3SSteven Rostedt 	/* zero length can cause confusions */
10217a8e76a3SSteven Rostedt 	if (!length)
10227a8e76a3SSteven Rostedt 		length = 1;
10237a8e76a3SSteven Rostedt 
10247a8e76a3SSteven Rostedt 	if (length > RB_MAX_SMALL_DATA)
10257a8e76a3SSteven Rostedt 		length += sizeof(event.array[0]);
10267a8e76a3SSteven Rostedt 
10277a8e76a3SSteven Rostedt 	length += RB_EVNT_HDR_SIZE;
10287a8e76a3SSteven Rostedt 	length = ALIGN(length, RB_ALIGNMENT);
10297a8e76a3SSteven Rostedt 
10307a8e76a3SSteven Rostedt 	return length;
10317a8e76a3SSteven Rostedt }
10327a8e76a3SSteven Rostedt 
10337a8e76a3SSteven Rostedt static struct ring_buffer_event *
10347a8e76a3SSteven Rostedt __rb_reserve_next(struct ring_buffer_per_cpu *cpu_buffer,
10357a8e76a3SSteven Rostedt 		  unsigned type, unsigned long length, u64 *ts)
10367a8e76a3SSteven Rostedt {
103798db8df7SSteven Rostedt 	struct buffer_page *tail_page, *head_page, *reader_page, *commit_page;
1038bf41a158SSteven Rostedt 	unsigned long tail, write;
10397a8e76a3SSteven Rostedt 	struct ring_buffer *buffer = cpu_buffer->buffer;
10407a8e76a3SSteven Rostedt 	struct ring_buffer_event *event;
1041bf41a158SSteven Rostedt 	unsigned long flags;
104278d904b4SSteven Rostedt 	bool lock_taken = false;
10437a8e76a3SSteven Rostedt 
104498db8df7SSteven Rostedt 	commit_page = cpu_buffer->commit_page;
104598db8df7SSteven Rostedt 	/* we just need to protect against interrupts */
104698db8df7SSteven Rostedt 	barrier();
10477a8e76a3SSteven Rostedt 	tail_page = cpu_buffer->tail_page;
1048bf41a158SSteven Rostedt 	write = local_add_return(length, &tail_page->write);
1049bf41a158SSteven Rostedt 	tail = write - length;
10507a8e76a3SSteven Rostedt 
1051bf41a158SSteven Rostedt 	/* See if we shot pass the end of this buffer page */
1052bf41a158SSteven Rostedt 	if (write > BUF_PAGE_SIZE) {
10537a8e76a3SSteven Rostedt 		struct buffer_page *next_page = tail_page;
10547a8e76a3SSteven Rostedt 
10553e03fb7fSSteven Rostedt 		local_irq_save(flags);
105678d904b4SSteven Rostedt 		/*
1057a81bd80aSSteven Rostedt 		 * Since the write to the buffer is still not
1058a81bd80aSSteven Rostedt 		 * fully lockless, we must be careful with NMIs.
1059a81bd80aSSteven Rostedt 		 * The locks in the writers are taken when a write
1060a81bd80aSSteven Rostedt 		 * crosses to a new page. The locks protect against
1061a81bd80aSSteven Rostedt 		 * races with the readers (this will soon be fixed
1062a81bd80aSSteven Rostedt 		 * with a lockless solution).
1063a81bd80aSSteven Rostedt 		 *
1064a81bd80aSSteven Rostedt 		 * Because we can not protect against NMIs, and we
1065a81bd80aSSteven Rostedt 		 * want to keep traces reentrant, we need to manage
1066a81bd80aSSteven Rostedt 		 * what happens when we are in an NMI.
1067a81bd80aSSteven Rostedt 		 *
106878d904b4SSteven Rostedt 		 * NMIs can happen after we take the lock.
106978d904b4SSteven Rostedt 		 * If we are in an NMI, only take the lock
107078d904b4SSteven Rostedt 		 * if it is not already taken. Otherwise
107178d904b4SSteven Rostedt 		 * simply fail.
107278d904b4SSteven Rostedt 		 */
1073a81bd80aSSteven Rostedt 		if (unlikely(in_nmi())) {
107478d904b4SSteven Rostedt 			if (!__raw_spin_trylock(&cpu_buffer->lock))
107545141d46SSteven Rostedt 				goto out_reset;
107678d904b4SSteven Rostedt 		} else
10773e03fb7fSSteven Rostedt 			__raw_spin_lock(&cpu_buffer->lock);
1078bf41a158SSteven Rostedt 
107978d904b4SSteven Rostedt 		lock_taken = true;
108078d904b4SSteven Rostedt 
10817a8e76a3SSteven Rostedt 		rb_inc_page(cpu_buffer, &next_page);
10827a8e76a3SSteven Rostedt 
1083d769041fSSteven Rostedt 		head_page = cpu_buffer->head_page;
1084d769041fSSteven Rostedt 		reader_page = cpu_buffer->reader_page;
1085d769041fSSteven Rostedt 
1086d769041fSSteven Rostedt 		/* we grabbed the lock before incrementing */
10873e89c7bbSSteven Rostedt 		if (RB_WARN_ON(cpu_buffer, next_page == reader_page))
108845141d46SSteven Rostedt 			goto out_reset;
1089bf41a158SSteven Rostedt 
1090bf41a158SSteven Rostedt 		/*
1091bf41a158SSteven Rostedt 		 * If for some reason, we had an interrupt storm that made
1092bf41a158SSteven Rostedt 		 * it all the way around the buffer, bail, and warn
1093bf41a158SSteven Rostedt 		 * about it.
1094bf41a158SSteven Rostedt 		 */
109598db8df7SSteven Rostedt 		if (unlikely(next_page == commit_page)) {
1096bf41a158SSteven Rostedt 			WARN_ON_ONCE(1);
109745141d46SSteven Rostedt 			goto out_reset;
1098bf41a158SSteven Rostedt 		}
1099d769041fSSteven Rostedt 
11007a8e76a3SSteven Rostedt 		if (next_page == head_page) {
11016f3b3440SLai Jiangshan 			if (!(buffer->flags & RB_FL_OVERWRITE))
110245141d46SSteven Rostedt 				goto out_reset;
11037a8e76a3SSteven Rostedt 
1104bf41a158SSteven Rostedt 			/* tail_page has not moved yet? */
1105bf41a158SSteven Rostedt 			if (tail_page == cpu_buffer->tail_page) {
11067a8e76a3SSteven Rostedt 				/* count overflows */
11077a8e76a3SSteven Rostedt 				rb_update_overflow(cpu_buffer);
11087a8e76a3SSteven Rostedt 
11097a8e76a3SSteven Rostedt 				rb_inc_page(cpu_buffer, &head_page);
11107a8e76a3SSteven Rostedt 				cpu_buffer->head_page = head_page;
1111bf41a158SSteven Rostedt 				cpu_buffer->head_page->read = 0;
1112bf41a158SSteven Rostedt 			}
11137a8e76a3SSteven Rostedt 		}
11147a8e76a3SSteven Rostedt 
1115bf41a158SSteven Rostedt 		/*
1116bf41a158SSteven Rostedt 		 * If the tail page is still the same as what we think
1117bf41a158SSteven Rostedt 		 * it is, then it is up to us to update the tail
1118bf41a158SSteven Rostedt 		 * pointer.
1119bf41a158SSteven Rostedt 		 */
1120bf41a158SSteven Rostedt 		if (tail_page == cpu_buffer->tail_page) {
1121bf41a158SSteven Rostedt 			local_set(&next_page->write, 0);
1122abc9b56dSSteven Rostedt 			local_set(&next_page->page->commit, 0);
1123bf41a158SSteven Rostedt 			cpu_buffer->tail_page = next_page;
1124bf41a158SSteven Rostedt 
1125bf41a158SSteven Rostedt 			/* reread the time stamp */
1126bf41a158SSteven Rostedt 			*ts = ring_buffer_time_stamp(cpu_buffer->cpu);
1127abc9b56dSSteven Rostedt 			cpu_buffer->tail_page->page->time_stamp = *ts;
1128bf41a158SSteven Rostedt 		}
1129bf41a158SSteven Rostedt 
1130bf41a158SSteven Rostedt 		/*
1131bf41a158SSteven Rostedt 		 * The actual tail page has moved forward.
1132bf41a158SSteven Rostedt 		 */
1133bf41a158SSteven Rostedt 		if (tail < BUF_PAGE_SIZE) {
1134bf41a158SSteven Rostedt 			/* Mark the rest of the page with padding */
11356f807acdSSteven Rostedt 			event = __rb_page_index(tail_page, tail);
11367a8e76a3SSteven Rostedt 			event->type = RINGBUF_TYPE_PADDING;
11377a8e76a3SSteven Rostedt 		}
11387a8e76a3SSteven Rostedt 
1139bf41a158SSteven Rostedt 		if (tail <= BUF_PAGE_SIZE)
1140bf41a158SSteven Rostedt 			/* Set the write back to the previous setting */
1141bf41a158SSteven Rostedt 			local_set(&tail_page->write, tail);
1142bf41a158SSteven Rostedt 
1143bf41a158SSteven Rostedt 		/*
1144bf41a158SSteven Rostedt 		 * If this was a commit entry that failed,
1145bf41a158SSteven Rostedt 		 * increment that too
1146bf41a158SSteven Rostedt 		 */
1147bf41a158SSteven Rostedt 		if (tail_page == cpu_buffer->commit_page &&
1148bf41a158SSteven Rostedt 		    tail == rb_commit_index(cpu_buffer)) {
1149bf41a158SSteven Rostedt 			rb_set_commit_to_write(cpu_buffer);
11507a8e76a3SSteven Rostedt 		}
11517a8e76a3SSteven Rostedt 
11523e03fb7fSSteven Rostedt 		__raw_spin_unlock(&cpu_buffer->lock);
11533e03fb7fSSteven Rostedt 		local_irq_restore(flags);
1154bf41a158SSteven Rostedt 
1155bf41a158SSteven Rostedt 		/* fail and let the caller try again */
1156bf41a158SSteven Rostedt 		return ERR_PTR(-EAGAIN);
1157bf41a158SSteven Rostedt 	}
1158bf41a158SSteven Rostedt 
1159bf41a158SSteven Rostedt 	/* We reserved something on the buffer */
1160bf41a158SSteven Rostedt 
11613e89c7bbSSteven Rostedt 	if (RB_WARN_ON(cpu_buffer, write > BUF_PAGE_SIZE))
11623e89c7bbSSteven Rostedt 		return NULL;
11637a8e76a3SSteven Rostedt 
11646f807acdSSteven Rostedt 	event = __rb_page_index(tail_page, tail);
11657a8e76a3SSteven Rostedt 	rb_update_event(event, type, length);
11667a8e76a3SSteven Rostedt 
1167bf41a158SSteven Rostedt 	/*
1168bf41a158SSteven Rostedt 	 * If this is a commit and the tail is zero, then update
1169bf41a158SSteven Rostedt 	 * this page's time stamp.
1170bf41a158SSteven Rostedt 	 */
1171bf41a158SSteven Rostedt 	if (!tail && rb_is_commit(cpu_buffer, event))
1172abc9b56dSSteven Rostedt 		cpu_buffer->commit_page->page->time_stamp = *ts;
1173bf41a158SSteven Rostedt 
11747a8e76a3SSteven Rostedt 	return event;
1175bf41a158SSteven Rostedt 
117645141d46SSteven Rostedt  out_reset:
11776f3b3440SLai Jiangshan 	/* reset write */
11786f3b3440SLai Jiangshan 	if (tail <= BUF_PAGE_SIZE)
11796f3b3440SLai Jiangshan 		local_set(&tail_page->write, tail);
11806f3b3440SLai Jiangshan 
118178d904b4SSteven Rostedt 	if (likely(lock_taken))
11823e03fb7fSSteven Rostedt 		__raw_spin_unlock(&cpu_buffer->lock);
11833e03fb7fSSteven Rostedt 	local_irq_restore(flags);
1184bf41a158SSteven Rostedt 	return NULL;
11857a8e76a3SSteven Rostedt }
11867a8e76a3SSteven Rostedt 
11877a8e76a3SSteven Rostedt static int
11887a8e76a3SSteven Rostedt rb_add_time_stamp(struct ring_buffer_per_cpu *cpu_buffer,
11897a8e76a3SSteven Rostedt 		  u64 *ts, u64 *delta)
11907a8e76a3SSteven Rostedt {
11917a8e76a3SSteven Rostedt 	struct ring_buffer_event *event;
11927a8e76a3SSteven Rostedt 	static int once;
1193bf41a158SSteven Rostedt 	int ret;
11947a8e76a3SSteven Rostedt 
11957a8e76a3SSteven Rostedt 	if (unlikely(*delta > (1ULL << 59) && !once++)) {
11967a8e76a3SSteven Rostedt 		printk(KERN_WARNING "Delta way too big! %llu"
11977a8e76a3SSteven Rostedt 		       " ts=%llu write stamp = %llu\n",
1198e2862c94SStephen Rothwell 		       (unsigned long long)*delta,
1199e2862c94SStephen Rothwell 		       (unsigned long long)*ts,
1200e2862c94SStephen Rothwell 		       (unsigned long long)cpu_buffer->write_stamp);
12017a8e76a3SSteven Rostedt 		WARN_ON(1);
12027a8e76a3SSteven Rostedt 	}
12037a8e76a3SSteven Rostedt 
12047a8e76a3SSteven Rostedt 	/*
12057a8e76a3SSteven Rostedt 	 * The delta is too big, we to add a
12067a8e76a3SSteven Rostedt 	 * new timestamp.
12077a8e76a3SSteven Rostedt 	 */
12087a8e76a3SSteven Rostedt 	event = __rb_reserve_next(cpu_buffer,
12097a8e76a3SSteven Rostedt 				  RINGBUF_TYPE_TIME_EXTEND,
12107a8e76a3SSteven Rostedt 				  RB_LEN_TIME_EXTEND,
12117a8e76a3SSteven Rostedt 				  ts);
12127a8e76a3SSteven Rostedt 	if (!event)
1213bf41a158SSteven Rostedt 		return -EBUSY;
12147a8e76a3SSteven Rostedt 
1215bf41a158SSteven Rostedt 	if (PTR_ERR(event) == -EAGAIN)
1216bf41a158SSteven Rostedt 		return -EAGAIN;
1217bf41a158SSteven Rostedt 
1218bf41a158SSteven Rostedt 	/* Only a commited time event can update the write stamp */
1219bf41a158SSteven Rostedt 	if (rb_is_commit(cpu_buffer, event)) {
1220bf41a158SSteven Rostedt 		/*
1221bf41a158SSteven Rostedt 		 * If this is the first on the page, then we need to
1222bf41a158SSteven Rostedt 		 * update the page itself, and just put in a zero.
1223bf41a158SSteven Rostedt 		 */
1224bf41a158SSteven Rostedt 		if (rb_event_index(event)) {
12257a8e76a3SSteven Rostedt 			event->time_delta = *delta & TS_MASK;
12267a8e76a3SSteven Rostedt 			event->array[0] = *delta >> TS_SHIFT;
1227bf41a158SSteven Rostedt 		} else {
1228abc9b56dSSteven Rostedt 			cpu_buffer->commit_page->page->time_stamp = *ts;
1229bf41a158SSteven Rostedt 			event->time_delta = 0;
1230bf41a158SSteven Rostedt 			event->array[0] = 0;
1231bf41a158SSteven Rostedt 		}
12327a8e76a3SSteven Rostedt 		cpu_buffer->write_stamp = *ts;
1233bf41a158SSteven Rostedt 		/* let the caller know this was the commit */
1234bf41a158SSteven Rostedt 		ret = 1;
1235bf41a158SSteven Rostedt 	} else {
1236bf41a158SSteven Rostedt 		/* Darn, this is just wasted space */
1237bf41a158SSteven Rostedt 		event->time_delta = 0;
1238bf41a158SSteven Rostedt 		event->array[0] = 0;
1239bf41a158SSteven Rostedt 		ret = 0;
12407a8e76a3SSteven Rostedt 	}
12417a8e76a3SSteven Rostedt 
1242bf41a158SSteven Rostedt 	*delta = 0;
1243bf41a158SSteven Rostedt 
1244bf41a158SSteven Rostedt 	return ret;
12457a8e76a3SSteven Rostedt }
12467a8e76a3SSteven Rostedt 
12477a8e76a3SSteven Rostedt static struct ring_buffer_event *
12487a8e76a3SSteven Rostedt rb_reserve_next_event(struct ring_buffer_per_cpu *cpu_buffer,
12497a8e76a3SSteven Rostedt 		      unsigned type, unsigned long length)
12507a8e76a3SSteven Rostedt {
12517a8e76a3SSteven Rostedt 	struct ring_buffer_event *event;
12527a8e76a3SSteven Rostedt 	u64 ts, delta;
1253bf41a158SSteven Rostedt 	int commit = 0;
1254818e3dd3SSteven Rostedt 	int nr_loops = 0;
12557a8e76a3SSteven Rostedt 
1256bf41a158SSteven Rostedt  again:
1257818e3dd3SSteven Rostedt 	/*
1258818e3dd3SSteven Rostedt 	 * We allow for interrupts to reenter here and do a trace.
1259818e3dd3SSteven Rostedt 	 * If one does, it will cause this original code to loop
1260818e3dd3SSteven Rostedt 	 * back here. Even with heavy interrupts happening, this
1261818e3dd3SSteven Rostedt 	 * should only happen a few times in a row. If this happens
1262818e3dd3SSteven Rostedt 	 * 1000 times in a row, there must be either an interrupt
1263818e3dd3SSteven Rostedt 	 * storm or we have something buggy.
1264818e3dd3SSteven Rostedt 	 * Bail!
1265818e3dd3SSteven Rostedt 	 */
12663e89c7bbSSteven Rostedt 	if (RB_WARN_ON(cpu_buffer, ++nr_loops > 1000))
1267818e3dd3SSteven Rostedt 		return NULL;
1268818e3dd3SSteven Rostedt 
12697a8e76a3SSteven Rostedt 	ts = ring_buffer_time_stamp(cpu_buffer->cpu);
12707a8e76a3SSteven Rostedt 
1271bf41a158SSteven Rostedt 	/*
1272bf41a158SSteven Rostedt 	 * Only the first commit can update the timestamp.
1273bf41a158SSteven Rostedt 	 * Yes there is a race here. If an interrupt comes in
1274bf41a158SSteven Rostedt 	 * just after the conditional and it traces too, then it
1275bf41a158SSteven Rostedt 	 * will also check the deltas. More than one timestamp may
1276bf41a158SSteven Rostedt 	 * also be made. But only the entry that did the actual
1277bf41a158SSteven Rostedt 	 * commit will be something other than zero.
1278bf41a158SSteven Rostedt 	 */
1279bf41a158SSteven Rostedt 	if (cpu_buffer->tail_page == cpu_buffer->commit_page &&
1280bf41a158SSteven Rostedt 	    rb_page_write(cpu_buffer->tail_page) ==
1281bf41a158SSteven Rostedt 	    rb_commit_index(cpu_buffer)) {
1282bf41a158SSteven Rostedt 
12837a8e76a3SSteven Rostedt 		delta = ts - cpu_buffer->write_stamp;
12847a8e76a3SSteven Rostedt 
1285bf41a158SSteven Rostedt 		/* make sure this delta is calculated here */
1286bf41a158SSteven Rostedt 		barrier();
12877a8e76a3SSteven Rostedt 
1288bf41a158SSteven Rostedt 		/* Did the write stamp get updated already? */
1289bf41a158SSteven Rostedt 		if (unlikely(ts < cpu_buffer->write_stamp))
12904143c5cbSSteven Rostedt 			delta = 0;
1291bf41a158SSteven Rostedt 
1292bf41a158SSteven Rostedt 		if (test_time_stamp(delta)) {
1293bf41a158SSteven Rostedt 
1294bf41a158SSteven Rostedt 			commit = rb_add_time_stamp(cpu_buffer, &ts, &delta);
1295bf41a158SSteven Rostedt 
1296bf41a158SSteven Rostedt 			if (commit == -EBUSY)
12977a8e76a3SSteven Rostedt 				return NULL;
1298bf41a158SSteven Rostedt 
1299bf41a158SSteven Rostedt 			if (commit == -EAGAIN)
1300bf41a158SSteven Rostedt 				goto again;
1301bf41a158SSteven Rostedt 
1302bf41a158SSteven Rostedt 			RB_WARN_ON(cpu_buffer, commit < 0);
13037a8e76a3SSteven Rostedt 		}
1304bf41a158SSteven Rostedt 	} else
1305bf41a158SSteven Rostedt 		/* Non commits have zero deltas */
13067a8e76a3SSteven Rostedt 		delta = 0;
13077a8e76a3SSteven Rostedt 
13087a8e76a3SSteven Rostedt 	event = __rb_reserve_next(cpu_buffer, type, length, &ts);
1309bf41a158SSteven Rostedt 	if (PTR_ERR(event) == -EAGAIN)
1310bf41a158SSteven Rostedt 		goto again;
13117a8e76a3SSteven Rostedt 
1312bf41a158SSteven Rostedt 	if (!event) {
1313bf41a158SSteven Rostedt 		if (unlikely(commit))
1314bf41a158SSteven Rostedt 			/*
1315bf41a158SSteven Rostedt 			 * Ouch! We needed a timestamp and it was commited. But
1316bf41a158SSteven Rostedt 			 * we didn't get our event reserved.
1317bf41a158SSteven Rostedt 			 */
1318bf41a158SSteven Rostedt 			rb_set_commit_to_write(cpu_buffer);
1319bf41a158SSteven Rostedt 		return NULL;
1320bf41a158SSteven Rostedt 	}
1321bf41a158SSteven Rostedt 
1322bf41a158SSteven Rostedt 	/*
1323bf41a158SSteven Rostedt 	 * If the timestamp was commited, make the commit our entry
1324bf41a158SSteven Rostedt 	 * now so that we will update it when needed.
1325bf41a158SSteven Rostedt 	 */
1326bf41a158SSteven Rostedt 	if (commit)
1327bf41a158SSteven Rostedt 		rb_set_commit_event(cpu_buffer, event);
1328bf41a158SSteven Rostedt 	else if (!rb_is_commit(cpu_buffer, event))
13297a8e76a3SSteven Rostedt 		delta = 0;
13307a8e76a3SSteven Rostedt 
13317a8e76a3SSteven Rostedt 	event->time_delta = delta;
13327a8e76a3SSteven Rostedt 
13337a8e76a3SSteven Rostedt 	return event;
13347a8e76a3SSteven Rostedt }
13357a8e76a3SSteven Rostedt 
1336bf41a158SSteven Rostedt static DEFINE_PER_CPU(int, rb_need_resched);
1337bf41a158SSteven Rostedt 
13387a8e76a3SSteven Rostedt /**
13397a8e76a3SSteven Rostedt  * ring_buffer_lock_reserve - reserve a part of the buffer
13407a8e76a3SSteven Rostedt  * @buffer: the ring buffer to reserve from
13417a8e76a3SSteven Rostedt  * @length: the length of the data to reserve (excluding event header)
13427a8e76a3SSteven Rostedt  *
13437a8e76a3SSteven Rostedt  * Returns a reseverd event on the ring buffer to copy directly to.
13447a8e76a3SSteven Rostedt  * The user of this interface will need to get the body to write into
13457a8e76a3SSteven Rostedt  * and can use the ring_buffer_event_data() interface.
13467a8e76a3SSteven Rostedt  *
13477a8e76a3SSteven Rostedt  * The length is the length of the data needed, not the event length
13487a8e76a3SSteven Rostedt  * which also includes the event header.
13497a8e76a3SSteven Rostedt  *
13507a8e76a3SSteven Rostedt  * Must be paired with ring_buffer_unlock_commit, unless NULL is returned.
13517a8e76a3SSteven Rostedt  * If NULL is returned, then nothing has been allocated or locked.
13527a8e76a3SSteven Rostedt  */
13537a8e76a3SSteven Rostedt struct ring_buffer_event *
13540a987751SArnaldo Carvalho de Melo ring_buffer_lock_reserve(struct ring_buffer *buffer, unsigned long length)
13557a8e76a3SSteven Rostedt {
13567a8e76a3SSteven Rostedt 	struct ring_buffer_per_cpu *cpu_buffer;
13577a8e76a3SSteven Rostedt 	struct ring_buffer_event *event;
1358bf41a158SSteven Rostedt 	int cpu, resched;
13597a8e76a3SSteven Rostedt 
1360033601a3SSteven Rostedt 	if (ring_buffer_flags != RB_BUFFERS_ON)
1361a3583244SSteven Rostedt 		return NULL;
1362a3583244SSteven Rostedt 
13637a8e76a3SSteven Rostedt 	if (atomic_read(&buffer->record_disabled))
13647a8e76a3SSteven Rostedt 		return NULL;
13657a8e76a3SSteven Rostedt 
1366bf41a158SSteven Rostedt 	/* If we are tracing schedule, we don't want to recurse */
1367182e9f5fSSteven Rostedt 	resched = ftrace_preempt_disable();
1368bf41a158SSteven Rostedt 
13697a8e76a3SSteven Rostedt 	cpu = raw_smp_processor_id();
13707a8e76a3SSteven Rostedt 
13719e01c1b7SRusty Russell 	if (!cpumask_test_cpu(cpu, buffer->cpumask))
1372d769041fSSteven Rostedt 		goto out;
13737a8e76a3SSteven Rostedt 
13747a8e76a3SSteven Rostedt 	cpu_buffer = buffer->buffers[cpu];
13757a8e76a3SSteven Rostedt 
13767a8e76a3SSteven Rostedt 	if (atomic_read(&cpu_buffer->record_disabled))
1377d769041fSSteven Rostedt 		goto out;
13787a8e76a3SSteven Rostedt 
13797a8e76a3SSteven Rostedt 	length = rb_calculate_event_length(length);
13807a8e76a3SSteven Rostedt 	if (length > BUF_PAGE_SIZE)
1381bf41a158SSteven Rostedt 		goto out;
13827a8e76a3SSteven Rostedt 
13837a8e76a3SSteven Rostedt 	event = rb_reserve_next_event(cpu_buffer, RINGBUF_TYPE_DATA, length);
13847a8e76a3SSteven Rostedt 	if (!event)
1385d769041fSSteven Rostedt 		goto out;
13867a8e76a3SSteven Rostedt 
1387bf41a158SSteven Rostedt 	/*
1388bf41a158SSteven Rostedt 	 * Need to store resched state on this cpu.
1389bf41a158SSteven Rostedt 	 * Only the first needs to.
1390bf41a158SSteven Rostedt 	 */
1391bf41a158SSteven Rostedt 
1392bf41a158SSteven Rostedt 	if (preempt_count() == 1)
1393bf41a158SSteven Rostedt 		per_cpu(rb_need_resched, cpu) = resched;
1394bf41a158SSteven Rostedt 
13957a8e76a3SSteven Rostedt 	return event;
13967a8e76a3SSteven Rostedt 
1397d769041fSSteven Rostedt  out:
1398182e9f5fSSteven Rostedt 	ftrace_preempt_enable(resched);
13997a8e76a3SSteven Rostedt 	return NULL;
14007a8e76a3SSteven Rostedt }
1401c4f50183SRobert Richter EXPORT_SYMBOL_GPL(ring_buffer_lock_reserve);
14027a8e76a3SSteven Rostedt 
14037a8e76a3SSteven Rostedt static void rb_commit(struct ring_buffer_per_cpu *cpu_buffer,
14047a8e76a3SSteven Rostedt 		      struct ring_buffer_event *event)
14057a8e76a3SSteven Rostedt {
14067a8e76a3SSteven Rostedt 	cpu_buffer->entries++;
1407bf41a158SSteven Rostedt 
1408bf41a158SSteven Rostedt 	/* Only process further if we own the commit */
1409bf41a158SSteven Rostedt 	if (!rb_is_commit(cpu_buffer, event))
1410bf41a158SSteven Rostedt 		return;
1411bf41a158SSteven Rostedt 
1412bf41a158SSteven Rostedt 	cpu_buffer->write_stamp += event->time_delta;
1413bf41a158SSteven Rostedt 
1414bf41a158SSteven Rostedt 	rb_set_commit_to_write(cpu_buffer);
14157a8e76a3SSteven Rostedt }
14167a8e76a3SSteven Rostedt 
14177a8e76a3SSteven Rostedt /**
14187a8e76a3SSteven Rostedt  * ring_buffer_unlock_commit - commit a reserved
14197a8e76a3SSteven Rostedt  * @buffer: The buffer to commit to
14207a8e76a3SSteven Rostedt  * @event: The event pointer to commit.
14217a8e76a3SSteven Rostedt  *
14227a8e76a3SSteven Rostedt  * This commits the data to the ring buffer, and releases any locks held.
14237a8e76a3SSteven Rostedt  *
14247a8e76a3SSteven Rostedt  * Must be paired with ring_buffer_lock_reserve.
14257a8e76a3SSteven Rostedt  */
14267a8e76a3SSteven Rostedt int ring_buffer_unlock_commit(struct ring_buffer *buffer,
14270a987751SArnaldo Carvalho de Melo 			      struct ring_buffer_event *event)
14287a8e76a3SSteven Rostedt {
14297a8e76a3SSteven Rostedt 	struct ring_buffer_per_cpu *cpu_buffer;
14307a8e76a3SSteven Rostedt 	int cpu = raw_smp_processor_id();
14317a8e76a3SSteven Rostedt 
14327a8e76a3SSteven Rostedt 	cpu_buffer = buffer->buffers[cpu];
14337a8e76a3SSteven Rostedt 
14347a8e76a3SSteven Rostedt 	rb_commit(cpu_buffer, event);
14357a8e76a3SSteven Rostedt 
1436bf41a158SSteven Rostedt 	/*
1437bf41a158SSteven Rostedt 	 * Only the last preempt count needs to restore preemption.
1438bf41a158SSteven Rostedt 	 */
1439182e9f5fSSteven Rostedt 	if (preempt_count() == 1)
1440182e9f5fSSteven Rostedt 		ftrace_preempt_enable(per_cpu(rb_need_resched, cpu));
1441bf41a158SSteven Rostedt 	else
1442bf41a158SSteven Rostedt 		preempt_enable_no_resched_notrace();
14437a8e76a3SSteven Rostedt 
14447a8e76a3SSteven Rostedt 	return 0;
14457a8e76a3SSteven Rostedt }
1446c4f50183SRobert Richter EXPORT_SYMBOL_GPL(ring_buffer_unlock_commit);
14477a8e76a3SSteven Rostedt 
14487a8e76a3SSteven Rostedt /**
14497a8e76a3SSteven Rostedt  * ring_buffer_write - write data to the buffer without reserving
14507a8e76a3SSteven Rostedt  * @buffer: The ring buffer to write to.
14517a8e76a3SSteven Rostedt  * @length: The length of the data being written (excluding the event header)
14527a8e76a3SSteven Rostedt  * @data: The data to write to the buffer.
14537a8e76a3SSteven Rostedt  *
14547a8e76a3SSteven Rostedt  * This is like ring_buffer_lock_reserve and ring_buffer_unlock_commit as
14557a8e76a3SSteven Rostedt  * one function. If you already have the data to write to the buffer, it
14567a8e76a3SSteven Rostedt  * may be easier to simply call this function.
14577a8e76a3SSteven Rostedt  *
14587a8e76a3SSteven Rostedt  * Note, like ring_buffer_lock_reserve, the length is the length of the data
14597a8e76a3SSteven Rostedt  * and not the length of the event which would hold the header.
14607a8e76a3SSteven Rostedt  */
14617a8e76a3SSteven Rostedt int ring_buffer_write(struct ring_buffer *buffer,
14627a8e76a3SSteven Rostedt 			unsigned long length,
14637a8e76a3SSteven Rostedt 			void *data)
14647a8e76a3SSteven Rostedt {
14657a8e76a3SSteven Rostedt 	struct ring_buffer_per_cpu *cpu_buffer;
14667a8e76a3SSteven Rostedt 	struct ring_buffer_event *event;
1467bf41a158SSteven Rostedt 	unsigned long event_length;
14687a8e76a3SSteven Rostedt 	void *body;
14697a8e76a3SSteven Rostedt 	int ret = -EBUSY;
1470bf41a158SSteven Rostedt 	int cpu, resched;
14717a8e76a3SSteven Rostedt 
1472033601a3SSteven Rostedt 	if (ring_buffer_flags != RB_BUFFERS_ON)
1473a3583244SSteven Rostedt 		return -EBUSY;
1474a3583244SSteven Rostedt 
14757a8e76a3SSteven Rostedt 	if (atomic_read(&buffer->record_disabled))
14767a8e76a3SSteven Rostedt 		return -EBUSY;
14777a8e76a3SSteven Rostedt 
1478182e9f5fSSteven Rostedt 	resched = ftrace_preempt_disable();
1479bf41a158SSteven Rostedt 
14807a8e76a3SSteven Rostedt 	cpu = raw_smp_processor_id();
14817a8e76a3SSteven Rostedt 
14829e01c1b7SRusty Russell 	if (!cpumask_test_cpu(cpu, buffer->cpumask))
1483d769041fSSteven Rostedt 		goto out;
14847a8e76a3SSteven Rostedt 
14857a8e76a3SSteven Rostedt 	cpu_buffer = buffer->buffers[cpu];
14867a8e76a3SSteven Rostedt 
14877a8e76a3SSteven Rostedt 	if (atomic_read(&cpu_buffer->record_disabled))
14887a8e76a3SSteven Rostedt 		goto out;
14897a8e76a3SSteven Rostedt 
14907a8e76a3SSteven Rostedt 	event_length = rb_calculate_event_length(length);
14917a8e76a3SSteven Rostedt 	event = rb_reserve_next_event(cpu_buffer,
14927a8e76a3SSteven Rostedt 				      RINGBUF_TYPE_DATA, event_length);
14937a8e76a3SSteven Rostedt 	if (!event)
14947a8e76a3SSteven Rostedt 		goto out;
14957a8e76a3SSteven Rostedt 
14967a8e76a3SSteven Rostedt 	body = rb_event_data(event);
14977a8e76a3SSteven Rostedt 
14987a8e76a3SSteven Rostedt 	memcpy(body, data, length);
14997a8e76a3SSteven Rostedt 
15007a8e76a3SSteven Rostedt 	rb_commit(cpu_buffer, event);
15017a8e76a3SSteven Rostedt 
15027a8e76a3SSteven Rostedt 	ret = 0;
15037a8e76a3SSteven Rostedt  out:
1504182e9f5fSSteven Rostedt 	ftrace_preempt_enable(resched);
15057a8e76a3SSteven Rostedt 
15067a8e76a3SSteven Rostedt 	return ret;
15077a8e76a3SSteven Rostedt }
1508c4f50183SRobert Richter EXPORT_SYMBOL_GPL(ring_buffer_write);
15097a8e76a3SSteven Rostedt 
151034a148bfSAndrew Morton static int rb_per_cpu_empty(struct ring_buffer_per_cpu *cpu_buffer)
1511bf41a158SSteven Rostedt {
1512bf41a158SSteven Rostedt 	struct buffer_page *reader = cpu_buffer->reader_page;
1513bf41a158SSteven Rostedt 	struct buffer_page *head = cpu_buffer->head_page;
1514bf41a158SSteven Rostedt 	struct buffer_page *commit = cpu_buffer->commit_page;
1515bf41a158SSteven Rostedt 
1516bf41a158SSteven Rostedt 	return reader->read == rb_page_commit(reader) &&
1517bf41a158SSteven Rostedt 		(commit == reader ||
1518bf41a158SSteven Rostedt 		 (commit == head &&
1519bf41a158SSteven Rostedt 		  head->read == rb_page_commit(commit)));
1520bf41a158SSteven Rostedt }
1521bf41a158SSteven Rostedt 
15227a8e76a3SSteven Rostedt /**
15237a8e76a3SSteven Rostedt  * ring_buffer_record_disable - stop all writes into the buffer
15247a8e76a3SSteven Rostedt  * @buffer: The ring buffer to stop writes to.
15257a8e76a3SSteven Rostedt  *
15267a8e76a3SSteven Rostedt  * This prevents all writes to the buffer. Any attempt to write
15277a8e76a3SSteven Rostedt  * to the buffer after this will fail and return NULL.
15287a8e76a3SSteven Rostedt  *
15297a8e76a3SSteven Rostedt  * The caller should call synchronize_sched() after this.
15307a8e76a3SSteven Rostedt  */
15317a8e76a3SSteven Rostedt void ring_buffer_record_disable(struct ring_buffer *buffer)
15327a8e76a3SSteven Rostedt {
15337a8e76a3SSteven Rostedt 	atomic_inc(&buffer->record_disabled);
15347a8e76a3SSteven Rostedt }
1535c4f50183SRobert Richter EXPORT_SYMBOL_GPL(ring_buffer_record_disable);
15367a8e76a3SSteven Rostedt 
15377a8e76a3SSteven Rostedt /**
15387a8e76a3SSteven Rostedt  * ring_buffer_record_enable - enable writes to the buffer
15397a8e76a3SSteven Rostedt  * @buffer: The ring buffer to enable writes
15407a8e76a3SSteven Rostedt  *
15417a8e76a3SSteven Rostedt  * Note, multiple disables will need the same number of enables
15427a8e76a3SSteven Rostedt  * to truely enable the writing (much like preempt_disable).
15437a8e76a3SSteven Rostedt  */
15447a8e76a3SSteven Rostedt void ring_buffer_record_enable(struct ring_buffer *buffer)
15457a8e76a3SSteven Rostedt {
15467a8e76a3SSteven Rostedt 	atomic_dec(&buffer->record_disabled);
15477a8e76a3SSteven Rostedt }
1548c4f50183SRobert Richter EXPORT_SYMBOL_GPL(ring_buffer_record_enable);
15497a8e76a3SSteven Rostedt 
15507a8e76a3SSteven Rostedt /**
15517a8e76a3SSteven Rostedt  * ring_buffer_record_disable_cpu - stop all writes into the cpu_buffer
15527a8e76a3SSteven Rostedt  * @buffer: The ring buffer to stop writes to.
15537a8e76a3SSteven Rostedt  * @cpu: The CPU buffer to stop
15547a8e76a3SSteven Rostedt  *
15557a8e76a3SSteven Rostedt  * This prevents all writes to the buffer. Any attempt to write
15567a8e76a3SSteven Rostedt  * to the buffer after this will fail and return NULL.
15577a8e76a3SSteven Rostedt  *
15587a8e76a3SSteven Rostedt  * The caller should call synchronize_sched() after this.
15597a8e76a3SSteven Rostedt  */
15607a8e76a3SSteven Rostedt void ring_buffer_record_disable_cpu(struct ring_buffer *buffer, int cpu)
15617a8e76a3SSteven Rostedt {
15627a8e76a3SSteven Rostedt 	struct ring_buffer_per_cpu *cpu_buffer;
15637a8e76a3SSteven Rostedt 
1564554f786eSSteven Rostedt 	get_online_cpus();
1565554f786eSSteven Rostedt 
15669e01c1b7SRusty Russell 	if (!cpumask_test_cpu(cpu, buffer->cpumask))
1567554f786eSSteven Rostedt 		goto out;
15687a8e76a3SSteven Rostedt 
15697a8e76a3SSteven Rostedt 	cpu_buffer = buffer->buffers[cpu];
15707a8e76a3SSteven Rostedt 	atomic_inc(&cpu_buffer->record_disabled);
1571554f786eSSteven Rostedt  out:
1572554f786eSSteven Rostedt 	put_online_cpus();
15737a8e76a3SSteven Rostedt }
1574c4f50183SRobert Richter EXPORT_SYMBOL_GPL(ring_buffer_record_disable_cpu);
15757a8e76a3SSteven Rostedt 
15767a8e76a3SSteven Rostedt /**
15777a8e76a3SSteven Rostedt  * ring_buffer_record_enable_cpu - enable writes to the buffer
15787a8e76a3SSteven Rostedt  * @buffer: The ring buffer to enable writes
15797a8e76a3SSteven Rostedt  * @cpu: The CPU to enable.
15807a8e76a3SSteven Rostedt  *
15817a8e76a3SSteven Rostedt  * Note, multiple disables will need the same number of enables
15827a8e76a3SSteven Rostedt  * to truely enable the writing (much like preempt_disable).
15837a8e76a3SSteven Rostedt  */
15847a8e76a3SSteven Rostedt void ring_buffer_record_enable_cpu(struct ring_buffer *buffer, int cpu)
15857a8e76a3SSteven Rostedt {
15867a8e76a3SSteven Rostedt 	struct ring_buffer_per_cpu *cpu_buffer;
15877a8e76a3SSteven Rostedt 
1588554f786eSSteven Rostedt 	get_online_cpus();
1589554f786eSSteven Rostedt 
15909e01c1b7SRusty Russell 	if (!cpumask_test_cpu(cpu, buffer->cpumask))
1591554f786eSSteven Rostedt 		goto out;
15927a8e76a3SSteven Rostedt 
15937a8e76a3SSteven Rostedt 	cpu_buffer = buffer->buffers[cpu];
15947a8e76a3SSteven Rostedt 	atomic_dec(&cpu_buffer->record_disabled);
1595554f786eSSteven Rostedt  out:
1596554f786eSSteven Rostedt 	put_online_cpus();
15977a8e76a3SSteven Rostedt }
1598c4f50183SRobert Richter EXPORT_SYMBOL_GPL(ring_buffer_record_enable_cpu);
15997a8e76a3SSteven Rostedt 
16007a8e76a3SSteven Rostedt /**
16017a8e76a3SSteven Rostedt  * ring_buffer_entries_cpu - get the number of entries in a cpu buffer
16027a8e76a3SSteven Rostedt  * @buffer: The ring buffer
16037a8e76a3SSteven Rostedt  * @cpu: The per CPU buffer to get the entries from.
16047a8e76a3SSteven Rostedt  */
16057a8e76a3SSteven Rostedt unsigned long ring_buffer_entries_cpu(struct ring_buffer *buffer, int cpu)
16067a8e76a3SSteven Rostedt {
16077a8e76a3SSteven Rostedt 	struct ring_buffer_per_cpu *cpu_buffer;
1608554f786eSSteven Rostedt 	unsigned long ret = 0;
1609554f786eSSteven Rostedt 
1610554f786eSSteven Rostedt 	get_online_cpus();
16117a8e76a3SSteven Rostedt 
16129e01c1b7SRusty Russell 	if (!cpumask_test_cpu(cpu, buffer->cpumask))
1613554f786eSSteven Rostedt 		goto out;
16147a8e76a3SSteven Rostedt 
16157a8e76a3SSteven Rostedt 	cpu_buffer = buffer->buffers[cpu];
1616554f786eSSteven Rostedt 	ret = cpu_buffer->entries;
1617554f786eSSteven Rostedt  out:
1618554f786eSSteven Rostedt 	put_online_cpus();
1619554f786eSSteven Rostedt 
1620554f786eSSteven Rostedt 	return ret;
16217a8e76a3SSteven Rostedt }
1622c4f50183SRobert Richter EXPORT_SYMBOL_GPL(ring_buffer_entries_cpu);
16237a8e76a3SSteven Rostedt 
16247a8e76a3SSteven Rostedt /**
16257a8e76a3SSteven Rostedt  * ring_buffer_overrun_cpu - get the number of overruns in a cpu_buffer
16267a8e76a3SSteven Rostedt  * @buffer: The ring buffer
16277a8e76a3SSteven Rostedt  * @cpu: The per CPU buffer to get the number of overruns from
16287a8e76a3SSteven Rostedt  */
16297a8e76a3SSteven Rostedt unsigned long ring_buffer_overrun_cpu(struct ring_buffer *buffer, int cpu)
16307a8e76a3SSteven Rostedt {
16317a8e76a3SSteven Rostedt 	struct ring_buffer_per_cpu *cpu_buffer;
1632554f786eSSteven Rostedt 	unsigned long ret = 0;
1633554f786eSSteven Rostedt 
1634554f786eSSteven Rostedt 	get_online_cpus();
16357a8e76a3SSteven Rostedt 
16369e01c1b7SRusty Russell 	if (!cpumask_test_cpu(cpu, buffer->cpumask))
1637554f786eSSteven Rostedt 		goto out;
16387a8e76a3SSteven Rostedt 
16397a8e76a3SSteven Rostedt 	cpu_buffer = buffer->buffers[cpu];
1640554f786eSSteven Rostedt 	ret = cpu_buffer->overrun;
1641554f786eSSteven Rostedt  out:
1642554f786eSSteven Rostedt 	put_online_cpus();
1643554f786eSSteven Rostedt 
1644554f786eSSteven Rostedt 	return ret;
16457a8e76a3SSteven Rostedt }
1646c4f50183SRobert Richter EXPORT_SYMBOL_GPL(ring_buffer_overrun_cpu);
16477a8e76a3SSteven Rostedt 
16487a8e76a3SSteven Rostedt /**
16497a8e76a3SSteven Rostedt  * ring_buffer_entries - get the number of entries in a buffer
16507a8e76a3SSteven Rostedt  * @buffer: The ring buffer
16517a8e76a3SSteven Rostedt  *
16527a8e76a3SSteven Rostedt  * Returns the total number of entries in the ring buffer
16537a8e76a3SSteven Rostedt  * (all CPU entries)
16547a8e76a3SSteven Rostedt  */
16557a8e76a3SSteven Rostedt unsigned long ring_buffer_entries(struct ring_buffer *buffer)
16567a8e76a3SSteven Rostedt {
16577a8e76a3SSteven Rostedt 	struct ring_buffer_per_cpu *cpu_buffer;
16587a8e76a3SSteven Rostedt 	unsigned long entries = 0;
16597a8e76a3SSteven Rostedt 	int cpu;
16607a8e76a3SSteven Rostedt 
1661554f786eSSteven Rostedt 	get_online_cpus();
1662554f786eSSteven Rostedt 
16637a8e76a3SSteven Rostedt 	/* if you care about this being correct, lock the buffer */
16647a8e76a3SSteven Rostedt 	for_each_buffer_cpu(buffer, cpu) {
16657a8e76a3SSteven Rostedt 		cpu_buffer = buffer->buffers[cpu];
16667a8e76a3SSteven Rostedt 		entries += cpu_buffer->entries;
16677a8e76a3SSteven Rostedt 	}
16687a8e76a3SSteven Rostedt 
1669554f786eSSteven Rostedt 	put_online_cpus();
1670554f786eSSteven Rostedt 
16717a8e76a3SSteven Rostedt 	return entries;
16727a8e76a3SSteven Rostedt }
1673c4f50183SRobert Richter EXPORT_SYMBOL_GPL(ring_buffer_entries);
16747a8e76a3SSteven Rostedt 
16757a8e76a3SSteven Rostedt /**
16767a8e76a3SSteven Rostedt  * ring_buffer_overrun_cpu - get the number of overruns in buffer
16777a8e76a3SSteven Rostedt  * @buffer: The ring buffer
16787a8e76a3SSteven Rostedt  *
16797a8e76a3SSteven Rostedt  * Returns the total number of overruns in the ring buffer
16807a8e76a3SSteven Rostedt  * (all CPU entries)
16817a8e76a3SSteven Rostedt  */
16827a8e76a3SSteven Rostedt unsigned long ring_buffer_overruns(struct ring_buffer *buffer)
16837a8e76a3SSteven Rostedt {
16847a8e76a3SSteven Rostedt 	struct ring_buffer_per_cpu *cpu_buffer;
16857a8e76a3SSteven Rostedt 	unsigned long overruns = 0;
16867a8e76a3SSteven Rostedt 	int cpu;
16877a8e76a3SSteven Rostedt 
1688554f786eSSteven Rostedt 	get_online_cpus();
1689554f786eSSteven Rostedt 
16907a8e76a3SSteven Rostedt 	/* if you care about this being correct, lock the buffer */
16917a8e76a3SSteven Rostedt 	for_each_buffer_cpu(buffer, cpu) {
16927a8e76a3SSteven Rostedt 		cpu_buffer = buffer->buffers[cpu];
16937a8e76a3SSteven Rostedt 		overruns += cpu_buffer->overrun;
16947a8e76a3SSteven Rostedt 	}
16957a8e76a3SSteven Rostedt 
1696554f786eSSteven Rostedt 	put_online_cpus();
1697554f786eSSteven Rostedt 
16987a8e76a3SSteven Rostedt 	return overruns;
16997a8e76a3SSteven Rostedt }
1700c4f50183SRobert Richter EXPORT_SYMBOL_GPL(ring_buffer_overruns);
17017a8e76a3SSteven Rostedt 
1702642edba5SSteven Rostedt static void rb_iter_reset(struct ring_buffer_iter *iter)
17037a8e76a3SSteven Rostedt {
17047a8e76a3SSteven Rostedt 	struct ring_buffer_per_cpu *cpu_buffer = iter->cpu_buffer;
17057a8e76a3SSteven Rostedt 
1706d769041fSSteven Rostedt 	/* Iterator usage is expected to have record disabled */
1707d769041fSSteven Rostedt 	if (list_empty(&cpu_buffer->reader_page->list)) {
17087a8e76a3SSteven Rostedt 		iter->head_page = cpu_buffer->head_page;
17096f807acdSSteven Rostedt 		iter->head = cpu_buffer->head_page->read;
1710d769041fSSteven Rostedt 	} else {
1711d769041fSSteven Rostedt 		iter->head_page = cpu_buffer->reader_page;
17126f807acdSSteven Rostedt 		iter->head = cpu_buffer->reader_page->read;
1713d769041fSSteven Rostedt 	}
1714d769041fSSteven Rostedt 	if (iter->head)
1715d769041fSSteven Rostedt 		iter->read_stamp = cpu_buffer->read_stamp;
1716d769041fSSteven Rostedt 	else
1717abc9b56dSSteven Rostedt 		iter->read_stamp = iter->head_page->page->time_stamp;
1718642edba5SSteven Rostedt }
1719f83c9d0fSSteven Rostedt 
1720642edba5SSteven Rostedt /**
1721642edba5SSteven Rostedt  * ring_buffer_iter_reset - reset an iterator
1722642edba5SSteven Rostedt  * @iter: The iterator to reset
1723642edba5SSteven Rostedt  *
1724642edba5SSteven Rostedt  * Resets the iterator, so that it will start from the beginning
1725642edba5SSteven Rostedt  * again.
1726642edba5SSteven Rostedt  */
1727642edba5SSteven Rostedt void ring_buffer_iter_reset(struct ring_buffer_iter *iter)
1728642edba5SSteven Rostedt {
1729554f786eSSteven Rostedt 	struct ring_buffer_per_cpu *cpu_buffer;
1730642edba5SSteven Rostedt 	unsigned long flags;
1731642edba5SSteven Rostedt 
1732554f786eSSteven Rostedt 	if (!iter)
1733554f786eSSteven Rostedt 		return;
1734554f786eSSteven Rostedt 
1735554f786eSSteven Rostedt 	cpu_buffer = iter->cpu_buffer;
1736554f786eSSteven Rostedt 
1737642edba5SSteven Rostedt 	spin_lock_irqsave(&cpu_buffer->reader_lock, flags);
1738642edba5SSteven Rostedt 	rb_iter_reset(iter);
1739f83c9d0fSSteven Rostedt 	spin_unlock_irqrestore(&cpu_buffer->reader_lock, flags);
17407a8e76a3SSteven Rostedt }
1741c4f50183SRobert Richter EXPORT_SYMBOL_GPL(ring_buffer_iter_reset);
17427a8e76a3SSteven Rostedt 
17437a8e76a3SSteven Rostedt /**
17447a8e76a3SSteven Rostedt  * ring_buffer_iter_empty - check if an iterator has no more to read
17457a8e76a3SSteven Rostedt  * @iter: The iterator to check
17467a8e76a3SSteven Rostedt  */
17477a8e76a3SSteven Rostedt int ring_buffer_iter_empty(struct ring_buffer_iter *iter)
17487a8e76a3SSteven Rostedt {
17497a8e76a3SSteven Rostedt 	struct ring_buffer_per_cpu *cpu_buffer;
17507a8e76a3SSteven Rostedt 
17517a8e76a3SSteven Rostedt 	cpu_buffer = iter->cpu_buffer;
17527a8e76a3SSteven Rostedt 
1753bf41a158SSteven Rostedt 	return iter->head_page == cpu_buffer->commit_page &&
1754bf41a158SSteven Rostedt 		iter->head == rb_commit_index(cpu_buffer);
17557a8e76a3SSteven Rostedt }
1756c4f50183SRobert Richter EXPORT_SYMBOL_GPL(ring_buffer_iter_empty);
17577a8e76a3SSteven Rostedt 
17587a8e76a3SSteven Rostedt static void
17597a8e76a3SSteven Rostedt rb_update_read_stamp(struct ring_buffer_per_cpu *cpu_buffer,
17607a8e76a3SSteven Rostedt 		     struct ring_buffer_event *event)
17617a8e76a3SSteven Rostedt {
17627a8e76a3SSteven Rostedt 	u64 delta;
17637a8e76a3SSteven Rostedt 
17647a8e76a3SSteven Rostedt 	switch (event->type) {
17657a8e76a3SSteven Rostedt 	case RINGBUF_TYPE_PADDING:
17667a8e76a3SSteven Rostedt 		return;
17677a8e76a3SSteven Rostedt 
17687a8e76a3SSteven Rostedt 	case RINGBUF_TYPE_TIME_EXTEND:
17697a8e76a3SSteven Rostedt 		delta = event->array[0];
17707a8e76a3SSteven Rostedt 		delta <<= TS_SHIFT;
17717a8e76a3SSteven Rostedt 		delta += event->time_delta;
17727a8e76a3SSteven Rostedt 		cpu_buffer->read_stamp += delta;
17737a8e76a3SSteven Rostedt 		return;
17747a8e76a3SSteven Rostedt 
17757a8e76a3SSteven Rostedt 	case RINGBUF_TYPE_TIME_STAMP:
17767a8e76a3SSteven Rostedt 		/* FIXME: not implemented */
17777a8e76a3SSteven Rostedt 		return;
17787a8e76a3SSteven Rostedt 
17797a8e76a3SSteven Rostedt 	case RINGBUF_TYPE_DATA:
17807a8e76a3SSteven Rostedt 		cpu_buffer->read_stamp += event->time_delta;
17817a8e76a3SSteven Rostedt 		return;
17827a8e76a3SSteven Rostedt 
17837a8e76a3SSteven Rostedt 	default:
17847a8e76a3SSteven Rostedt 		BUG();
17857a8e76a3SSteven Rostedt 	}
17867a8e76a3SSteven Rostedt 	return;
17877a8e76a3SSteven Rostedt }
17887a8e76a3SSteven Rostedt 
17897a8e76a3SSteven Rostedt static void
17907a8e76a3SSteven Rostedt rb_update_iter_read_stamp(struct ring_buffer_iter *iter,
17917a8e76a3SSteven Rostedt 			  struct ring_buffer_event *event)
17927a8e76a3SSteven Rostedt {
17937a8e76a3SSteven Rostedt 	u64 delta;
17947a8e76a3SSteven Rostedt 
17957a8e76a3SSteven Rostedt 	switch (event->type) {
17967a8e76a3SSteven Rostedt 	case RINGBUF_TYPE_PADDING:
17977a8e76a3SSteven Rostedt 		return;
17987a8e76a3SSteven Rostedt 
17997a8e76a3SSteven Rostedt 	case RINGBUF_TYPE_TIME_EXTEND:
18007a8e76a3SSteven Rostedt 		delta = event->array[0];
18017a8e76a3SSteven Rostedt 		delta <<= TS_SHIFT;
18027a8e76a3SSteven Rostedt 		delta += event->time_delta;
18037a8e76a3SSteven Rostedt 		iter->read_stamp += delta;
18047a8e76a3SSteven Rostedt 		return;
18057a8e76a3SSteven Rostedt 
18067a8e76a3SSteven Rostedt 	case RINGBUF_TYPE_TIME_STAMP:
18077a8e76a3SSteven Rostedt 		/* FIXME: not implemented */
18087a8e76a3SSteven Rostedt 		return;
18097a8e76a3SSteven Rostedt 
18107a8e76a3SSteven Rostedt 	case RINGBUF_TYPE_DATA:
18117a8e76a3SSteven Rostedt 		iter->read_stamp += event->time_delta;
18127a8e76a3SSteven Rostedt 		return;
18137a8e76a3SSteven Rostedt 
18147a8e76a3SSteven Rostedt 	default:
18157a8e76a3SSteven Rostedt 		BUG();
18167a8e76a3SSteven Rostedt 	}
18177a8e76a3SSteven Rostedt 	return;
18187a8e76a3SSteven Rostedt }
18197a8e76a3SSteven Rostedt 
1820d769041fSSteven Rostedt static struct buffer_page *
1821d769041fSSteven Rostedt rb_get_reader_page(struct ring_buffer_per_cpu *cpu_buffer)
18227a8e76a3SSteven Rostedt {
1823d769041fSSteven Rostedt 	struct buffer_page *reader = NULL;
1824d769041fSSteven Rostedt 	unsigned long flags;
1825818e3dd3SSteven Rostedt 	int nr_loops = 0;
1826d769041fSSteven Rostedt 
18273e03fb7fSSteven Rostedt 	local_irq_save(flags);
18283e03fb7fSSteven Rostedt 	__raw_spin_lock(&cpu_buffer->lock);
1829d769041fSSteven Rostedt 
1830d769041fSSteven Rostedt  again:
1831818e3dd3SSteven Rostedt 	/*
1832818e3dd3SSteven Rostedt 	 * This should normally only loop twice. But because the
1833818e3dd3SSteven Rostedt 	 * start of the reader inserts an empty page, it causes
1834818e3dd3SSteven Rostedt 	 * a case where we will loop three times. There should be no
1835818e3dd3SSteven Rostedt 	 * reason to loop four times (that I know of).
1836818e3dd3SSteven Rostedt 	 */
18373e89c7bbSSteven Rostedt 	if (RB_WARN_ON(cpu_buffer, ++nr_loops > 3)) {
1838818e3dd3SSteven Rostedt 		reader = NULL;
1839818e3dd3SSteven Rostedt 		goto out;
1840818e3dd3SSteven Rostedt 	}
1841818e3dd3SSteven Rostedt 
1842d769041fSSteven Rostedt 	reader = cpu_buffer->reader_page;
1843d769041fSSteven Rostedt 
1844d769041fSSteven Rostedt 	/* If there's more to read, return this page */
1845bf41a158SSteven Rostedt 	if (cpu_buffer->reader_page->read < rb_page_size(reader))
1846d769041fSSteven Rostedt 		goto out;
1847d769041fSSteven Rostedt 
1848d769041fSSteven Rostedt 	/* Never should we have an index greater than the size */
18493e89c7bbSSteven Rostedt 	if (RB_WARN_ON(cpu_buffer,
18503e89c7bbSSteven Rostedt 		       cpu_buffer->reader_page->read > rb_page_size(reader)))
18513e89c7bbSSteven Rostedt 		goto out;
1852d769041fSSteven Rostedt 
1853d769041fSSteven Rostedt 	/* check if we caught up to the tail */
1854d769041fSSteven Rostedt 	reader = NULL;
1855bf41a158SSteven Rostedt 	if (cpu_buffer->commit_page == cpu_buffer->reader_page)
1856d769041fSSteven Rostedt 		goto out;
18577a8e76a3SSteven Rostedt 
18587a8e76a3SSteven Rostedt 	/*
1859d769041fSSteven Rostedt 	 * Splice the empty reader page into the list around the head.
1860d769041fSSteven Rostedt 	 * Reset the reader page to size zero.
18617a8e76a3SSteven Rostedt 	 */
1862d769041fSSteven Rostedt 
1863d769041fSSteven Rostedt 	reader = cpu_buffer->head_page;
1864d769041fSSteven Rostedt 	cpu_buffer->reader_page->list.next = reader->list.next;
1865d769041fSSteven Rostedt 	cpu_buffer->reader_page->list.prev = reader->list.prev;
1866bf41a158SSteven Rostedt 
1867bf41a158SSteven Rostedt 	local_set(&cpu_buffer->reader_page->write, 0);
1868abc9b56dSSteven Rostedt 	local_set(&cpu_buffer->reader_page->page->commit, 0);
1869d769041fSSteven Rostedt 
1870d769041fSSteven Rostedt 	/* Make the reader page now replace the head */
1871d769041fSSteven Rostedt 	reader->list.prev->next = &cpu_buffer->reader_page->list;
1872d769041fSSteven Rostedt 	reader->list.next->prev = &cpu_buffer->reader_page->list;
1873d769041fSSteven Rostedt 
1874d769041fSSteven Rostedt 	/*
1875d769041fSSteven Rostedt 	 * If the tail is on the reader, then we must set the head
1876d769041fSSteven Rostedt 	 * to the inserted page, otherwise we set it one before.
1877d769041fSSteven Rostedt 	 */
1878d769041fSSteven Rostedt 	cpu_buffer->head_page = cpu_buffer->reader_page;
1879d769041fSSteven Rostedt 
1880bf41a158SSteven Rostedt 	if (cpu_buffer->commit_page != reader)
18817a8e76a3SSteven Rostedt 		rb_inc_page(cpu_buffer, &cpu_buffer->head_page);
1882d769041fSSteven Rostedt 
1883d769041fSSteven Rostedt 	/* Finally update the reader page to the new head */
1884d769041fSSteven Rostedt 	cpu_buffer->reader_page = reader;
1885d769041fSSteven Rostedt 	rb_reset_reader_page(cpu_buffer);
1886d769041fSSteven Rostedt 
1887d769041fSSteven Rostedt 	goto again;
1888d769041fSSteven Rostedt 
1889d769041fSSteven Rostedt  out:
18903e03fb7fSSteven Rostedt 	__raw_spin_unlock(&cpu_buffer->lock);
18913e03fb7fSSteven Rostedt 	local_irq_restore(flags);
1892d769041fSSteven Rostedt 
1893d769041fSSteven Rostedt 	return reader;
18947a8e76a3SSteven Rostedt }
18957a8e76a3SSteven Rostedt 
1896d769041fSSteven Rostedt static void rb_advance_reader(struct ring_buffer_per_cpu *cpu_buffer)
1897d769041fSSteven Rostedt {
1898d769041fSSteven Rostedt 	struct ring_buffer_event *event;
1899d769041fSSteven Rostedt 	struct buffer_page *reader;
1900d769041fSSteven Rostedt 	unsigned length;
1901d769041fSSteven Rostedt 
1902d769041fSSteven Rostedt 	reader = rb_get_reader_page(cpu_buffer);
1903d769041fSSteven Rostedt 
1904d769041fSSteven Rostedt 	/* This function should not be called when buffer is empty */
19053e89c7bbSSteven Rostedt 	if (RB_WARN_ON(cpu_buffer, !reader))
19063e89c7bbSSteven Rostedt 		return;
1907d769041fSSteven Rostedt 
1908d769041fSSteven Rostedt 	event = rb_reader_event(cpu_buffer);
19097a8e76a3SSteven Rostedt 
19107a8e76a3SSteven Rostedt 	if (event->type == RINGBUF_TYPE_DATA)
19117a8e76a3SSteven Rostedt 		cpu_buffer->entries--;
19127a8e76a3SSteven Rostedt 
19137a8e76a3SSteven Rostedt 	rb_update_read_stamp(cpu_buffer, event);
19147a8e76a3SSteven Rostedt 
1915d769041fSSteven Rostedt 	length = rb_event_length(event);
19166f807acdSSteven Rostedt 	cpu_buffer->reader_page->read += length;
19177a8e76a3SSteven Rostedt }
19187a8e76a3SSteven Rostedt 
19197a8e76a3SSteven Rostedt static void rb_advance_iter(struct ring_buffer_iter *iter)
19207a8e76a3SSteven Rostedt {
19217a8e76a3SSteven Rostedt 	struct ring_buffer *buffer;
19227a8e76a3SSteven Rostedt 	struct ring_buffer_per_cpu *cpu_buffer;
19237a8e76a3SSteven Rostedt 	struct ring_buffer_event *event;
19247a8e76a3SSteven Rostedt 	unsigned length;
19257a8e76a3SSteven Rostedt 
19267a8e76a3SSteven Rostedt 	cpu_buffer = iter->cpu_buffer;
19277a8e76a3SSteven Rostedt 	buffer = cpu_buffer->buffer;
19287a8e76a3SSteven Rostedt 
19297a8e76a3SSteven Rostedt 	/*
19307a8e76a3SSteven Rostedt 	 * Check if we are at the end of the buffer.
19317a8e76a3SSteven Rostedt 	 */
1932bf41a158SSteven Rostedt 	if (iter->head >= rb_page_size(iter->head_page)) {
19333e89c7bbSSteven Rostedt 		if (RB_WARN_ON(buffer,
19343e89c7bbSSteven Rostedt 			       iter->head_page == cpu_buffer->commit_page))
19353e89c7bbSSteven Rostedt 			return;
1936d769041fSSteven Rostedt 		rb_inc_iter(iter);
19377a8e76a3SSteven Rostedt 		return;
19387a8e76a3SSteven Rostedt 	}
19397a8e76a3SSteven Rostedt 
19407a8e76a3SSteven Rostedt 	event = rb_iter_head_event(iter);
19417a8e76a3SSteven Rostedt 
19427a8e76a3SSteven Rostedt 	length = rb_event_length(event);
19437a8e76a3SSteven Rostedt 
19447a8e76a3SSteven Rostedt 	/*
19457a8e76a3SSteven Rostedt 	 * This should not be called to advance the header if we are
19467a8e76a3SSteven Rostedt 	 * at the tail of the buffer.
19477a8e76a3SSteven Rostedt 	 */
19483e89c7bbSSteven Rostedt 	if (RB_WARN_ON(cpu_buffer,
1949f536aafcSSteven Rostedt 		       (iter->head_page == cpu_buffer->commit_page) &&
19503e89c7bbSSteven Rostedt 		       (iter->head + length > rb_commit_index(cpu_buffer))))
19513e89c7bbSSteven Rostedt 		return;
19527a8e76a3SSteven Rostedt 
19537a8e76a3SSteven Rostedt 	rb_update_iter_read_stamp(iter, event);
19547a8e76a3SSteven Rostedt 
19557a8e76a3SSteven Rostedt 	iter->head += length;
19567a8e76a3SSteven Rostedt 
19577a8e76a3SSteven Rostedt 	/* check for end of page padding */
1958bf41a158SSteven Rostedt 	if ((iter->head >= rb_page_size(iter->head_page)) &&
1959bf41a158SSteven Rostedt 	    (iter->head_page != cpu_buffer->commit_page))
19607a8e76a3SSteven Rostedt 		rb_advance_iter(iter);
19617a8e76a3SSteven Rostedt }
19627a8e76a3SSteven Rostedt 
1963f83c9d0fSSteven Rostedt static struct ring_buffer_event *
1964f83c9d0fSSteven Rostedt rb_buffer_peek(struct ring_buffer *buffer, int cpu, u64 *ts)
19657a8e76a3SSteven Rostedt {
19667a8e76a3SSteven Rostedt 	struct ring_buffer_per_cpu *cpu_buffer;
19677a8e76a3SSteven Rostedt 	struct ring_buffer_event *event;
1968d769041fSSteven Rostedt 	struct buffer_page *reader;
1969818e3dd3SSteven Rostedt 	int nr_loops = 0;
19707a8e76a3SSteven Rostedt 
19717a8e76a3SSteven Rostedt 	cpu_buffer = buffer->buffers[cpu];
19727a8e76a3SSteven Rostedt 
19737a8e76a3SSteven Rostedt  again:
1974818e3dd3SSteven Rostedt 	/*
1975818e3dd3SSteven Rostedt 	 * We repeat when a timestamp is encountered. It is possible
1976818e3dd3SSteven Rostedt 	 * to get multiple timestamps from an interrupt entering just
1977818e3dd3SSteven Rostedt 	 * as one timestamp is about to be written. The max times
1978818e3dd3SSteven Rostedt 	 * that this can happen is the number of nested interrupts we
1979818e3dd3SSteven Rostedt 	 * can have.  Nesting 10 deep of interrupts is clearly
1980818e3dd3SSteven Rostedt 	 * an anomaly.
1981818e3dd3SSteven Rostedt 	 */
19823e89c7bbSSteven Rostedt 	if (RB_WARN_ON(cpu_buffer, ++nr_loops > 10))
1983818e3dd3SSteven Rostedt 		return NULL;
1984818e3dd3SSteven Rostedt 
1985d769041fSSteven Rostedt 	reader = rb_get_reader_page(cpu_buffer);
1986d769041fSSteven Rostedt 	if (!reader)
19877a8e76a3SSteven Rostedt 		return NULL;
19887a8e76a3SSteven Rostedt 
1989d769041fSSteven Rostedt 	event = rb_reader_event(cpu_buffer);
19907a8e76a3SSteven Rostedt 
19917a8e76a3SSteven Rostedt 	switch (event->type) {
19927a8e76a3SSteven Rostedt 	case RINGBUF_TYPE_PADDING:
1993bf41a158SSteven Rostedt 		RB_WARN_ON(cpu_buffer, 1);
1994d769041fSSteven Rostedt 		rb_advance_reader(cpu_buffer);
1995d769041fSSteven Rostedt 		return NULL;
19967a8e76a3SSteven Rostedt 
19977a8e76a3SSteven Rostedt 	case RINGBUF_TYPE_TIME_EXTEND:
19987a8e76a3SSteven Rostedt 		/* Internal data, OK to advance */
1999d769041fSSteven Rostedt 		rb_advance_reader(cpu_buffer);
20007a8e76a3SSteven Rostedt 		goto again;
20017a8e76a3SSteven Rostedt 
20027a8e76a3SSteven Rostedt 	case RINGBUF_TYPE_TIME_STAMP:
20037a8e76a3SSteven Rostedt 		/* FIXME: not implemented */
2004d769041fSSteven Rostedt 		rb_advance_reader(cpu_buffer);
20057a8e76a3SSteven Rostedt 		goto again;
20067a8e76a3SSteven Rostedt 
20077a8e76a3SSteven Rostedt 	case RINGBUF_TYPE_DATA:
20087a8e76a3SSteven Rostedt 		if (ts) {
20097a8e76a3SSteven Rostedt 			*ts = cpu_buffer->read_stamp + event->time_delta;
20107a8e76a3SSteven Rostedt 			ring_buffer_normalize_time_stamp(cpu_buffer->cpu, ts);
20117a8e76a3SSteven Rostedt 		}
20127a8e76a3SSteven Rostedt 		return event;
20137a8e76a3SSteven Rostedt 
20147a8e76a3SSteven Rostedt 	default:
20157a8e76a3SSteven Rostedt 		BUG();
20167a8e76a3SSteven Rostedt 	}
20177a8e76a3SSteven Rostedt 
20187a8e76a3SSteven Rostedt 	return NULL;
20197a8e76a3SSteven Rostedt }
2020c4f50183SRobert Richter EXPORT_SYMBOL_GPL(ring_buffer_peek);
20217a8e76a3SSteven Rostedt 
2022f83c9d0fSSteven Rostedt static struct ring_buffer_event *
2023f83c9d0fSSteven Rostedt rb_iter_peek(struct ring_buffer_iter *iter, u64 *ts)
20247a8e76a3SSteven Rostedt {
20257a8e76a3SSteven Rostedt 	struct ring_buffer *buffer;
20267a8e76a3SSteven Rostedt 	struct ring_buffer_per_cpu *cpu_buffer;
20277a8e76a3SSteven Rostedt 	struct ring_buffer_event *event;
2028818e3dd3SSteven Rostedt 	int nr_loops = 0;
20297a8e76a3SSteven Rostedt 
20307a8e76a3SSteven Rostedt 	if (ring_buffer_iter_empty(iter))
20317a8e76a3SSteven Rostedt 		return NULL;
20327a8e76a3SSteven Rostedt 
20337a8e76a3SSteven Rostedt 	cpu_buffer = iter->cpu_buffer;
20347a8e76a3SSteven Rostedt 	buffer = cpu_buffer->buffer;
20357a8e76a3SSteven Rostedt 
20367a8e76a3SSteven Rostedt  again:
2037818e3dd3SSteven Rostedt 	/*
2038818e3dd3SSteven Rostedt 	 * We repeat when a timestamp is encountered. It is possible
2039818e3dd3SSteven Rostedt 	 * to get multiple timestamps from an interrupt entering just
2040818e3dd3SSteven Rostedt 	 * as one timestamp is about to be written. The max times
2041818e3dd3SSteven Rostedt 	 * that this can happen is the number of nested interrupts we
2042818e3dd3SSteven Rostedt 	 * can have. Nesting 10 deep of interrupts is clearly
2043818e3dd3SSteven Rostedt 	 * an anomaly.
2044818e3dd3SSteven Rostedt 	 */
20453e89c7bbSSteven Rostedt 	if (RB_WARN_ON(cpu_buffer, ++nr_loops > 10))
2046818e3dd3SSteven Rostedt 		return NULL;
2047818e3dd3SSteven Rostedt 
20487a8e76a3SSteven Rostedt 	if (rb_per_cpu_empty(cpu_buffer))
20497a8e76a3SSteven Rostedt 		return NULL;
20507a8e76a3SSteven Rostedt 
20517a8e76a3SSteven Rostedt 	event = rb_iter_head_event(iter);
20527a8e76a3SSteven Rostedt 
20537a8e76a3SSteven Rostedt 	switch (event->type) {
20547a8e76a3SSteven Rostedt 	case RINGBUF_TYPE_PADDING:
2055d769041fSSteven Rostedt 		rb_inc_iter(iter);
20567a8e76a3SSteven Rostedt 		goto again;
20577a8e76a3SSteven Rostedt 
20587a8e76a3SSteven Rostedt 	case RINGBUF_TYPE_TIME_EXTEND:
20597a8e76a3SSteven Rostedt 		/* Internal data, OK to advance */
20607a8e76a3SSteven Rostedt 		rb_advance_iter(iter);
20617a8e76a3SSteven Rostedt 		goto again;
20627a8e76a3SSteven Rostedt 
20637a8e76a3SSteven Rostedt 	case RINGBUF_TYPE_TIME_STAMP:
20647a8e76a3SSteven Rostedt 		/* FIXME: not implemented */
20657a8e76a3SSteven Rostedt 		rb_advance_iter(iter);
20667a8e76a3SSteven Rostedt 		goto again;
20677a8e76a3SSteven Rostedt 
20687a8e76a3SSteven Rostedt 	case RINGBUF_TYPE_DATA:
20697a8e76a3SSteven Rostedt 		if (ts) {
20707a8e76a3SSteven Rostedt 			*ts = iter->read_stamp + event->time_delta;
20717a8e76a3SSteven Rostedt 			ring_buffer_normalize_time_stamp(cpu_buffer->cpu, ts);
20727a8e76a3SSteven Rostedt 		}
20737a8e76a3SSteven Rostedt 		return event;
20747a8e76a3SSteven Rostedt 
20757a8e76a3SSteven Rostedt 	default:
20767a8e76a3SSteven Rostedt 		BUG();
20777a8e76a3SSteven Rostedt 	}
20787a8e76a3SSteven Rostedt 
20797a8e76a3SSteven Rostedt 	return NULL;
20807a8e76a3SSteven Rostedt }
2081c4f50183SRobert Richter EXPORT_SYMBOL_GPL(ring_buffer_iter_peek);
20827a8e76a3SSteven Rostedt 
20837a8e76a3SSteven Rostedt /**
2084f83c9d0fSSteven Rostedt  * ring_buffer_peek - peek at the next event to be read
2085f83c9d0fSSteven Rostedt  * @buffer: The ring buffer to read
2086f83c9d0fSSteven Rostedt  * @cpu: The cpu to peak at
2087f83c9d0fSSteven Rostedt  * @ts: The timestamp counter of this event.
2088f83c9d0fSSteven Rostedt  *
2089f83c9d0fSSteven Rostedt  * This will return the event that will be read next, but does
2090f83c9d0fSSteven Rostedt  * not consume the data.
2091f83c9d0fSSteven Rostedt  */
2092f83c9d0fSSteven Rostedt struct ring_buffer_event *
2093f83c9d0fSSteven Rostedt ring_buffer_peek(struct ring_buffer *buffer, int cpu, u64 *ts)
2094f83c9d0fSSteven Rostedt {
2095f83c9d0fSSteven Rostedt 	struct ring_buffer_per_cpu *cpu_buffer = buffer->buffers[cpu];
2096554f786eSSteven Rostedt 	struct ring_buffer_event *event = NULL;
2097f83c9d0fSSteven Rostedt 	unsigned long flags;
2098f83c9d0fSSteven Rostedt 
2099554f786eSSteven Rostedt 	get_online_cpus();
2100554f786eSSteven Rostedt 
2101554f786eSSteven Rostedt 	if (!cpumask_test_cpu(cpu, buffer->cpumask))
2102554f786eSSteven Rostedt 		goto out;
2103554f786eSSteven Rostedt 
2104f83c9d0fSSteven Rostedt 	spin_lock_irqsave(&cpu_buffer->reader_lock, flags);
2105f83c9d0fSSteven Rostedt 	event = rb_buffer_peek(buffer, cpu, ts);
2106f83c9d0fSSteven Rostedt 	spin_unlock_irqrestore(&cpu_buffer->reader_lock, flags);
2107f83c9d0fSSteven Rostedt 
2108554f786eSSteven Rostedt  out:
2109554f786eSSteven Rostedt 	put_online_cpus();
2110554f786eSSteven Rostedt 
2111f83c9d0fSSteven Rostedt 	return event;
2112f83c9d0fSSteven Rostedt }
2113f83c9d0fSSteven Rostedt 
2114f83c9d0fSSteven Rostedt /**
2115f83c9d0fSSteven Rostedt  * ring_buffer_iter_peek - peek at the next event to be read
2116f83c9d0fSSteven Rostedt  * @iter: The ring buffer iterator
2117f83c9d0fSSteven Rostedt  * @ts: The timestamp counter of this event.
2118f83c9d0fSSteven Rostedt  *
2119f83c9d0fSSteven Rostedt  * This will return the event that will be read next, but does
2120f83c9d0fSSteven Rostedt  * not increment the iterator.
2121f83c9d0fSSteven Rostedt  */
2122f83c9d0fSSteven Rostedt struct ring_buffer_event *
2123f83c9d0fSSteven Rostedt ring_buffer_iter_peek(struct ring_buffer_iter *iter, u64 *ts)
2124f83c9d0fSSteven Rostedt {
2125f83c9d0fSSteven Rostedt 	struct ring_buffer_per_cpu *cpu_buffer = iter->cpu_buffer;
2126f83c9d0fSSteven Rostedt 	struct ring_buffer_event *event;
2127f83c9d0fSSteven Rostedt 	unsigned long flags;
2128f83c9d0fSSteven Rostedt 
2129f83c9d0fSSteven Rostedt 	spin_lock_irqsave(&cpu_buffer->reader_lock, flags);
2130f83c9d0fSSteven Rostedt 	event = rb_iter_peek(iter, ts);
2131f83c9d0fSSteven Rostedt 	spin_unlock_irqrestore(&cpu_buffer->reader_lock, flags);
2132f83c9d0fSSteven Rostedt 
2133f83c9d0fSSteven Rostedt 	return event;
2134f83c9d0fSSteven Rostedt }
2135f83c9d0fSSteven Rostedt 
2136f83c9d0fSSteven Rostedt /**
21377a8e76a3SSteven Rostedt  * ring_buffer_consume - return an event and consume it
21387a8e76a3SSteven Rostedt  * @buffer: The ring buffer to get the next event from
21397a8e76a3SSteven Rostedt  *
21407a8e76a3SSteven Rostedt  * Returns the next event in the ring buffer, and that event is consumed.
21417a8e76a3SSteven Rostedt  * Meaning, that sequential reads will keep returning a different event,
21427a8e76a3SSteven Rostedt  * and eventually empty the ring buffer if the producer is slower.
21437a8e76a3SSteven Rostedt  */
21447a8e76a3SSteven Rostedt struct ring_buffer_event *
21457a8e76a3SSteven Rostedt ring_buffer_consume(struct ring_buffer *buffer, int cpu, u64 *ts)
21467a8e76a3SSteven Rostedt {
2147554f786eSSteven Rostedt 	struct ring_buffer_per_cpu *cpu_buffer;
2148554f786eSSteven Rostedt 	struct ring_buffer_event *event = NULL;
2149f83c9d0fSSteven Rostedt 	unsigned long flags;
21507a8e76a3SSteven Rostedt 
2151554f786eSSteven Rostedt 	/* might be called in atomic */
2152554f786eSSteven Rostedt 	preempt_disable();
21537a8e76a3SSteven Rostedt 
2154554f786eSSteven Rostedt 	if (!cpumask_test_cpu(cpu, buffer->cpumask))
2155554f786eSSteven Rostedt 		goto out;
2156554f786eSSteven Rostedt 
2157554f786eSSteven Rostedt 	cpu_buffer = buffer->buffers[cpu];
2158f83c9d0fSSteven Rostedt 	spin_lock_irqsave(&cpu_buffer->reader_lock, flags);
21597a8e76a3SSteven Rostedt 
2160f83c9d0fSSteven Rostedt 	event = rb_buffer_peek(buffer, cpu, ts);
2161f83c9d0fSSteven Rostedt 	if (!event)
2162554f786eSSteven Rostedt 		goto out_unlock;
2163f83c9d0fSSteven Rostedt 
2164d769041fSSteven Rostedt 	rb_advance_reader(cpu_buffer);
21657a8e76a3SSteven Rostedt 
2166554f786eSSteven Rostedt  out_unlock:
2167f83c9d0fSSteven Rostedt 	spin_unlock_irqrestore(&cpu_buffer->reader_lock, flags);
2168f83c9d0fSSteven Rostedt 
2169554f786eSSteven Rostedt  out:
2170554f786eSSteven Rostedt 	preempt_enable();
2171554f786eSSteven Rostedt 
21727a8e76a3SSteven Rostedt 	return event;
21737a8e76a3SSteven Rostedt }
2174c4f50183SRobert Richter EXPORT_SYMBOL_GPL(ring_buffer_consume);
21757a8e76a3SSteven Rostedt 
21767a8e76a3SSteven Rostedt /**
21777a8e76a3SSteven Rostedt  * ring_buffer_read_start - start a non consuming read of the buffer
21787a8e76a3SSteven Rostedt  * @buffer: The ring buffer to read from
21797a8e76a3SSteven Rostedt  * @cpu: The cpu buffer to iterate over
21807a8e76a3SSteven Rostedt  *
21817a8e76a3SSteven Rostedt  * This starts up an iteration through the buffer. It also disables
21827a8e76a3SSteven Rostedt  * the recording to the buffer until the reading is finished.
21837a8e76a3SSteven Rostedt  * This prevents the reading from being corrupted. This is not
21847a8e76a3SSteven Rostedt  * a consuming read, so a producer is not expected.
21857a8e76a3SSteven Rostedt  *
21867a8e76a3SSteven Rostedt  * Must be paired with ring_buffer_finish.
21877a8e76a3SSteven Rostedt  */
21887a8e76a3SSteven Rostedt struct ring_buffer_iter *
21897a8e76a3SSteven Rostedt ring_buffer_read_start(struct ring_buffer *buffer, int cpu)
21907a8e76a3SSteven Rostedt {
21917a8e76a3SSteven Rostedt 	struct ring_buffer_per_cpu *cpu_buffer;
2192554f786eSSteven Rostedt 	struct ring_buffer_iter *iter = NULL;
2193d769041fSSteven Rostedt 	unsigned long flags;
21947a8e76a3SSteven Rostedt 
2195554f786eSSteven Rostedt 	get_online_cpus();
2196554f786eSSteven Rostedt 
21979e01c1b7SRusty Russell 	if (!cpumask_test_cpu(cpu, buffer->cpumask))
2198554f786eSSteven Rostedt 		goto out;
21997a8e76a3SSteven Rostedt 
22007a8e76a3SSteven Rostedt 	iter = kmalloc(sizeof(*iter), GFP_KERNEL);
22017a8e76a3SSteven Rostedt 	if (!iter)
2202554f786eSSteven Rostedt 		goto out;
22037a8e76a3SSteven Rostedt 
22047a8e76a3SSteven Rostedt 	cpu_buffer = buffer->buffers[cpu];
22057a8e76a3SSteven Rostedt 
22067a8e76a3SSteven Rostedt 	iter->cpu_buffer = cpu_buffer;
22077a8e76a3SSteven Rostedt 
22087a8e76a3SSteven Rostedt 	atomic_inc(&cpu_buffer->record_disabled);
22097a8e76a3SSteven Rostedt 	synchronize_sched();
22107a8e76a3SSteven Rostedt 
2211f83c9d0fSSteven Rostedt 	spin_lock_irqsave(&cpu_buffer->reader_lock, flags);
22123e03fb7fSSteven Rostedt 	__raw_spin_lock(&cpu_buffer->lock);
2213642edba5SSteven Rostedt 	rb_iter_reset(iter);
22143e03fb7fSSteven Rostedt 	__raw_spin_unlock(&cpu_buffer->lock);
2215f83c9d0fSSteven Rostedt 	spin_unlock_irqrestore(&cpu_buffer->reader_lock, flags);
22167a8e76a3SSteven Rostedt 
2217554f786eSSteven Rostedt  out:
2218554f786eSSteven Rostedt 	put_online_cpus();
2219554f786eSSteven Rostedt 
22207a8e76a3SSteven Rostedt 	return iter;
22217a8e76a3SSteven Rostedt }
2222c4f50183SRobert Richter EXPORT_SYMBOL_GPL(ring_buffer_read_start);
22237a8e76a3SSteven Rostedt 
22247a8e76a3SSteven Rostedt /**
22257a8e76a3SSteven Rostedt  * ring_buffer_finish - finish reading the iterator of the buffer
22267a8e76a3SSteven Rostedt  * @iter: The iterator retrieved by ring_buffer_start
22277a8e76a3SSteven Rostedt  *
22287a8e76a3SSteven Rostedt  * This re-enables the recording to the buffer, and frees the
22297a8e76a3SSteven Rostedt  * iterator.
22307a8e76a3SSteven Rostedt  */
22317a8e76a3SSteven Rostedt void
22327a8e76a3SSteven Rostedt ring_buffer_read_finish(struct ring_buffer_iter *iter)
22337a8e76a3SSteven Rostedt {
22347a8e76a3SSteven Rostedt 	struct ring_buffer_per_cpu *cpu_buffer = iter->cpu_buffer;
22357a8e76a3SSteven Rostedt 
22367a8e76a3SSteven Rostedt 	atomic_dec(&cpu_buffer->record_disabled);
22377a8e76a3SSteven Rostedt 	kfree(iter);
22387a8e76a3SSteven Rostedt }
2239c4f50183SRobert Richter EXPORT_SYMBOL_GPL(ring_buffer_read_finish);
22407a8e76a3SSteven Rostedt 
22417a8e76a3SSteven Rostedt /**
22427a8e76a3SSteven Rostedt  * ring_buffer_read - read the next item in the ring buffer by the iterator
22437a8e76a3SSteven Rostedt  * @iter: The ring buffer iterator
22447a8e76a3SSteven Rostedt  * @ts: The time stamp of the event read.
22457a8e76a3SSteven Rostedt  *
22467a8e76a3SSteven Rostedt  * This reads the next event in the ring buffer and increments the iterator.
22477a8e76a3SSteven Rostedt  */
22487a8e76a3SSteven Rostedt struct ring_buffer_event *
22497a8e76a3SSteven Rostedt ring_buffer_read(struct ring_buffer_iter *iter, u64 *ts)
22507a8e76a3SSteven Rostedt {
22517a8e76a3SSteven Rostedt 	struct ring_buffer_event *event;
2252f83c9d0fSSteven Rostedt 	struct ring_buffer_per_cpu *cpu_buffer = iter->cpu_buffer;
2253f83c9d0fSSteven Rostedt 	unsigned long flags;
22547a8e76a3SSteven Rostedt 
2255f83c9d0fSSteven Rostedt 	spin_lock_irqsave(&cpu_buffer->reader_lock, flags);
2256f83c9d0fSSteven Rostedt 	event = rb_iter_peek(iter, ts);
22577a8e76a3SSteven Rostedt 	if (!event)
2258f83c9d0fSSteven Rostedt 		goto out;
22597a8e76a3SSteven Rostedt 
22607a8e76a3SSteven Rostedt 	rb_advance_iter(iter);
2261f83c9d0fSSteven Rostedt  out:
2262f83c9d0fSSteven Rostedt 	spin_unlock_irqrestore(&cpu_buffer->reader_lock, flags);
22637a8e76a3SSteven Rostedt 
22647a8e76a3SSteven Rostedt 	return event;
22657a8e76a3SSteven Rostedt }
2266c4f50183SRobert Richter EXPORT_SYMBOL_GPL(ring_buffer_read);
22677a8e76a3SSteven Rostedt 
22687a8e76a3SSteven Rostedt /**
22697a8e76a3SSteven Rostedt  * ring_buffer_size - return the size of the ring buffer (in bytes)
22707a8e76a3SSteven Rostedt  * @buffer: The ring buffer.
22717a8e76a3SSteven Rostedt  */
22727a8e76a3SSteven Rostedt unsigned long ring_buffer_size(struct ring_buffer *buffer)
22737a8e76a3SSteven Rostedt {
22747a8e76a3SSteven Rostedt 	return BUF_PAGE_SIZE * buffer->pages;
22757a8e76a3SSteven Rostedt }
2276c4f50183SRobert Richter EXPORT_SYMBOL_GPL(ring_buffer_size);
22777a8e76a3SSteven Rostedt 
22787a8e76a3SSteven Rostedt static void
22797a8e76a3SSteven Rostedt rb_reset_cpu(struct ring_buffer_per_cpu *cpu_buffer)
22807a8e76a3SSteven Rostedt {
22817a8e76a3SSteven Rostedt 	cpu_buffer->head_page
22827a8e76a3SSteven Rostedt 		= list_entry(cpu_buffer->pages.next, struct buffer_page, list);
2283bf41a158SSteven Rostedt 	local_set(&cpu_buffer->head_page->write, 0);
2284abc9b56dSSteven Rostedt 	local_set(&cpu_buffer->head_page->page->commit, 0);
22857a8e76a3SSteven Rostedt 
22866f807acdSSteven Rostedt 	cpu_buffer->head_page->read = 0;
2287bf41a158SSteven Rostedt 
2288bf41a158SSteven Rostedt 	cpu_buffer->tail_page = cpu_buffer->head_page;
2289bf41a158SSteven Rostedt 	cpu_buffer->commit_page = cpu_buffer->head_page;
2290bf41a158SSteven Rostedt 
2291bf41a158SSteven Rostedt 	INIT_LIST_HEAD(&cpu_buffer->reader_page->list);
2292bf41a158SSteven Rostedt 	local_set(&cpu_buffer->reader_page->write, 0);
2293abc9b56dSSteven Rostedt 	local_set(&cpu_buffer->reader_page->page->commit, 0);
22946f807acdSSteven Rostedt 	cpu_buffer->reader_page->read = 0;
2295d769041fSSteven Rostedt 
22967a8e76a3SSteven Rostedt 	cpu_buffer->overrun = 0;
22977a8e76a3SSteven Rostedt 	cpu_buffer->entries = 0;
229869507c06SSteven Rostedt 
229969507c06SSteven Rostedt 	cpu_buffer->write_stamp = 0;
230069507c06SSteven Rostedt 	cpu_buffer->read_stamp = 0;
23017a8e76a3SSteven Rostedt }
23027a8e76a3SSteven Rostedt 
23037a8e76a3SSteven Rostedt /**
23047a8e76a3SSteven Rostedt  * ring_buffer_reset_cpu - reset a ring buffer per CPU buffer
23057a8e76a3SSteven Rostedt  * @buffer: The ring buffer to reset a per cpu buffer of
23067a8e76a3SSteven Rostedt  * @cpu: The CPU buffer to be reset
23077a8e76a3SSteven Rostedt  */
23087a8e76a3SSteven Rostedt void ring_buffer_reset_cpu(struct ring_buffer *buffer, int cpu)
23097a8e76a3SSteven Rostedt {
23107a8e76a3SSteven Rostedt 	struct ring_buffer_per_cpu *cpu_buffer = buffer->buffers[cpu];
23117a8e76a3SSteven Rostedt 	unsigned long flags;
2312554f786eSSteven Rostedt 	int resched;
2313554f786eSSteven Rostedt 
2314554f786eSSteven Rostedt 	/* Can't use get_online_cpus because this can be in atomic */
2315554f786eSSteven Rostedt 	resched = ftrace_preempt_disable();
23167a8e76a3SSteven Rostedt 
23179e01c1b7SRusty Russell 	if (!cpumask_test_cpu(cpu, buffer->cpumask))
2318554f786eSSteven Rostedt 		goto out;
23197a8e76a3SSteven Rostedt 
2320f83c9d0fSSteven Rostedt 	spin_lock_irqsave(&cpu_buffer->reader_lock, flags);
2321f83c9d0fSSteven Rostedt 
23223e03fb7fSSteven Rostedt 	__raw_spin_lock(&cpu_buffer->lock);
23237a8e76a3SSteven Rostedt 
23247a8e76a3SSteven Rostedt 	rb_reset_cpu(cpu_buffer);
23257a8e76a3SSteven Rostedt 
23263e03fb7fSSteven Rostedt 	__raw_spin_unlock(&cpu_buffer->lock);
2327f83c9d0fSSteven Rostedt 
2328f83c9d0fSSteven Rostedt 	spin_unlock_irqrestore(&cpu_buffer->reader_lock, flags);
2329554f786eSSteven Rostedt  out:
2330554f786eSSteven Rostedt 	ftrace_preempt_enable(resched);
23317a8e76a3SSteven Rostedt }
2332c4f50183SRobert Richter EXPORT_SYMBOL_GPL(ring_buffer_reset_cpu);
23337a8e76a3SSteven Rostedt 
23347a8e76a3SSteven Rostedt /**
23357a8e76a3SSteven Rostedt  * ring_buffer_reset - reset a ring buffer
23367a8e76a3SSteven Rostedt  * @buffer: The ring buffer to reset all cpu buffers
23377a8e76a3SSteven Rostedt  */
23387a8e76a3SSteven Rostedt void ring_buffer_reset(struct ring_buffer *buffer)
23397a8e76a3SSteven Rostedt {
2340554f786eSSteven Rostedt 	int resched;
23417a8e76a3SSteven Rostedt 	int cpu;
23427a8e76a3SSteven Rostedt 
2343554f786eSSteven Rostedt 	/* Can't use get_online_cpus because this can be in atomic */
2344554f786eSSteven Rostedt 	resched = ftrace_preempt_disable();
2345554f786eSSteven Rostedt 
23467a8e76a3SSteven Rostedt 	for_each_buffer_cpu(buffer, cpu)
2347d769041fSSteven Rostedt 		ring_buffer_reset_cpu(buffer, cpu);
2348554f786eSSteven Rostedt 
2349554f786eSSteven Rostedt 	ftrace_preempt_enable(resched);
23507a8e76a3SSteven Rostedt }
2351c4f50183SRobert Richter EXPORT_SYMBOL_GPL(ring_buffer_reset);
23527a8e76a3SSteven Rostedt 
23537a8e76a3SSteven Rostedt /**
23547a8e76a3SSteven Rostedt  * rind_buffer_empty - is the ring buffer empty?
23557a8e76a3SSteven Rostedt  * @buffer: The ring buffer to test
23567a8e76a3SSteven Rostedt  */
23577a8e76a3SSteven Rostedt int ring_buffer_empty(struct ring_buffer *buffer)
23587a8e76a3SSteven Rostedt {
23597a8e76a3SSteven Rostedt 	struct ring_buffer_per_cpu *cpu_buffer;
23607a8e76a3SSteven Rostedt 	int cpu;
23617a8e76a3SSteven Rostedt 
2362554f786eSSteven Rostedt 	get_online_cpus();
2363554f786eSSteven Rostedt 
23647a8e76a3SSteven Rostedt 	/* yes this is racy, but if you don't like the race, lock the buffer */
23657a8e76a3SSteven Rostedt 	for_each_buffer_cpu(buffer, cpu) {
23667a8e76a3SSteven Rostedt 		cpu_buffer = buffer->buffers[cpu];
23677a8e76a3SSteven Rostedt 		if (!rb_per_cpu_empty(cpu_buffer))
23687a8e76a3SSteven Rostedt 			return 0;
23697a8e76a3SSteven Rostedt 	}
2370554f786eSSteven Rostedt 
2371554f786eSSteven Rostedt 	put_online_cpus();
2372554f786eSSteven Rostedt 
23737a8e76a3SSteven Rostedt 	return 1;
23747a8e76a3SSteven Rostedt }
2375c4f50183SRobert Richter EXPORT_SYMBOL_GPL(ring_buffer_empty);
23767a8e76a3SSteven Rostedt 
23777a8e76a3SSteven Rostedt /**
23787a8e76a3SSteven Rostedt  * ring_buffer_empty_cpu - is a cpu buffer of a ring buffer empty?
23797a8e76a3SSteven Rostedt  * @buffer: The ring buffer
23807a8e76a3SSteven Rostedt  * @cpu: The CPU buffer to test
23817a8e76a3SSteven Rostedt  */
23827a8e76a3SSteven Rostedt int ring_buffer_empty_cpu(struct ring_buffer *buffer, int cpu)
23837a8e76a3SSteven Rostedt {
23847a8e76a3SSteven Rostedt 	struct ring_buffer_per_cpu *cpu_buffer;
2385554f786eSSteven Rostedt 	int ret = 1;
2386554f786eSSteven Rostedt 
2387554f786eSSteven Rostedt 	get_online_cpus();
23887a8e76a3SSteven Rostedt 
23899e01c1b7SRusty Russell 	if (!cpumask_test_cpu(cpu, buffer->cpumask))
2390554f786eSSteven Rostedt 		goto out;
23917a8e76a3SSteven Rostedt 
23927a8e76a3SSteven Rostedt 	cpu_buffer = buffer->buffers[cpu];
2393554f786eSSteven Rostedt 	ret = rb_per_cpu_empty(cpu_buffer);
2394554f786eSSteven Rostedt 
2395554f786eSSteven Rostedt  out:
2396554f786eSSteven Rostedt 	put_online_cpus();
2397554f786eSSteven Rostedt 
2398554f786eSSteven Rostedt 	return ret;
23997a8e76a3SSteven Rostedt }
2400c4f50183SRobert Richter EXPORT_SYMBOL_GPL(ring_buffer_empty_cpu);
24017a8e76a3SSteven Rostedt 
24027a8e76a3SSteven Rostedt /**
24037a8e76a3SSteven Rostedt  * ring_buffer_swap_cpu - swap a CPU buffer between two ring buffers
24047a8e76a3SSteven Rostedt  * @buffer_a: One buffer to swap with
24057a8e76a3SSteven Rostedt  * @buffer_b: The other buffer to swap with
24067a8e76a3SSteven Rostedt  *
24077a8e76a3SSteven Rostedt  * This function is useful for tracers that want to take a "snapshot"
24087a8e76a3SSteven Rostedt  * of a CPU buffer and has another back up buffer lying around.
24097a8e76a3SSteven Rostedt  * it is expected that the tracer handles the cpu buffer not being
24107a8e76a3SSteven Rostedt  * used at the moment.
24117a8e76a3SSteven Rostedt  */
24127a8e76a3SSteven Rostedt int ring_buffer_swap_cpu(struct ring_buffer *buffer_a,
24137a8e76a3SSteven Rostedt 			 struct ring_buffer *buffer_b, int cpu)
24147a8e76a3SSteven Rostedt {
24157a8e76a3SSteven Rostedt 	struct ring_buffer_per_cpu *cpu_buffer_a;
24167a8e76a3SSteven Rostedt 	struct ring_buffer_per_cpu *cpu_buffer_b;
2417554f786eSSteven Rostedt 	int ret = -EINVAL;
2418554f786eSSteven Rostedt 
2419554f786eSSteven Rostedt 	get_online_cpus();
24207a8e76a3SSteven Rostedt 
24219e01c1b7SRusty Russell 	if (!cpumask_test_cpu(cpu, buffer_a->cpumask) ||
24229e01c1b7SRusty Russell 	    !cpumask_test_cpu(cpu, buffer_b->cpumask))
2423554f786eSSteven Rostedt 		goto out;
24247a8e76a3SSteven Rostedt 
24257a8e76a3SSteven Rostedt 	/* At least make sure the two buffers are somewhat the same */
24266d102bc6SLai Jiangshan 	if (buffer_a->pages != buffer_b->pages)
2427554f786eSSteven Rostedt 		goto out;
2428554f786eSSteven Rostedt 
2429554f786eSSteven Rostedt 	ret = -EAGAIN;
24307a8e76a3SSteven Rostedt 
243197b17efeSSteven Rostedt 	if (ring_buffer_flags != RB_BUFFERS_ON)
2432554f786eSSteven Rostedt 		goto out;
243397b17efeSSteven Rostedt 
243497b17efeSSteven Rostedt 	if (atomic_read(&buffer_a->record_disabled))
2435554f786eSSteven Rostedt 		goto out;
243697b17efeSSteven Rostedt 
243797b17efeSSteven Rostedt 	if (atomic_read(&buffer_b->record_disabled))
2438554f786eSSteven Rostedt 		goto out;
243997b17efeSSteven Rostedt 
24407a8e76a3SSteven Rostedt 	cpu_buffer_a = buffer_a->buffers[cpu];
24417a8e76a3SSteven Rostedt 	cpu_buffer_b = buffer_b->buffers[cpu];
24427a8e76a3SSteven Rostedt 
244397b17efeSSteven Rostedt 	if (atomic_read(&cpu_buffer_a->record_disabled))
2444554f786eSSteven Rostedt 		goto out;
244597b17efeSSteven Rostedt 
244697b17efeSSteven Rostedt 	if (atomic_read(&cpu_buffer_b->record_disabled))
2447554f786eSSteven Rostedt 		goto out;
244897b17efeSSteven Rostedt 
24497a8e76a3SSteven Rostedt 	/*
24507a8e76a3SSteven Rostedt 	 * We can't do a synchronize_sched here because this
24517a8e76a3SSteven Rostedt 	 * function can be called in atomic context.
24527a8e76a3SSteven Rostedt 	 * Normally this will be called from the same CPU as cpu.
24537a8e76a3SSteven Rostedt 	 * If not it's up to the caller to protect this.
24547a8e76a3SSteven Rostedt 	 */
24557a8e76a3SSteven Rostedt 	atomic_inc(&cpu_buffer_a->record_disabled);
24567a8e76a3SSteven Rostedt 	atomic_inc(&cpu_buffer_b->record_disabled);
24577a8e76a3SSteven Rostedt 
24587a8e76a3SSteven Rostedt 	buffer_a->buffers[cpu] = cpu_buffer_b;
24597a8e76a3SSteven Rostedt 	buffer_b->buffers[cpu] = cpu_buffer_a;
24607a8e76a3SSteven Rostedt 
24617a8e76a3SSteven Rostedt 	cpu_buffer_b->buffer = buffer_a;
24627a8e76a3SSteven Rostedt 	cpu_buffer_a->buffer = buffer_b;
24637a8e76a3SSteven Rostedt 
24647a8e76a3SSteven Rostedt 	atomic_dec(&cpu_buffer_a->record_disabled);
24657a8e76a3SSteven Rostedt 	atomic_dec(&cpu_buffer_b->record_disabled);
24667a8e76a3SSteven Rostedt 
2467554f786eSSteven Rostedt 	ret = 0;
2468554f786eSSteven Rostedt out:
2469554f786eSSteven Rostedt 	put_online_cpus();
2470554f786eSSteven Rostedt 
2471554f786eSSteven Rostedt 	return ret;
24727a8e76a3SSteven Rostedt }
2473c4f50183SRobert Richter EXPORT_SYMBOL_GPL(ring_buffer_swap_cpu);
24747a8e76a3SSteven Rostedt 
24758789a9e7SSteven Rostedt static void rb_remove_entries(struct ring_buffer_per_cpu *cpu_buffer,
2476667d2412SLai Jiangshan 			      struct buffer_data_page *bpage,
2477667d2412SLai Jiangshan 			      unsigned int offset)
24788789a9e7SSteven Rostedt {
24798789a9e7SSteven Rostedt 	struct ring_buffer_event *event;
24808789a9e7SSteven Rostedt 	unsigned long head;
24818789a9e7SSteven Rostedt 
24828789a9e7SSteven Rostedt 	__raw_spin_lock(&cpu_buffer->lock);
2483667d2412SLai Jiangshan 	for (head = offset; head < local_read(&bpage->commit);
24848789a9e7SSteven Rostedt 	     head += rb_event_length(event)) {
24858789a9e7SSteven Rostedt 
2486044fa782SSteven Rostedt 		event = __rb_data_page_index(bpage, head);
24878789a9e7SSteven Rostedt 		if (RB_WARN_ON(cpu_buffer, rb_null_event(event)))
24888789a9e7SSteven Rostedt 			return;
24898789a9e7SSteven Rostedt 		/* Only count data entries */
24908789a9e7SSteven Rostedt 		if (event->type != RINGBUF_TYPE_DATA)
24918789a9e7SSteven Rostedt 			continue;
24928789a9e7SSteven Rostedt 		cpu_buffer->entries--;
24938789a9e7SSteven Rostedt 	}
24948789a9e7SSteven Rostedt 	__raw_spin_unlock(&cpu_buffer->lock);
24958789a9e7SSteven Rostedt }
24968789a9e7SSteven Rostedt 
24978789a9e7SSteven Rostedt /**
24988789a9e7SSteven Rostedt  * ring_buffer_alloc_read_page - allocate a page to read from buffer
24998789a9e7SSteven Rostedt  * @buffer: the buffer to allocate for.
25008789a9e7SSteven Rostedt  *
25018789a9e7SSteven Rostedt  * This function is used in conjunction with ring_buffer_read_page.
25028789a9e7SSteven Rostedt  * When reading a full page from the ring buffer, these functions
25038789a9e7SSteven Rostedt  * can be used to speed up the process. The calling function should
25048789a9e7SSteven Rostedt  * allocate a few pages first with this function. Then when it
25058789a9e7SSteven Rostedt  * needs to get pages from the ring buffer, it passes the result
25068789a9e7SSteven Rostedt  * of this function into ring_buffer_read_page, which will swap
25078789a9e7SSteven Rostedt  * the page that was allocated, with the read page of the buffer.
25088789a9e7SSteven Rostedt  *
25098789a9e7SSteven Rostedt  * Returns:
25108789a9e7SSteven Rostedt  *  The page allocated, or NULL on error.
25118789a9e7SSteven Rostedt  */
25128789a9e7SSteven Rostedt void *ring_buffer_alloc_read_page(struct ring_buffer *buffer)
25138789a9e7SSteven Rostedt {
2514044fa782SSteven Rostedt 	struct buffer_data_page *bpage;
2515ef7a4a16SSteven Rostedt 	unsigned long addr;
25168789a9e7SSteven Rostedt 
25178789a9e7SSteven Rostedt 	addr = __get_free_page(GFP_KERNEL);
25188789a9e7SSteven Rostedt 	if (!addr)
25198789a9e7SSteven Rostedt 		return NULL;
25208789a9e7SSteven Rostedt 
2521044fa782SSteven Rostedt 	bpage = (void *)addr;
25228789a9e7SSteven Rostedt 
2523ef7a4a16SSteven Rostedt 	rb_init_page(bpage);
2524ef7a4a16SSteven Rostedt 
2525044fa782SSteven Rostedt 	return bpage;
25268789a9e7SSteven Rostedt }
25278789a9e7SSteven Rostedt 
25288789a9e7SSteven Rostedt /**
25298789a9e7SSteven Rostedt  * ring_buffer_free_read_page - free an allocated read page
25308789a9e7SSteven Rostedt  * @buffer: the buffer the page was allocate for
25318789a9e7SSteven Rostedt  * @data: the page to free
25328789a9e7SSteven Rostedt  *
25338789a9e7SSteven Rostedt  * Free a page allocated from ring_buffer_alloc_read_page.
25348789a9e7SSteven Rostedt  */
25358789a9e7SSteven Rostedt void ring_buffer_free_read_page(struct ring_buffer *buffer, void *data)
25368789a9e7SSteven Rostedt {
25378789a9e7SSteven Rostedt 	free_page((unsigned long)data);
25388789a9e7SSteven Rostedt }
25398789a9e7SSteven Rostedt 
25408789a9e7SSteven Rostedt /**
25418789a9e7SSteven Rostedt  * ring_buffer_read_page - extract a page from the ring buffer
25428789a9e7SSteven Rostedt  * @buffer: buffer to extract from
25438789a9e7SSteven Rostedt  * @data_page: the page to use allocated from ring_buffer_alloc_read_page
2544ef7a4a16SSteven Rostedt  * @len: amount to extract
25458789a9e7SSteven Rostedt  * @cpu: the cpu of the buffer to extract
25468789a9e7SSteven Rostedt  * @full: should the extraction only happen when the page is full.
25478789a9e7SSteven Rostedt  *
25488789a9e7SSteven Rostedt  * This function will pull out a page from the ring buffer and consume it.
25498789a9e7SSteven Rostedt  * @data_page must be the address of the variable that was returned
25508789a9e7SSteven Rostedt  * from ring_buffer_alloc_read_page. This is because the page might be used
25518789a9e7SSteven Rostedt  * to swap with a page in the ring buffer.
25528789a9e7SSteven Rostedt  *
25538789a9e7SSteven Rostedt  * for example:
2554b85fa01eSLai Jiangshan  *	rpage = ring_buffer_alloc_read_page(buffer);
25558789a9e7SSteven Rostedt  *	if (!rpage)
25568789a9e7SSteven Rostedt  *		return error;
2557ef7a4a16SSteven Rostedt  *	ret = ring_buffer_read_page(buffer, &rpage, len, cpu, 0);
2558667d2412SLai Jiangshan  *	if (ret >= 0)
2559667d2412SLai Jiangshan  *		process_page(rpage, ret);
25608789a9e7SSteven Rostedt  *
25618789a9e7SSteven Rostedt  * When @full is set, the function will not return true unless
25628789a9e7SSteven Rostedt  * the writer is off the reader page.
25638789a9e7SSteven Rostedt  *
25648789a9e7SSteven Rostedt  * Note: it is up to the calling functions to handle sleeps and wakeups.
25658789a9e7SSteven Rostedt  *  The ring buffer can be used anywhere in the kernel and can not
25668789a9e7SSteven Rostedt  *  blindly call wake_up. The layer that uses the ring buffer must be
25678789a9e7SSteven Rostedt  *  responsible for that.
25688789a9e7SSteven Rostedt  *
25698789a9e7SSteven Rostedt  * Returns:
2570667d2412SLai Jiangshan  *  >=0 if data has been transferred, returns the offset of consumed data.
2571667d2412SLai Jiangshan  *  <0 if no data has been transferred.
25728789a9e7SSteven Rostedt  */
25738789a9e7SSteven Rostedt int ring_buffer_read_page(struct ring_buffer *buffer,
2574ef7a4a16SSteven Rostedt 			  void **data_page, size_t len, int cpu, int full)
25758789a9e7SSteven Rostedt {
25768789a9e7SSteven Rostedt 	struct ring_buffer_per_cpu *cpu_buffer = buffer->buffers[cpu];
25778789a9e7SSteven Rostedt 	struct ring_buffer_event *event;
2578044fa782SSteven Rostedt 	struct buffer_data_page *bpage;
2579ef7a4a16SSteven Rostedt 	struct buffer_page *reader;
25808789a9e7SSteven Rostedt 	unsigned long flags;
2581ef7a4a16SSteven Rostedt 	unsigned int commit;
2582667d2412SLai Jiangshan 	unsigned int read;
25834f3640f8SSteven Rostedt 	u64 save_timestamp;
2584667d2412SLai Jiangshan 	int ret = -1;
25858789a9e7SSteven Rostedt 
2586554f786eSSteven Rostedt 	get_online_cpus();
2587554f786eSSteven Rostedt 
2588554f786eSSteven Rostedt 	if (!cpumask_test_cpu(cpu, buffer->cpumask))
2589554f786eSSteven Rostedt 		goto out;
2590554f786eSSteven Rostedt 
2591474d32b6SSteven Rostedt 	/*
2592474d32b6SSteven Rostedt 	 * If len is not big enough to hold the page header, then
2593474d32b6SSteven Rostedt 	 * we can not copy anything.
2594474d32b6SSteven Rostedt 	 */
2595474d32b6SSteven Rostedt 	if (len <= BUF_PAGE_HDR_SIZE)
2596554f786eSSteven Rostedt 		goto out;
2597474d32b6SSteven Rostedt 
2598474d32b6SSteven Rostedt 	len -= BUF_PAGE_HDR_SIZE;
2599474d32b6SSteven Rostedt 
26008789a9e7SSteven Rostedt 	if (!data_page)
2601554f786eSSteven Rostedt 		goto out;
26028789a9e7SSteven Rostedt 
2603044fa782SSteven Rostedt 	bpage = *data_page;
2604044fa782SSteven Rostedt 	if (!bpage)
2605554f786eSSteven Rostedt 		goto out;
26068789a9e7SSteven Rostedt 
26078789a9e7SSteven Rostedt 	spin_lock_irqsave(&cpu_buffer->reader_lock, flags);
26088789a9e7SSteven Rostedt 
2609ef7a4a16SSteven Rostedt 	reader = rb_get_reader_page(cpu_buffer);
2610ef7a4a16SSteven Rostedt 	if (!reader)
2611554f786eSSteven Rostedt 		goto out_unlock;
26128789a9e7SSteven Rostedt 
2613ef7a4a16SSteven Rostedt 	event = rb_reader_event(cpu_buffer);
2614667d2412SLai Jiangshan 
2615ef7a4a16SSteven Rostedt 	read = reader->read;
2616ef7a4a16SSteven Rostedt 	commit = rb_page_commit(reader);
2617ef7a4a16SSteven Rostedt 
26188789a9e7SSteven Rostedt 	/*
2619474d32b6SSteven Rostedt 	 * If this page has been partially read or
2620474d32b6SSteven Rostedt 	 * if len is not big enough to read the rest of the page or
2621474d32b6SSteven Rostedt 	 * a writer is still on the page, then
2622474d32b6SSteven Rostedt 	 * we must copy the data from the page to the buffer.
2623474d32b6SSteven Rostedt 	 * Otherwise, we can simply swap the page with the one passed in.
26248789a9e7SSteven Rostedt 	 */
2625474d32b6SSteven Rostedt 	if (read || (len < (commit - read)) ||
2626ef7a4a16SSteven Rostedt 	    cpu_buffer->reader_page == cpu_buffer->commit_page) {
2627667d2412SLai Jiangshan 		struct buffer_data_page *rpage = cpu_buffer->reader_page->page;
2628474d32b6SSteven Rostedt 		unsigned int rpos = read;
2629474d32b6SSteven Rostedt 		unsigned int pos = 0;
2630ef7a4a16SSteven Rostedt 		unsigned int size;
26318789a9e7SSteven Rostedt 
26328789a9e7SSteven Rostedt 		if (full)
2633554f786eSSteven Rostedt 			goto out_unlock;
26348789a9e7SSteven Rostedt 
2635ef7a4a16SSteven Rostedt 		if (len > (commit - read))
2636ef7a4a16SSteven Rostedt 			len = (commit - read);
2637ef7a4a16SSteven Rostedt 
2638ef7a4a16SSteven Rostedt 		size = rb_event_length(event);
2639ef7a4a16SSteven Rostedt 
2640ef7a4a16SSteven Rostedt 		if (len < size)
2641554f786eSSteven Rostedt 			goto out_unlock;
2642ef7a4a16SSteven Rostedt 
26434f3640f8SSteven Rostedt 		/* save the current timestamp, since the user will need it */
26444f3640f8SSteven Rostedt 		save_timestamp = cpu_buffer->read_stamp;
26454f3640f8SSteven Rostedt 
2646ef7a4a16SSteven Rostedt 		/* Need to copy one event at a time */
2647ef7a4a16SSteven Rostedt 		do {
2648474d32b6SSteven Rostedt 			memcpy(bpage->data + pos, rpage->data + rpos, size);
2649ef7a4a16SSteven Rostedt 
2650ef7a4a16SSteven Rostedt 			len -= size;
2651ef7a4a16SSteven Rostedt 
2652ef7a4a16SSteven Rostedt 			rb_advance_reader(cpu_buffer);
2653474d32b6SSteven Rostedt 			rpos = reader->read;
2654474d32b6SSteven Rostedt 			pos += size;
2655ef7a4a16SSteven Rostedt 
2656ef7a4a16SSteven Rostedt 			event = rb_reader_event(cpu_buffer);
2657ef7a4a16SSteven Rostedt 			size = rb_event_length(event);
2658ef7a4a16SSteven Rostedt 		} while (len > size);
2659667d2412SLai Jiangshan 
2660667d2412SLai Jiangshan 		/* update bpage */
2661ef7a4a16SSteven Rostedt 		local_set(&bpage->commit, pos);
26624f3640f8SSteven Rostedt 		bpage->time_stamp = save_timestamp;
2663ef7a4a16SSteven Rostedt 
2664474d32b6SSteven Rostedt 		/* we copied everything to the beginning */
2665474d32b6SSteven Rostedt 		read = 0;
26668789a9e7SSteven Rostedt 	} else {
26678789a9e7SSteven Rostedt 		/* swap the pages */
2668044fa782SSteven Rostedt 		rb_init_page(bpage);
2669ef7a4a16SSteven Rostedt 		bpage = reader->page;
2670ef7a4a16SSteven Rostedt 		reader->page = *data_page;
2671ef7a4a16SSteven Rostedt 		local_set(&reader->write, 0);
2672ef7a4a16SSteven Rostedt 		reader->read = 0;
2673044fa782SSteven Rostedt 		*data_page = bpage;
26748789a9e7SSteven Rostedt 
26758789a9e7SSteven Rostedt 		/* update the entry counter */
2676667d2412SLai Jiangshan 		rb_remove_entries(cpu_buffer, bpage, read);
2677ef7a4a16SSteven Rostedt 	}
2678ef7a4a16SSteven Rostedt 	ret = read;
2679ef7a4a16SSteven Rostedt 
2680554f786eSSteven Rostedt  out_unlock:
26818789a9e7SSteven Rostedt 	spin_unlock_irqrestore(&cpu_buffer->reader_lock, flags);
26828789a9e7SSteven Rostedt 
2683554f786eSSteven Rostedt  out:
2684554f786eSSteven Rostedt 	put_online_cpus();
2685554f786eSSteven Rostedt 
26868789a9e7SSteven Rostedt 	return ret;
26878789a9e7SSteven Rostedt }
26888789a9e7SSteven Rostedt 
2689a3583244SSteven Rostedt static ssize_t
2690a3583244SSteven Rostedt rb_simple_read(struct file *filp, char __user *ubuf,
2691a3583244SSteven Rostedt 	       size_t cnt, loff_t *ppos)
2692a3583244SSteven Rostedt {
26935e39841cSHannes Eder 	unsigned long *p = filp->private_data;
2694a3583244SSteven Rostedt 	char buf[64];
2695a3583244SSteven Rostedt 	int r;
2696a3583244SSteven Rostedt 
2697033601a3SSteven Rostedt 	if (test_bit(RB_BUFFERS_DISABLED_BIT, p))
2698033601a3SSteven Rostedt 		r = sprintf(buf, "permanently disabled\n");
2699033601a3SSteven Rostedt 	else
2700033601a3SSteven Rostedt 		r = sprintf(buf, "%d\n", test_bit(RB_BUFFERS_ON_BIT, p));
2701a3583244SSteven Rostedt 
2702a3583244SSteven Rostedt 	return simple_read_from_buffer(ubuf, cnt, ppos, buf, r);
2703a3583244SSteven Rostedt }
2704a3583244SSteven Rostedt 
2705a3583244SSteven Rostedt static ssize_t
2706a3583244SSteven Rostedt rb_simple_write(struct file *filp, const char __user *ubuf,
2707a3583244SSteven Rostedt 		size_t cnt, loff_t *ppos)
2708a3583244SSteven Rostedt {
27095e39841cSHannes Eder 	unsigned long *p = filp->private_data;
2710a3583244SSteven Rostedt 	char buf[64];
27115e39841cSHannes Eder 	unsigned long val;
2712a3583244SSteven Rostedt 	int ret;
2713a3583244SSteven Rostedt 
2714a3583244SSteven Rostedt 	if (cnt >= sizeof(buf))
2715a3583244SSteven Rostedt 		return -EINVAL;
2716a3583244SSteven Rostedt 
2717a3583244SSteven Rostedt 	if (copy_from_user(&buf, ubuf, cnt))
2718a3583244SSteven Rostedt 		return -EFAULT;
2719a3583244SSteven Rostedt 
2720a3583244SSteven Rostedt 	buf[cnt] = 0;
2721a3583244SSteven Rostedt 
2722a3583244SSteven Rostedt 	ret = strict_strtoul(buf, 10, &val);
2723a3583244SSteven Rostedt 	if (ret < 0)
2724a3583244SSteven Rostedt 		return ret;
2725a3583244SSteven Rostedt 
2726033601a3SSteven Rostedt 	if (val)
2727033601a3SSteven Rostedt 		set_bit(RB_BUFFERS_ON_BIT, p);
2728033601a3SSteven Rostedt 	else
2729033601a3SSteven Rostedt 		clear_bit(RB_BUFFERS_ON_BIT, p);
2730a3583244SSteven Rostedt 
2731a3583244SSteven Rostedt 	(*ppos)++;
2732a3583244SSteven Rostedt 
2733a3583244SSteven Rostedt 	return cnt;
2734a3583244SSteven Rostedt }
2735a3583244SSteven Rostedt 
27365e2336a0SSteven Rostedt static const struct file_operations rb_simple_fops = {
2737a3583244SSteven Rostedt 	.open		= tracing_open_generic,
2738a3583244SSteven Rostedt 	.read		= rb_simple_read,
2739a3583244SSteven Rostedt 	.write		= rb_simple_write,
2740a3583244SSteven Rostedt };
2741a3583244SSteven Rostedt 
2742a3583244SSteven Rostedt 
2743a3583244SSteven Rostedt static __init int rb_init_debugfs(void)
2744a3583244SSteven Rostedt {
2745a3583244SSteven Rostedt 	struct dentry *d_tracer;
2746a3583244SSteven Rostedt 	struct dentry *entry;
2747a3583244SSteven Rostedt 
2748a3583244SSteven Rostedt 	d_tracer = tracing_init_dentry();
2749a3583244SSteven Rostedt 
2750a3583244SSteven Rostedt 	entry = debugfs_create_file("tracing_on", 0644, d_tracer,
2751033601a3SSteven Rostedt 				    &ring_buffer_flags, &rb_simple_fops);
2752a3583244SSteven Rostedt 	if (!entry)
2753a3583244SSteven Rostedt 		pr_warning("Could not create debugfs 'tracing_on' entry\n");
2754a3583244SSteven Rostedt 
2755a3583244SSteven Rostedt 	return 0;
2756a3583244SSteven Rostedt }
2757a3583244SSteven Rostedt 
2758a3583244SSteven Rostedt fs_initcall(rb_init_debugfs);
2759554f786eSSteven Rostedt 
2760*59222efeSSteven Rostedt #ifdef CONFIG_HOTPLUG_CPU
2761554f786eSSteven Rostedt static int __cpuinit rb_cpu_notify(struct notifier_block *self,
2762554f786eSSteven Rostedt 				   unsigned long action, void *hcpu)
2763554f786eSSteven Rostedt {
2764554f786eSSteven Rostedt 	struct ring_buffer *buffer =
2765554f786eSSteven Rostedt 		container_of(self, struct ring_buffer, cpu_notify);
2766554f786eSSteven Rostedt 	long cpu = (long)hcpu;
2767554f786eSSteven Rostedt 
2768554f786eSSteven Rostedt 	switch (action) {
2769554f786eSSteven Rostedt 	case CPU_UP_PREPARE:
2770554f786eSSteven Rostedt 	case CPU_UP_PREPARE_FROZEN:
2771554f786eSSteven Rostedt 		if (cpu_isset(cpu, *buffer->cpumask))
2772554f786eSSteven Rostedt 			return NOTIFY_OK;
2773554f786eSSteven Rostedt 
2774554f786eSSteven Rostedt 		buffer->buffers[cpu] =
2775554f786eSSteven Rostedt 			rb_allocate_cpu_buffer(buffer, cpu);
2776554f786eSSteven Rostedt 		if (!buffer->buffers[cpu]) {
2777554f786eSSteven Rostedt 			WARN(1, "failed to allocate ring buffer on CPU %ld\n",
2778554f786eSSteven Rostedt 			     cpu);
2779554f786eSSteven Rostedt 			return NOTIFY_OK;
2780554f786eSSteven Rostedt 		}
2781554f786eSSteven Rostedt 		smp_wmb();
2782554f786eSSteven Rostedt 		cpu_set(cpu, *buffer->cpumask);
2783554f786eSSteven Rostedt 		break;
2784554f786eSSteven Rostedt 	case CPU_DOWN_PREPARE:
2785554f786eSSteven Rostedt 	case CPU_DOWN_PREPARE_FROZEN:
2786554f786eSSteven Rostedt 		/*
2787554f786eSSteven Rostedt 		 * Do nothing.
2788554f786eSSteven Rostedt 		 *  If we were to free the buffer, then the user would
2789554f786eSSteven Rostedt 		 *  lose any trace that was in the buffer.
2790554f786eSSteven Rostedt 		 */
2791554f786eSSteven Rostedt 		break;
2792554f786eSSteven Rostedt 	default:
2793554f786eSSteven Rostedt 		break;
2794554f786eSSteven Rostedt 	}
2795554f786eSSteven Rostedt 	return NOTIFY_OK;
2796554f786eSSteven Rostedt }
2797554f786eSSteven Rostedt #endif
2798