xref: /linux-6.15/kernel/trace/ring_buffer.c (revision d06bbd66)
17a8e76a3SSteven Rostedt /*
27a8e76a3SSteven Rostedt  * Generic ring buffer
37a8e76a3SSteven Rostedt  *
47a8e76a3SSteven Rostedt  * Copyright (C) 2008 Steven Rostedt <[email protected]>
57a8e76a3SSteven Rostedt  */
67a8e76a3SSteven Rostedt #include <linux/ring_buffer.h>
77a8e76a3SSteven Rostedt #include <linux/spinlock.h>
87a8e76a3SSteven Rostedt #include <linux/debugfs.h>
97a8e76a3SSteven Rostedt #include <linux/uaccess.h>
107a8e76a3SSteven Rostedt #include <linux/module.h>
117a8e76a3SSteven Rostedt #include <linux/percpu.h>
127a8e76a3SSteven Rostedt #include <linux/mutex.h>
137a8e76a3SSteven Rostedt #include <linux/sched.h>	/* used for sched_clock() (for now) */
147a8e76a3SSteven Rostedt #include <linux/init.h>
157a8e76a3SSteven Rostedt #include <linux/hash.h>
167a8e76a3SSteven Rostedt #include <linux/list.h>
177a8e76a3SSteven Rostedt #include <linux/fs.h>
187a8e76a3SSteven Rostedt 
19182e9f5fSSteven Rostedt #include "trace.h"
20182e9f5fSSteven Rostedt 
21a3583244SSteven Rostedt /* Global flag to disable all recording to ring buffers */
22a3583244SSteven Rostedt static int ring_buffers_off __read_mostly;
23a3583244SSteven Rostedt 
24a3583244SSteven Rostedt /**
25a3583244SSteven Rostedt  * tracing_on - enable all tracing buffers
26a3583244SSteven Rostedt  *
27a3583244SSteven Rostedt  * This function enables all tracing buffers that may have been
28a3583244SSteven Rostedt  * disabled with tracing_off.
29a3583244SSteven Rostedt  */
30a3583244SSteven Rostedt void tracing_on(void)
31a3583244SSteven Rostedt {
32a3583244SSteven Rostedt 	ring_buffers_off = 0;
33a3583244SSteven Rostedt }
34a3583244SSteven Rostedt 
35a3583244SSteven Rostedt /**
36a3583244SSteven Rostedt  * tracing_off - turn off all tracing buffers
37a3583244SSteven Rostedt  *
38a3583244SSteven Rostedt  * This function stops all tracing buffers from recording data.
39a3583244SSteven Rostedt  * It does not disable any overhead the tracers themselves may
40a3583244SSteven Rostedt  * be causing. This function simply causes all recording to
41a3583244SSteven Rostedt  * the ring buffers to fail.
42a3583244SSteven Rostedt  */
43a3583244SSteven Rostedt void tracing_off(void)
44a3583244SSteven Rostedt {
45a3583244SSteven Rostedt 	ring_buffers_off = 1;
46a3583244SSteven Rostedt }
47a3583244SSteven Rostedt 
48d06bbd66SIngo Molnar #include "trace.h"
49d06bbd66SIngo Molnar 
507a8e76a3SSteven Rostedt /* Up this if you want to test the TIME_EXTENTS and normalization */
517a8e76a3SSteven Rostedt #define DEBUG_SHIFT 0
527a8e76a3SSteven Rostedt 
537a8e76a3SSteven Rostedt /* FIXME!!! */
547a8e76a3SSteven Rostedt u64 ring_buffer_time_stamp(int cpu)
557a8e76a3SSteven Rostedt {
567a8e76a3SSteven Rostedt 	/* shift to debug/test normalization and TIME_EXTENTS */
577a8e76a3SSteven Rostedt 	return sched_clock() << DEBUG_SHIFT;
587a8e76a3SSteven Rostedt }
597a8e76a3SSteven Rostedt 
607a8e76a3SSteven Rostedt void ring_buffer_normalize_time_stamp(int cpu, u64 *ts)
617a8e76a3SSteven Rostedt {
627a8e76a3SSteven Rostedt 	/* Just stupid testing the normalize function and deltas */
637a8e76a3SSteven Rostedt 	*ts >>= DEBUG_SHIFT;
647a8e76a3SSteven Rostedt }
657a8e76a3SSteven Rostedt 
667a8e76a3SSteven Rostedt #define RB_EVNT_HDR_SIZE (sizeof(struct ring_buffer_event))
677a8e76a3SSteven Rostedt #define RB_ALIGNMENT_SHIFT	2
687a8e76a3SSteven Rostedt #define RB_ALIGNMENT		(1 << RB_ALIGNMENT_SHIFT)
697a8e76a3SSteven Rostedt #define RB_MAX_SMALL_DATA	28
707a8e76a3SSteven Rostedt 
717a8e76a3SSteven Rostedt enum {
727a8e76a3SSteven Rostedt 	RB_LEN_TIME_EXTEND = 8,
737a8e76a3SSteven Rostedt 	RB_LEN_TIME_STAMP = 16,
747a8e76a3SSteven Rostedt };
757a8e76a3SSteven Rostedt 
767a8e76a3SSteven Rostedt /* inline for ring buffer fast paths */
777a8e76a3SSteven Rostedt static inline unsigned
787a8e76a3SSteven Rostedt rb_event_length(struct ring_buffer_event *event)
797a8e76a3SSteven Rostedt {
807a8e76a3SSteven Rostedt 	unsigned length;
817a8e76a3SSteven Rostedt 
827a8e76a3SSteven Rostedt 	switch (event->type) {
837a8e76a3SSteven Rostedt 	case RINGBUF_TYPE_PADDING:
847a8e76a3SSteven Rostedt 		/* undefined */
857a8e76a3SSteven Rostedt 		return -1;
867a8e76a3SSteven Rostedt 
877a8e76a3SSteven Rostedt 	case RINGBUF_TYPE_TIME_EXTEND:
887a8e76a3SSteven Rostedt 		return RB_LEN_TIME_EXTEND;
897a8e76a3SSteven Rostedt 
907a8e76a3SSteven Rostedt 	case RINGBUF_TYPE_TIME_STAMP:
917a8e76a3SSteven Rostedt 		return RB_LEN_TIME_STAMP;
927a8e76a3SSteven Rostedt 
937a8e76a3SSteven Rostedt 	case RINGBUF_TYPE_DATA:
947a8e76a3SSteven Rostedt 		if (event->len)
957a8e76a3SSteven Rostedt 			length = event->len << RB_ALIGNMENT_SHIFT;
967a8e76a3SSteven Rostedt 		else
977a8e76a3SSteven Rostedt 			length = event->array[0];
987a8e76a3SSteven Rostedt 		return length + RB_EVNT_HDR_SIZE;
997a8e76a3SSteven Rostedt 	default:
1007a8e76a3SSteven Rostedt 		BUG();
1017a8e76a3SSteven Rostedt 	}
1027a8e76a3SSteven Rostedt 	/* not hit */
1037a8e76a3SSteven Rostedt 	return 0;
1047a8e76a3SSteven Rostedt }
1057a8e76a3SSteven Rostedt 
1067a8e76a3SSteven Rostedt /**
1077a8e76a3SSteven Rostedt  * ring_buffer_event_length - return the length of the event
1087a8e76a3SSteven Rostedt  * @event: the event to get the length of
1097a8e76a3SSteven Rostedt  */
1107a8e76a3SSteven Rostedt unsigned ring_buffer_event_length(struct ring_buffer_event *event)
1117a8e76a3SSteven Rostedt {
1127a8e76a3SSteven Rostedt 	return rb_event_length(event);
1137a8e76a3SSteven Rostedt }
1147a8e76a3SSteven Rostedt 
1157a8e76a3SSteven Rostedt /* inline for ring buffer fast paths */
1167a8e76a3SSteven Rostedt static inline void *
1177a8e76a3SSteven Rostedt rb_event_data(struct ring_buffer_event *event)
1187a8e76a3SSteven Rostedt {
1197a8e76a3SSteven Rostedt 	BUG_ON(event->type != RINGBUF_TYPE_DATA);
1207a8e76a3SSteven Rostedt 	/* If length is in len field, then array[0] has the data */
1217a8e76a3SSteven Rostedt 	if (event->len)
1227a8e76a3SSteven Rostedt 		return (void *)&event->array[0];
1237a8e76a3SSteven Rostedt 	/* Otherwise length is in array[0] and array[1] has the data */
1247a8e76a3SSteven Rostedt 	return (void *)&event->array[1];
1257a8e76a3SSteven Rostedt }
1267a8e76a3SSteven Rostedt 
1277a8e76a3SSteven Rostedt /**
1287a8e76a3SSteven Rostedt  * ring_buffer_event_data - return the data of the event
1297a8e76a3SSteven Rostedt  * @event: the event to get the data from
1307a8e76a3SSteven Rostedt  */
1317a8e76a3SSteven Rostedt void *ring_buffer_event_data(struct ring_buffer_event *event)
1327a8e76a3SSteven Rostedt {
1337a8e76a3SSteven Rostedt 	return rb_event_data(event);
1347a8e76a3SSteven Rostedt }
1357a8e76a3SSteven Rostedt 
1367a8e76a3SSteven Rostedt #define for_each_buffer_cpu(buffer, cpu)		\
1377a8e76a3SSteven Rostedt 	for_each_cpu_mask(cpu, buffer->cpumask)
1387a8e76a3SSteven Rostedt 
1397a8e76a3SSteven Rostedt #define TS_SHIFT	27
1407a8e76a3SSteven Rostedt #define TS_MASK		((1ULL << TS_SHIFT) - 1)
1417a8e76a3SSteven Rostedt #define TS_DELTA_TEST	(~TS_MASK)
1427a8e76a3SSteven Rostedt 
1437a8e76a3SSteven Rostedt /*
1447a8e76a3SSteven Rostedt  * This hack stolen from mm/slob.c.
1457a8e76a3SSteven Rostedt  * We can store per page timing information in the page frame of the page.
1467a8e76a3SSteven Rostedt  * Thanks to Peter Zijlstra for suggesting this idea.
1477a8e76a3SSteven Rostedt  */
1487a8e76a3SSteven Rostedt struct buffer_page {
1497a8e76a3SSteven Rostedt 	u64		 time_stamp;	/* page time stamp */
150bf41a158SSteven Rostedt 	local_t		 write;		/* index for next write */
151bf41a158SSteven Rostedt 	local_t		 commit;	/* write commited index */
1526f807acdSSteven Rostedt 	unsigned	 read;		/* index for next read */
1537a8e76a3SSteven Rostedt 	struct list_head list;		/* list of free pages */
154e4c2ce82SSteven Rostedt 	void *page;			/* Actual data page */
1557a8e76a3SSteven Rostedt };
1567a8e76a3SSteven Rostedt 
1577a8e76a3SSteven Rostedt /*
158ed56829cSSteven Rostedt  * Also stolen from mm/slob.c. Thanks to Mathieu Desnoyers for pointing
159ed56829cSSteven Rostedt  * this issue out.
160ed56829cSSteven Rostedt  */
161ed56829cSSteven Rostedt static inline void free_buffer_page(struct buffer_page *bpage)
162ed56829cSSteven Rostedt {
163e4c2ce82SSteven Rostedt 	if (bpage->page)
1646ae2a076SSteven Rostedt 		free_page((unsigned long)bpage->page);
165e4c2ce82SSteven Rostedt 	kfree(bpage);
166ed56829cSSteven Rostedt }
167ed56829cSSteven Rostedt 
168ed56829cSSteven Rostedt /*
1697a8e76a3SSteven Rostedt  * We need to fit the time_stamp delta into 27 bits.
1707a8e76a3SSteven Rostedt  */
1717a8e76a3SSteven Rostedt static inline int test_time_stamp(u64 delta)
1727a8e76a3SSteven Rostedt {
1737a8e76a3SSteven Rostedt 	if (delta & TS_DELTA_TEST)
1747a8e76a3SSteven Rostedt 		return 1;
1757a8e76a3SSteven Rostedt 	return 0;
1767a8e76a3SSteven Rostedt }
1777a8e76a3SSteven Rostedt 
1787a8e76a3SSteven Rostedt #define BUF_PAGE_SIZE PAGE_SIZE
1797a8e76a3SSteven Rostedt 
1807a8e76a3SSteven Rostedt /*
1817a8e76a3SSteven Rostedt  * head_page == tail_page && head == tail then buffer is empty.
1827a8e76a3SSteven Rostedt  */
1837a8e76a3SSteven Rostedt struct ring_buffer_per_cpu {
1847a8e76a3SSteven Rostedt 	int				cpu;
1857a8e76a3SSteven Rostedt 	struct ring_buffer		*buffer;
186f83c9d0fSSteven Rostedt 	spinlock_t			reader_lock; /* serialize readers */
1873e03fb7fSSteven Rostedt 	raw_spinlock_t			lock;
1887a8e76a3SSteven Rostedt 	struct lock_class_key		lock_key;
1897a8e76a3SSteven Rostedt 	struct list_head		pages;
1906f807acdSSteven Rostedt 	struct buffer_page		*head_page;	/* read from head */
1916f807acdSSteven Rostedt 	struct buffer_page		*tail_page;	/* write to tail */
192bf41a158SSteven Rostedt 	struct buffer_page		*commit_page;	/* commited pages */
193d769041fSSteven Rostedt 	struct buffer_page		*reader_page;
1947a8e76a3SSteven Rostedt 	unsigned long			overrun;
1957a8e76a3SSteven Rostedt 	unsigned long			entries;
1967a8e76a3SSteven Rostedt 	u64				write_stamp;
1977a8e76a3SSteven Rostedt 	u64				read_stamp;
1987a8e76a3SSteven Rostedt 	atomic_t			record_disabled;
1997a8e76a3SSteven Rostedt };
2007a8e76a3SSteven Rostedt 
2017a8e76a3SSteven Rostedt struct ring_buffer {
2027a8e76a3SSteven Rostedt 	unsigned long			size;
2037a8e76a3SSteven Rostedt 	unsigned			pages;
2047a8e76a3SSteven Rostedt 	unsigned			flags;
2057a8e76a3SSteven Rostedt 	int				cpus;
2067a8e76a3SSteven Rostedt 	cpumask_t			cpumask;
2077a8e76a3SSteven Rostedt 	atomic_t			record_disabled;
2087a8e76a3SSteven Rostedt 
2097a8e76a3SSteven Rostedt 	struct mutex			mutex;
2107a8e76a3SSteven Rostedt 
2117a8e76a3SSteven Rostedt 	struct ring_buffer_per_cpu	**buffers;
2127a8e76a3SSteven Rostedt };
2137a8e76a3SSteven Rostedt 
2147a8e76a3SSteven Rostedt struct ring_buffer_iter {
2157a8e76a3SSteven Rostedt 	struct ring_buffer_per_cpu	*cpu_buffer;
2167a8e76a3SSteven Rostedt 	unsigned long			head;
2177a8e76a3SSteven Rostedt 	struct buffer_page		*head_page;
2187a8e76a3SSteven Rostedt 	u64				read_stamp;
2197a8e76a3SSteven Rostedt };
2207a8e76a3SSteven Rostedt 
221f536aafcSSteven Rostedt /* buffer may be either ring_buffer or ring_buffer_per_cpu */
2227a8e76a3SSteven Rostedt #define RB_WARN_ON(buffer, cond)				\
223*3e89c7bbSSteven Rostedt 	({							\
224*3e89c7bbSSteven Rostedt 		int _____ret = unlikely(cond);			\
225*3e89c7bbSSteven Rostedt 		if (_____ret) {					\
226bf41a158SSteven Rostedt 			atomic_inc(&buffer->record_disabled);	\
227bf41a158SSteven Rostedt 			WARN_ON(1);				\
228bf41a158SSteven Rostedt 		}						\
229*3e89c7bbSSteven Rostedt 		_____ret;					\
230*3e89c7bbSSteven Rostedt 	})
231f536aafcSSteven Rostedt 
2327a8e76a3SSteven Rostedt /**
2337a8e76a3SSteven Rostedt  * check_pages - integrity check of buffer pages
2347a8e76a3SSteven Rostedt  * @cpu_buffer: CPU buffer with pages to test
2357a8e76a3SSteven Rostedt  *
2367a8e76a3SSteven Rostedt  * As a safty measure we check to make sure the data pages have not
2377a8e76a3SSteven Rostedt  * been corrupted.
2387a8e76a3SSteven Rostedt  */
2397a8e76a3SSteven Rostedt static int rb_check_pages(struct ring_buffer_per_cpu *cpu_buffer)
2407a8e76a3SSteven Rostedt {
2417a8e76a3SSteven Rostedt 	struct list_head *head = &cpu_buffer->pages;
2427a8e76a3SSteven Rostedt 	struct buffer_page *page, *tmp;
2437a8e76a3SSteven Rostedt 
244*3e89c7bbSSteven Rostedt 	if (RB_WARN_ON(cpu_buffer, head->next->prev != head))
245*3e89c7bbSSteven Rostedt 		return -1;
246*3e89c7bbSSteven Rostedt 	if (RB_WARN_ON(cpu_buffer, head->prev->next != head))
247*3e89c7bbSSteven Rostedt 		return -1;
2487a8e76a3SSteven Rostedt 
2497a8e76a3SSteven Rostedt 	list_for_each_entry_safe(page, tmp, head, list) {
250*3e89c7bbSSteven Rostedt 		if (RB_WARN_ON(cpu_buffer,
251*3e89c7bbSSteven Rostedt 			       page->list.next->prev != &page->list))
252*3e89c7bbSSteven Rostedt 			return -1;
253*3e89c7bbSSteven Rostedt 		if (RB_WARN_ON(cpu_buffer,
254*3e89c7bbSSteven Rostedt 			       page->list.prev->next != &page->list))
255*3e89c7bbSSteven Rostedt 			return -1;
2567a8e76a3SSteven Rostedt 	}
2577a8e76a3SSteven Rostedt 
2587a8e76a3SSteven Rostedt 	return 0;
2597a8e76a3SSteven Rostedt }
2607a8e76a3SSteven Rostedt 
2617a8e76a3SSteven Rostedt static int rb_allocate_pages(struct ring_buffer_per_cpu *cpu_buffer,
2627a8e76a3SSteven Rostedt 			     unsigned nr_pages)
2637a8e76a3SSteven Rostedt {
2647a8e76a3SSteven Rostedt 	struct list_head *head = &cpu_buffer->pages;
2657a8e76a3SSteven Rostedt 	struct buffer_page *page, *tmp;
2667a8e76a3SSteven Rostedt 	unsigned long addr;
2677a8e76a3SSteven Rostedt 	LIST_HEAD(pages);
2687a8e76a3SSteven Rostedt 	unsigned i;
2697a8e76a3SSteven Rostedt 
2707a8e76a3SSteven Rostedt 	for (i = 0; i < nr_pages; i++) {
271e4c2ce82SSteven Rostedt 		page = kzalloc_node(ALIGN(sizeof(*page), cache_line_size()),
272aa1e0e3bSSteven Rostedt 				    GFP_KERNEL, cpu_to_node(cpu_buffer->cpu));
273e4c2ce82SSteven Rostedt 		if (!page)
274e4c2ce82SSteven Rostedt 			goto free_pages;
275e4c2ce82SSteven Rostedt 		list_add(&page->list, &pages);
276e4c2ce82SSteven Rostedt 
2777a8e76a3SSteven Rostedt 		addr = __get_free_page(GFP_KERNEL);
2787a8e76a3SSteven Rostedt 		if (!addr)
2797a8e76a3SSteven Rostedt 			goto free_pages;
280e4c2ce82SSteven Rostedt 		page->page = (void *)addr;
2817a8e76a3SSteven Rostedt 	}
2827a8e76a3SSteven Rostedt 
2837a8e76a3SSteven Rostedt 	list_splice(&pages, head);
2847a8e76a3SSteven Rostedt 
2857a8e76a3SSteven Rostedt 	rb_check_pages(cpu_buffer);
2867a8e76a3SSteven Rostedt 
2877a8e76a3SSteven Rostedt 	return 0;
2887a8e76a3SSteven Rostedt 
2897a8e76a3SSteven Rostedt  free_pages:
2907a8e76a3SSteven Rostedt 	list_for_each_entry_safe(page, tmp, &pages, list) {
2917a8e76a3SSteven Rostedt 		list_del_init(&page->list);
292ed56829cSSteven Rostedt 		free_buffer_page(page);
2937a8e76a3SSteven Rostedt 	}
2947a8e76a3SSteven Rostedt 	return -ENOMEM;
2957a8e76a3SSteven Rostedt }
2967a8e76a3SSteven Rostedt 
2977a8e76a3SSteven Rostedt static struct ring_buffer_per_cpu *
2987a8e76a3SSteven Rostedt rb_allocate_cpu_buffer(struct ring_buffer *buffer, int cpu)
2997a8e76a3SSteven Rostedt {
3007a8e76a3SSteven Rostedt 	struct ring_buffer_per_cpu *cpu_buffer;
301e4c2ce82SSteven Rostedt 	struct buffer_page *page;
302d769041fSSteven Rostedt 	unsigned long addr;
3037a8e76a3SSteven Rostedt 	int ret;
3047a8e76a3SSteven Rostedt 
3057a8e76a3SSteven Rostedt 	cpu_buffer = kzalloc_node(ALIGN(sizeof(*cpu_buffer), cache_line_size()),
3067a8e76a3SSteven Rostedt 				  GFP_KERNEL, cpu_to_node(cpu));
3077a8e76a3SSteven Rostedt 	if (!cpu_buffer)
3087a8e76a3SSteven Rostedt 		return NULL;
3097a8e76a3SSteven Rostedt 
3107a8e76a3SSteven Rostedt 	cpu_buffer->cpu = cpu;
3117a8e76a3SSteven Rostedt 	cpu_buffer->buffer = buffer;
312f83c9d0fSSteven Rostedt 	spin_lock_init(&cpu_buffer->reader_lock);
3133e03fb7fSSteven Rostedt 	cpu_buffer->lock = (raw_spinlock_t)__RAW_SPIN_LOCK_UNLOCKED;
3147a8e76a3SSteven Rostedt 	INIT_LIST_HEAD(&cpu_buffer->pages);
3157a8e76a3SSteven Rostedt 
316e4c2ce82SSteven Rostedt 	page = kzalloc_node(ALIGN(sizeof(*page), cache_line_size()),
317e4c2ce82SSteven Rostedt 			    GFP_KERNEL, cpu_to_node(cpu));
318e4c2ce82SSteven Rostedt 	if (!page)
319e4c2ce82SSteven Rostedt 		goto fail_free_buffer;
320e4c2ce82SSteven Rostedt 
321e4c2ce82SSteven Rostedt 	cpu_buffer->reader_page = page;
322d769041fSSteven Rostedt 	addr = __get_free_page(GFP_KERNEL);
323d769041fSSteven Rostedt 	if (!addr)
324e4c2ce82SSteven Rostedt 		goto fail_free_reader;
325e4c2ce82SSteven Rostedt 	page->page = (void *)addr;
326e4c2ce82SSteven Rostedt 
327d769041fSSteven Rostedt 	INIT_LIST_HEAD(&cpu_buffer->reader_page->list);
328d769041fSSteven Rostedt 
3297a8e76a3SSteven Rostedt 	ret = rb_allocate_pages(cpu_buffer, buffer->pages);
3307a8e76a3SSteven Rostedt 	if (ret < 0)
331d769041fSSteven Rostedt 		goto fail_free_reader;
3327a8e76a3SSteven Rostedt 
3337a8e76a3SSteven Rostedt 	cpu_buffer->head_page
3347a8e76a3SSteven Rostedt 		= list_entry(cpu_buffer->pages.next, struct buffer_page, list);
335bf41a158SSteven Rostedt 	cpu_buffer->tail_page = cpu_buffer->commit_page = cpu_buffer->head_page;
3367a8e76a3SSteven Rostedt 
3377a8e76a3SSteven Rostedt 	return cpu_buffer;
3387a8e76a3SSteven Rostedt 
339d769041fSSteven Rostedt  fail_free_reader:
340d769041fSSteven Rostedt 	free_buffer_page(cpu_buffer->reader_page);
341d769041fSSteven Rostedt 
3427a8e76a3SSteven Rostedt  fail_free_buffer:
3437a8e76a3SSteven Rostedt 	kfree(cpu_buffer);
3447a8e76a3SSteven Rostedt 	return NULL;
3457a8e76a3SSteven Rostedt }
3467a8e76a3SSteven Rostedt 
3477a8e76a3SSteven Rostedt static void rb_free_cpu_buffer(struct ring_buffer_per_cpu *cpu_buffer)
3487a8e76a3SSteven Rostedt {
3497a8e76a3SSteven Rostedt 	struct list_head *head = &cpu_buffer->pages;
3507a8e76a3SSteven Rostedt 	struct buffer_page *page, *tmp;
3517a8e76a3SSteven Rostedt 
352d769041fSSteven Rostedt 	list_del_init(&cpu_buffer->reader_page->list);
353d769041fSSteven Rostedt 	free_buffer_page(cpu_buffer->reader_page);
354d769041fSSteven Rostedt 
3557a8e76a3SSteven Rostedt 	list_for_each_entry_safe(page, tmp, head, list) {
3567a8e76a3SSteven Rostedt 		list_del_init(&page->list);
357ed56829cSSteven Rostedt 		free_buffer_page(page);
3587a8e76a3SSteven Rostedt 	}
3597a8e76a3SSteven Rostedt 	kfree(cpu_buffer);
3607a8e76a3SSteven Rostedt }
3617a8e76a3SSteven Rostedt 
362a7b13743SSteven Rostedt /*
363a7b13743SSteven Rostedt  * Causes compile errors if the struct buffer_page gets bigger
364a7b13743SSteven Rostedt  * than the struct page.
365a7b13743SSteven Rostedt  */
366a7b13743SSteven Rostedt extern int ring_buffer_page_too_big(void);
367a7b13743SSteven Rostedt 
3687a8e76a3SSteven Rostedt /**
3697a8e76a3SSteven Rostedt  * ring_buffer_alloc - allocate a new ring_buffer
3707a8e76a3SSteven Rostedt  * @size: the size in bytes that is needed.
3717a8e76a3SSteven Rostedt  * @flags: attributes to set for the ring buffer.
3727a8e76a3SSteven Rostedt  *
3737a8e76a3SSteven Rostedt  * Currently the only flag that is available is the RB_FL_OVERWRITE
3747a8e76a3SSteven Rostedt  * flag. This flag means that the buffer will overwrite old data
3757a8e76a3SSteven Rostedt  * when the buffer wraps. If this flag is not set, the buffer will
3767a8e76a3SSteven Rostedt  * drop data when the tail hits the head.
3777a8e76a3SSteven Rostedt  */
3787a8e76a3SSteven Rostedt struct ring_buffer *ring_buffer_alloc(unsigned long size, unsigned flags)
3797a8e76a3SSteven Rostedt {
3807a8e76a3SSteven Rostedt 	struct ring_buffer *buffer;
3817a8e76a3SSteven Rostedt 	int bsize;
3827a8e76a3SSteven Rostedt 	int cpu;
3837a8e76a3SSteven Rostedt 
384a7b13743SSteven Rostedt 	/* Paranoid! Optimizes out when all is well */
385a7b13743SSteven Rostedt 	if (sizeof(struct buffer_page) > sizeof(struct page))
386a7b13743SSteven Rostedt 		ring_buffer_page_too_big();
387a7b13743SSteven Rostedt 
388a7b13743SSteven Rostedt 
3897a8e76a3SSteven Rostedt 	/* keep it in its own cache line */
3907a8e76a3SSteven Rostedt 	buffer = kzalloc(ALIGN(sizeof(*buffer), cache_line_size()),
3917a8e76a3SSteven Rostedt 			 GFP_KERNEL);
3927a8e76a3SSteven Rostedt 	if (!buffer)
3937a8e76a3SSteven Rostedt 		return NULL;
3947a8e76a3SSteven Rostedt 
3957a8e76a3SSteven Rostedt 	buffer->pages = DIV_ROUND_UP(size, BUF_PAGE_SIZE);
3967a8e76a3SSteven Rostedt 	buffer->flags = flags;
3977a8e76a3SSteven Rostedt 
3987a8e76a3SSteven Rostedt 	/* need at least two pages */
3997a8e76a3SSteven Rostedt 	if (buffer->pages == 1)
4007a8e76a3SSteven Rostedt 		buffer->pages++;
4017a8e76a3SSteven Rostedt 
4027a8e76a3SSteven Rostedt 	buffer->cpumask = cpu_possible_map;
4037a8e76a3SSteven Rostedt 	buffer->cpus = nr_cpu_ids;
4047a8e76a3SSteven Rostedt 
4057a8e76a3SSteven Rostedt 	bsize = sizeof(void *) * nr_cpu_ids;
4067a8e76a3SSteven Rostedt 	buffer->buffers = kzalloc(ALIGN(bsize, cache_line_size()),
4077a8e76a3SSteven Rostedt 				  GFP_KERNEL);
4087a8e76a3SSteven Rostedt 	if (!buffer->buffers)
4097a8e76a3SSteven Rostedt 		goto fail_free_buffer;
4107a8e76a3SSteven Rostedt 
4117a8e76a3SSteven Rostedt 	for_each_buffer_cpu(buffer, cpu) {
4127a8e76a3SSteven Rostedt 		buffer->buffers[cpu] =
4137a8e76a3SSteven Rostedt 			rb_allocate_cpu_buffer(buffer, cpu);
4147a8e76a3SSteven Rostedt 		if (!buffer->buffers[cpu])
4157a8e76a3SSteven Rostedt 			goto fail_free_buffers;
4167a8e76a3SSteven Rostedt 	}
4177a8e76a3SSteven Rostedt 
4187a8e76a3SSteven Rostedt 	mutex_init(&buffer->mutex);
4197a8e76a3SSteven Rostedt 
4207a8e76a3SSteven Rostedt 	return buffer;
4217a8e76a3SSteven Rostedt 
4227a8e76a3SSteven Rostedt  fail_free_buffers:
4237a8e76a3SSteven Rostedt 	for_each_buffer_cpu(buffer, cpu) {
4247a8e76a3SSteven Rostedt 		if (buffer->buffers[cpu])
4257a8e76a3SSteven Rostedt 			rb_free_cpu_buffer(buffer->buffers[cpu]);
4267a8e76a3SSteven Rostedt 	}
4277a8e76a3SSteven Rostedt 	kfree(buffer->buffers);
4287a8e76a3SSteven Rostedt 
4297a8e76a3SSteven Rostedt  fail_free_buffer:
4307a8e76a3SSteven Rostedt 	kfree(buffer);
4317a8e76a3SSteven Rostedt 	return NULL;
4327a8e76a3SSteven Rostedt }
4337a8e76a3SSteven Rostedt 
4347a8e76a3SSteven Rostedt /**
4357a8e76a3SSteven Rostedt  * ring_buffer_free - free a ring buffer.
4367a8e76a3SSteven Rostedt  * @buffer: the buffer to free.
4377a8e76a3SSteven Rostedt  */
4387a8e76a3SSteven Rostedt void
4397a8e76a3SSteven Rostedt ring_buffer_free(struct ring_buffer *buffer)
4407a8e76a3SSteven Rostedt {
4417a8e76a3SSteven Rostedt 	int cpu;
4427a8e76a3SSteven Rostedt 
4437a8e76a3SSteven Rostedt 	for_each_buffer_cpu(buffer, cpu)
4447a8e76a3SSteven Rostedt 		rb_free_cpu_buffer(buffer->buffers[cpu]);
4457a8e76a3SSteven Rostedt 
4467a8e76a3SSteven Rostedt 	kfree(buffer);
4477a8e76a3SSteven Rostedt }
4487a8e76a3SSteven Rostedt 
4497a8e76a3SSteven Rostedt static void rb_reset_cpu(struct ring_buffer_per_cpu *cpu_buffer);
4507a8e76a3SSteven Rostedt 
4517a8e76a3SSteven Rostedt static void
4527a8e76a3SSteven Rostedt rb_remove_pages(struct ring_buffer_per_cpu *cpu_buffer, unsigned nr_pages)
4537a8e76a3SSteven Rostedt {
4547a8e76a3SSteven Rostedt 	struct buffer_page *page;
4557a8e76a3SSteven Rostedt 	struct list_head *p;
4567a8e76a3SSteven Rostedt 	unsigned i;
4577a8e76a3SSteven Rostedt 
4587a8e76a3SSteven Rostedt 	atomic_inc(&cpu_buffer->record_disabled);
4597a8e76a3SSteven Rostedt 	synchronize_sched();
4607a8e76a3SSteven Rostedt 
4617a8e76a3SSteven Rostedt 	for (i = 0; i < nr_pages; i++) {
462*3e89c7bbSSteven Rostedt 		if (RB_WARN_ON(cpu_buffer, list_empty(&cpu_buffer->pages)))
463*3e89c7bbSSteven Rostedt 			return;
4647a8e76a3SSteven Rostedt 		p = cpu_buffer->pages.next;
4657a8e76a3SSteven Rostedt 		page = list_entry(p, struct buffer_page, list);
4667a8e76a3SSteven Rostedt 		list_del_init(&page->list);
467ed56829cSSteven Rostedt 		free_buffer_page(page);
4687a8e76a3SSteven Rostedt 	}
469*3e89c7bbSSteven Rostedt 	if (RB_WARN_ON(cpu_buffer, list_empty(&cpu_buffer->pages)))
470*3e89c7bbSSteven Rostedt 		return;
4717a8e76a3SSteven Rostedt 
4727a8e76a3SSteven Rostedt 	rb_reset_cpu(cpu_buffer);
4737a8e76a3SSteven Rostedt 
4747a8e76a3SSteven Rostedt 	rb_check_pages(cpu_buffer);
4757a8e76a3SSteven Rostedt 
4767a8e76a3SSteven Rostedt 	atomic_dec(&cpu_buffer->record_disabled);
4777a8e76a3SSteven Rostedt 
4787a8e76a3SSteven Rostedt }
4797a8e76a3SSteven Rostedt 
4807a8e76a3SSteven Rostedt static void
4817a8e76a3SSteven Rostedt rb_insert_pages(struct ring_buffer_per_cpu *cpu_buffer,
4827a8e76a3SSteven Rostedt 		struct list_head *pages, unsigned nr_pages)
4837a8e76a3SSteven Rostedt {
4847a8e76a3SSteven Rostedt 	struct buffer_page *page;
4857a8e76a3SSteven Rostedt 	struct list_head *p;
4867a8e76a3SSteven Rostedt 	unsigned i;
4877a8e76a3SSteven Rostedt 
4887a8e76a3SSteven Rostedt 	atomic_inc(&cpu_buffer->record_disabled);
4897a8e76a3SSteven Rostedt 	synchronize_sched();
4907a8e76a3SSteven Rostedt 
4917a8e76a3SSteven Rostedt 	for (i = 0; i < nr_pages; i++) {
492*3e89c7bbSSteven Rostedt 		if (RB_WARN_ON(cpu_buffer, list_empty(pages)))
493*3e89c7bbSSteven Rostedt 			return;
4947a8e76a3SSteven Rostedt 		p = pages->next;
4957a8e76a3SSteven Rostedt 		page = list_entry(p, struct buffer_page, list);
4967a8e76a3SSteven Rostedt 		list_del_init(&page->list);
4977a8e76a3SSteven Rostedt 		list_add_tail(&page->list, &cpu_buffer->pages);
4987a8e76a3SSteven Rostedt 	}
4997a8e76a3SSteven Rostedt 	rb_reset_cpu(cpu_buffer);
5007a8e76a3SSteven Rostedt 
5017a8e76a3SSteven Rostedt 	rb_check_pages(cpu_buffer);
5027a8e76a3SSteven Rostedt 
5037a8e76a3SSteven Rostedt 	atomic_dec(&cpu_buffer->record_disabled);
5047a8e76a3SSteven Rostedt }
5057a8e76a3SSteven Rostedt 
5067a8e76a3SSteven Rostedt /**
5077a8e76a3SSteven Rostedt  * ring_buffer_resize - resize the ring buffer
5087a8e76a3SSteven Rostedt  * @buffer: the buffer to resize.
5097a8e76a3SSteven Rostedt  * @size: the new size.
5107a8e76a3SSteven Rostedt  *
5117a8e76a3SSteven Rostedt  * The tracer is responsible for making sure that the buffer is
5127a8e76a3SSteven Rostedt  * not being used while changing the size.
5137a8e76a3SSteven Rostedt  * Note: We may be able to change the above requirement by using
5147a8e76a3SSteven Rostedt  *  RCU synchronizations.
5157a8e76a3SSteven Rostedt  *
5167a8e76a3SSteven Rostedt  * Minimum size is 2 * BUF_PAGE_SIZE.
5177a8e76a3SSteven Rostedt  *
5187a8e76a3SSteven Rostedt  * Returns -1 on failure.
5197a8e76a3SSteven Rostedt  */
5207a8e76a3SSteven Rostedt int ring_buffer_resize(struct ring_buffer *buffer, unsigned long size)
5217a8e76a3SSteven Rostedt {
5227a8e76a3SSteven Rostedt 	struct ring_buffer_per_cpu *cpu_buffer;
5237a8e76a3SSteven Rostedt 	unsigned nr_pages, rm_pages, new_pages;
5247a8e76a3SSteven Rostedt 	struct buffer_page *page, *tmp;
5257a8e76a3SSteven Rostedt 	unsigned long buffer_size;
5267a8e76a3SSteven Rostedt 	unsigned long addr;
5277a8e76a3SSteven Rostedt 	LIST_HEAD(pages);
5287a8e76a3SSteven Rostedt 	int i, cpu;
5297a8e76a3SSteven Rostedt 
5307a8e76a3SSteven Rostedt 	size = DIV_ROUND_UP(size, BUF_PAGE_SIZE);
5317a8e76a3SSteven Rostedt 	size *= BUF_PAGE_SIZE;
5327a8e76a3SSteven Rostedt 	buffer_size = buffer->pages * BUF_PAGE_SIZE;
5337a8e76a3SSteven Rostedt 
5347a8e76a3SSteven Rostedt 	/* we need a minimum of two pages */
5357a8e76a3SSteven Rostedt 	if (size < BUF_PAGE_SIZE * 2)
5367a8e76a3SSteven Rostedt 		size = BUF_PAGE_SIZE * 2;
5377a8e76a3SSteven Rostedt 
5387a8e76a3SSteven Rostedt 	if (size == buffer_size)
5397a8e76a3SSteven Rostedt 		return size;
5407a8e76a3SSteven Rostedt 
5417a8e76a3SSteven Rostedt 	mutex_lock(&buffer->mutex);
5427a8e76a3SSteven Rostedt 
5437a8e76a3SSteven Rostedt 	nr_pages = DIV_ROUND_UP(size, BUF_PAGE_SIZE);
5447a8e76a3SSteven Rostedt 
5457a8e76a3SSteven Rostedt 	if (size < buffer_size) {
5467a8e76a3SSteven Rostedt 
5477a8e76a3SSteven Rostedt 		/* easy case, just free pages */
548*3e89c7bbSSteven Rostedt 		if (RB_WARN_ON(buffer, nr_pages >= buffer->pages)) {
549*3e89c7bbSSteven Rostedt 			mutex_unlock(&buffer->mutex);
550*3e89c7bbSSteven Rostedt 			return -1;
551*3e89c7bbSSteven Rostedt 		}
5527a8e76a3SSteven Rostedt 
5537a8e76a3SSteven Rostedt 		rm_pages = buffer->pages - nr_pages;
5547a8e76a3SSteven Rostedt 
5557a8e76a3SSteven Rostedt 		for_each_buffer_cpu(buffer, cpu) {
5567a8e76a3SSteven Rostedt 			cpu_buffer = buffer->buffers[cpu];
5577a8e76a3SSteven Rostedt 			rb_remove_pages(cpu_buffer, rm_pages);
5587a8e76a3SSteven Rostedt 		}
5597a8e76a3SSteven Rostedt 		goto out;
5607a8e76a3SSteven Rostedt 	}
5617a8e76a3SSteven Rostedt 
5627a8e76a3SSteven Rostedt 	/*
5637a8e76a3SSteven Rostedt 	 * This is a bit more difficult. We only want to add pages
5647a8e76a3SSteven Rostedt 	 * when we can allocate enough for all CPUs. We do this
5657a8e76a3SSteven Rostedt 	 * by allocating all the pages and storing them on a local
5667a8e76a3SSteven Rostedt 	 * link list. If we succeed in our allocation, then we
5677a8e76a3SSteven Rostedt 	 * add these pages to the cpu_buffers. Otherwise we just free
5687a8e76a3SSteven Rostedt 	 * them all and return -ENOMEM;
5697a8e76a3SSteven Rostedt 	 */
570*3e89c7bbSSteven Rostedt 	if (RB_WARN_ON(buffer, nr_pages <= buffer->pages)) {
571*3e89c7bbSSteven Rostedt 		mutex_unlock(&buffer->mutex);
572*3e89c7bbSSteven Rostedt 		return -1;
573*3e89c7bbSSteven Rostedt 	}
574f536aafcSSteven Rostedt 
5757a8e76a3SSteven Rostedt 	new_pages = nr_pages - buffer->pages;
5767a8e76a3SSteven Rostedt 
5777a8e76a3SSteven Rostedt 	for_each_buffer_cpu(buffer, cpu) {
5787a8e76a3SSteven Rostedt 		for (i = 0; i < new_pages; i++) {
579e4c2ce82SSteven Rostedt 			page = kzalloc_node(ALIGN(sizeof(*page),
580e4c2ce82SSteven Rostedt 						  cache_line_size()),
581e4c2ce82SSteven Rostedt 					    GFP_KERNEL, cpu_to_node(cpu));
582e4c2ce82SSteven Rostedt 			if (!page)
583e4c2ce82SSteven Rostedt 				goto free_pages;
584e4c2ce82SSteven Rostedt 			list_add(&page->list, &pages);
5857a8e76a3SSteven Rostedt 			addr = __get_free_page(GFP_KERNEL);
5867a8e76a3SSteven Rostedt 			if (!addr)
5877a8e76a3SSteven Rostedt 				goto free_pages;
588e4c2ce82SSteven Rostedt 			page->page = (void *)addr;
5897a8e76a3SSteven Rostedt 		}
5907a8e76a3SSteven Rostedt 	}
5917a8e76a3SSteven Rostedt 
5927a8e76a3SSteven Rostedt 	for_each_buffer_cpu(buffer, cpu) {
5937a8e76a3SSteven Rostedt 		cpu_buffer = buffer->buffers[cpu];
5947a8e76a3SSteven Rostedt 		rb_insert_pages(cpu_buffer, &pages, new_pages);
5957a8e76a3SSteven Rostedt 	}
5967a8e76a3SSteven Rostedt 
597*3e89c7bbSSteven Rostedt 	if (RB_WARN_ON(buffer, !list_empty(&pages))) {
598*3e89c7bbSSteven Rostedt 		mutex_unlock(&buffer->mutex);
599*3e89c7bbSSteven Rostedt 		return -1;
600*3e89c7bbSSteven Rostedt 	}
6017a8e76a3SSteven Rostedt 
6027a8e76a3SSteven Rostedt  out:
6037a8e76a3SSteven Rostedt 	buffer->pages = nr_pages;
6047a8e76a3SSteven Rostedt 	mutex_unlock(&buffer->mutex);
6057a8e76a3SSteven Rostedt 
6067a8e76a3SSteven Rostedt 	return size;
6077a8e76a3SSteven Rostedt 
6087a8e76a3SSteven Rostedt  free_pages:
6097a8e76a3SSteven Rostedt 	list_for_each_entry_safe(page, tmp, &pages, list) {
6107a8e76a3SSteven Rostedt 		list_del_init(&page->list);
611ed56829cSSteven Rostedt 		free_buffer_page(page);
6127a8e76a3SSteven Rostedt 	}
6137a8e76a3SSteven Rostedt 	return -ENOMEM;
6147a8e76a3SSteven Rostedt }
6157a8e76a3SSteven Rostedt 
6167a8e76a3SSteven Rostedt static inline int rb_null_event(struct ring_buffer_event *event)
6177a8e76a3SSteven Rostedt {
6187a8e76a3SSteven Rostedt 	return event->type == RINGBUF_TYPE_PADDING;
6197a8e76a3SSteven Rostedt }
6207a8e76a3SSteven Rostedt 
6216f807acdSSteven Rostedt static inline void *__rb_page_index(struct buffer_page *page, unsigned index)
6227a8e76a3SSteven Rostedt {
623e4c2ce82SSteven Rostedt 	return page->page + index;
6247a8e76a3SSteven Rostedt }
6257a8e76a3SSteven Rostedt 
6267a8e76a3SSteven Rostedt static inline struct ring_buffer_event *
627d769041fSSteven Rostedt rb_reader_event(struct ring_buffer_per_cpu *cpu_buffer)
6287a8e76a3SSteven Rostedt {
6296f807acdSSteven Rostedt 	return __rb_page_index(cpu_buffer->reader_page,
6306f807acdSSteven Rostedt 			       cpu_buffer->reader_page->read);
6316f807acdSSteven Rostedt }
6326f807acdSSteven Rostedt 
6336f807acdSSteven Rostedt static inline struct ring_buffer_event *
6346f807acdSSteven Rostedt rb_head_event(struct ring_buffer_per_cpu *cpu_buffer)
6356f807acdSSteven Rostedt {
6366f807acdSSteven Rostedt 	return __rb_page_index(cpu_buffer->head_page,
6376f807acdSSteven Rostedt 			       cpu_buffer->head_page->read);
6387a8e76a3SSteven Rostedt }
6397a8e76a3SSteven Rostedt 
6407a8e76a3SSteven Rostedt static inline struct ring_buffer_event *
6417a8e76a3SSteven Rostedt rb_iter_head_event(struct ring_buffer_iter *iter)
6427a8e76a3SSteven Rostedt {
6436f807acdSSteven Rostedt 	return __rb_page_index(iter->head_page, iter->head);
6447a8e76a3SSteven Rostedt }
6457a8e76a3SSteven Rostedt 
646bf41a158SSteven Rostedt static inline unsigned rb_page_write(struct buffer_page *bpage)
647bf41a158SSteven Rostedt {
648bf41a158SSteven Rostedt 	return local_read(&bpage->write);
649bf41a158SSteven Rostedt }
650bf41a158SSteven Rostedt 
651bf41a158SSteven Rostedt static inline unsigned rb_page_commit(struct buffer_page *bpage)
652bf41a158SSteven Rostedt {
653bf41a158SSteven Rostedt 	return local_read(&bpage->commit);
654bf41a158SSteven Rostedt }
655bf41a158SSteven Rostedt 
656bf41a158SSteven Rostedt /* Size is determined by what has been commited */
657bf41a158SSteven Rostedt static inline unsigned rb_page_size(struct buffer_page *bpage)
658bf41a158SSteven Rostedt {
659bf41a158SSteven Rostedt 	return rb_page_commit(bpage);
660bf41a158SSteven Rostedt }
661bf41a158SSteven Rostedt 
662bf41a158SSteven Rostedt static inline unsigned
663bf41a158SSteven Rostedt rb_commit_index(struct ring_buffer_per_cpu *cpu_buffer)
664bf41a158SSteven Rostedt {
665bf41a158SSteven Rostedt 	return rb_page_commit(cpu_buffer->commit_page);
666bf41a158SSteven Rostedt }
667bf41a158SSteven Rostedt 
668bf41a158SSteven Rostedt static inline unsigned rb_head_size(struct ring_buffer_per_cpu *cpu_buffer)
669bf41a158SSteven Rostedt {
670bf41a158SSteven Rostedt 	return rb_page_commit(cpu_buffer->head_page);
671bf41a158SSteven Rostedt }
672bf41a158SSteven Rostedt 
6737a8e76a3SSteven Rostedt /*
6747a8e76a3SSteven Rostedt  * When the tail hits the head and the buffer is in overwrite mode,
6757a8e76a3SSteven Rostedt  * the head jumps to the next page and all content on the previous
6767a8e76a3SSteven Rostedt  * page is discarded. But before doing so, we update the overrun
6777a8e76a3SSteven Rostedt  * variable of the buffer.
6787a8e76a3SSteven Rostedt  */
6797a8e76a3SSteven Rostedt static void rb_update_overflow(struct ring_buffer_per_cpu *cpu_buffer)
6807a8e76a3SSteven Rostedt {
6817a8e76a3SSteven Rostedt 	struct ring_buffer_event *event;
6827a8e76a3SSteven Rostedt 	unsigned long head;
6837a8e76a3SSteven Rostedt 
6847a8e76a3SSteven Rostedt 	for (head = 0; head < rb_head_size(cpu_buffer);
6857a8e76a3SSteven Rostedt 	     head += rb_event_length(event)) {
6867a8e76a3SSteven Rostedt 
6876f807acdSSteven Rostedt 		event = __rb_page_index(cpu_buffer->head_page, head);
688*3e89c7bbSSteven Rostedt 		if (RB_WARN_ON(cpu_buffer, rb_null_event(event)))
689*3e89c7bbSSteven Rostedt 			return;
6907a8e76a3SSteven Rostedt 		/* Only count data entries */
6917a8e76a3SSteven Rostedt 		if (event->type != RINGBUF_TYPE_DATA)
6927a8e76a3SSteven Rostedt 			continue;
6937a8e76a3SSteven Rostedt 		cpu_buffer->overrun++;
6947a8e76a3SSteven Rostedt 		cpu_buffer->entries--;
6957a8e76a3SSteven Rostedt 	}
6967a8e76a3SSteven Rostedt }
6977a8e76a3SSteven Rostedt 
6987a8e76a3SSteven Rostedt static inline void rb_inc_page(struct ring_buffer_per_cpu *cpu_buffer,
6997a8e76a3SSteven Rostedt 			       struct buffer_page **page)
7007a8e76a3SSteven Rostedt {
7017a8e76a3SSteven Rostedt 	struct list_head *p = (*page)->list.next;
7027a8e76a3SSteven Rostedt 
7037a8e76a3SSteven Rostedt 	if (p == &cpu_buffer->pages)
7047a8e76a3SSteven Rostedt 		p = p->next;
7057a8e76a3SSteven Rostedt 
7067a8e76a3SSteven Rostedt 	*page = list_entry(p, struct buffer_page, list);
7077a8e76a3SSteven Rostedt }
7087a8e76a3SSteven Rostedt 
709bf41a158SSteven Rostedt static inline unsigned
710bf41a158SSteven Rostedt rb_event_index(struct ring_buffer_event *event)
7117a8e76a3SSteven Rostedt {
712bf41a158SSteven Rostedt 	unsigned long addr = (unsigned long)event;
713bf41a158SSteven Rostedt 
714bf41a158SSteven Rostedt 	return (addr & ~PAGE_MASK) - (PAGE_SIZE - BUF_PAGE_SIZE);
7157a8e76a3SSteven Rostedt }
7167a8e76a3SSteven Rostedt 
717bf41a158SSteven Rostedt static inline int
718bf41a158SSteven Rostedt rb_is_commit(struct ring_buffer_per_cpu *cpu_buffer,
719bf41a158SSteven Rostedt 	     struct ring_buffer_event *event)
7207a8e76a3SSteven Rostedt {
721bf41a158SSteven Rostedt 	unsigned long addr = (unsigned long)event;
722bf41a158SSteven Rostedt 	unsigned long index;
723bf41a158SSteven Rostedt 
724bf41a158SSteven Rostedt 	index = rb_event_index(event);
725bf41a158SSteven Rostedt 	addr &= PAGE_MASK;
726bf41a158SSteven Rostedt 
727bf41a158SSteven Rostedt 	return cpu_buffer->commit_page->page == (void *)addr &&
728bf41a158SSteven Rostedt 		rb_commit_index(cpu_buffer) == index;
729bf41a158SSteven Rostedt }
730bf41a158SSteven Rostedt 
731bf41a158SSteven Rostedt static inline void
732bf41a158SSteven Rostedt rb_set_commit_event(struct ring_buffer_per_cpu *cpu_buffer,
733bf41a158SSteven Rostedt 		    struct ring_buffer_event *event)
734bf41a158SSteven Rostedt {
735bf41a158SSteven Rostedt 	unsigned long addr = (unsigned long)event;
736bf41a158SSteven Rostedt 	unsigned long index;
737bf41a158SSteven Rostedt 
738bf41a158SSteven Rostedt 	index = rb_event_index(event);
739bf41a158SSteven Rostedt 	addr &= PAGE_MASK;
740bf41a158SSteven Rostedt 
741bf41a158SSteven Rostedt 	while (cpu_buffer->commit_page->page != (void *)addr) {
742*3e89c7bbSSteven Rostedt 		if (RB_WARN_ON(cpu_buffer,
743*3e89c7bbSSteven Rostedt 			  cpu_buffer->commit_page == cpu_buffer->tail_page))
744*3e89c7bbSSteven Rostedt 			return;
745bf41a158SSteven Rostedt 		cpu_buffer->commit_page->commit =
746bf41a158SSteven Rostedt 			cpu_buffer->commit_page->write;
747bf41a158SSteven Rostedt 		rb_inc_page(cpu_buffer, &cpu_buffer->commit_page);
748bf41a158SSteven Rostedt 		cpu_buffer->write_stamp = cpu_buffer->commit_page->time_stamp;
749bf41a158SSteven Rostedt 	}
750bf41a158SSteven Rostedt 
751bf41a158SSteven Rostedt 	/* Now set the commit to the event's index */
752bf41a158SSteven Rostedt 	local_set(&cpu_buffer->commit_page->commit, index);
753bf41a158SSteven Rostedt }
754bf41a158SSteven Rostedt 
755bf41a158SSteven Rostedt static inline void
756bf41a158SSteven Rostedt rb_set_commit_to_write(struct ring_buffer_per_cpu *cpu_buffer)
757bf41a158SSteven Rostedt {
758bf41a158SSteven Rostedt 	/*
759bf41a158SSteven Rostedt 	 * We only race with interrupts and NMIs on this CPU.
760bf41a158SSteven Rostedt 	 * If we own the commit event, then we can commit
761bf41a158SSteven Rostedt 	 * all others that interrupted us, since the interruptions
762bf41a158SSteven Rostedt 	 * are in stack format (they finish before they come
763bf41a158SSteven Rostedt 	 * back to us). This allows us to do a simple loop to
764bf41a158SSteven Rostedt 	 * assign the commit to the tail.
765bf41a158SSteven Rostedt 	 */
766bf41a158SSteven Rostedt 	while (cpu_buffer->commit_page != cpu_buffer->tail_page) {
767bf41a158SSteven Rostedt 		cpu_buffer->commit_page->commit =
768bf41a158SSteven Rostedt 			cpu_buffer->commit_page->write;
769bf41a158SSteven Rostedt 		rb_inc_page(cpu_buffer, &cpu_buffer->commit_page);
770bf41a158SSteven Rostedt 		cpu_buffer->write_stamp = cpu_buffer->commit_page->time_stamp;
771bf41a158SSteven Rostedt 		/* add barrier to keep gcc from optimizing too much */
772bf41a158SSteven Rostedt 		barrier();
773bf41a158SSteven Rostedt 	}
774bf41a158SSteven Rostedt 	while (rb_commit_index(cpu_buffer) !=
775bf41a158SSteven Rostedt 	       rb_page_write(cpu_buffer->commit_page)) {
776bf41a158SSteven Rostedt 		cpu_buffer->commit_page->commit =
777bf41a158SSteven Rostedt 			cpu_buffer->commit_page->write;
778bf41a158SSteven Rostedt 		barrier();
779bf41a158SSteven Rostedt 	}
7807a8e76a3SSteven Rostedt }
7817a8e76a3SSteven Rostedt 
782d769041fSSteven Rostedt static void rb_reset_reader_page(struct ring_buffer_per_cpu *cpu_buffer)
7837a8e76a3SSteven Rostedt {
784d769041fSSteven Rostedt 	cpu_buffer->read_stamp = cpu_buffer->reader_page->time_stamp;
7856f807acdSSteven Rostedt 	cpu_buffer->reader_page->read = 0;
786d769041fSSteven Rostedt }
787d769041fSSteven Rostedt 
788d769041fSSteven Rostedt static inline void rb_inc_iter(struct ring_buffer_iter *iter)
789d769041fSSteven Rostedt {
790d769041fSSteven Rostedt 	struct ring_buffer_per_cpu *cpu_buffer = iter->cpu_buffer;
791d769041fSSteven Rostedt 
792d769041fSSteven Rostedt 	/*
793d769041fSSteven Rostedt 	 * The iterator could be on the reader page (it starts there).
794d769041fSSteven Rostedt 	 * But the head could have moved, since the reader was
795d769041fSSteven Rostedt 	 * found. Check for this case and assign the iterator
796d769041fSSteven Rostedt 	 * to the head page instead of next.
797d769041fSSteven Rostedt 	 */
798d769041fSSteven Rostedt 	if (iter->head_page == cpu_buffer->reader_page)
799d769041fSSteven Rostedt 		iter->head_page = cpu_buffer->head_page;
800d769041fSSteven Rostedt 	else
801d769041fSSteven Rostedt 		rb_inc_page(cpu_buffer, &iter->head_page);
802d769041fSSteven Rostedt 
8037a8e76a3SSteven Rostedt 	iter->read_stamp = iter->head_page->time_stamp;
8047a8e76a3SSteven Rostedt 	iter->head = 0;
8057a8e76a3SSteven Rostedt }
8067a8e76a3SSteven Rostedt 
8077a8e76a3SSteven Rostedt /**
8087a8e76a3SSteven Rostedt  * ring_buffer_update_event - update event type and data
8097a8e76a3SSteven Rostedt  * @event: the even to update
8107a8e76a3SSteven Rostedt  * @type: the type of event
8117a8e76a3SSteven Rostedt  * @length: the size of the event field in the ring buffer
8127a8e76a3SSteven Rostedt  *
8137a8e76a3SSteven Rostedt  * Update the type and data fields of the event. The length
8147a8e76a3SSteven Rostedt  * is the actual size that is written to the ring buffer,
8157a8e76a3SSteven Rostedt  * and with this, we can determine what to place into the
8167a8e76a3SSteven Rostedt  * data field.
8177a8e76a3SSteven Rostedt  */
8187a8e76a3SSteven Rostedt static inline void
8197a8e76a3SSteven Rostedt rb_update_event(struct ring_buffer_event *event,
8207a8e76a3SSteven Rostedt 			 unsigned type, unsigned length)
8217a8e76a3SSteven Rostedt {
8227a8e76a3SSteven Rostedt 	event->type = type;
8237a8e76a3SSteven Rostedt 
8247a8e76a3SSteven Rostedt 	switch (type) {
8257a8e76a3SSteven Rostedt 
8267a8e76a3SSteven Rostedt 	case RINGBUF_TYPE_PADDING:
8277a8e76a3SSteven Rostedt 		break;
8287a8e76a3SSteven Rostedt 
8297a8e76a3SSteven Rostedt 	case RINGBUF_TYPE_TIME_EXTEND:
8307a8e76a3SSteven Rostedt 		event->len =
8317a8e76a3SSteven Rostedt 			(RB_LEN_TIME_EXTEND + (RB_ALIGNMENT-1))
8327a8e76a3SSteven Rostedt 			>> RB_ALIGNMENT_SHIFT;
8337a8e76a3SSteven Rostedt 		break;
8347a8e76a3SSteven Rostedt 
8357a8e76a3SSteven Rostedt 	case RINGBUF_TYPE_TIME_STAMP:
8367a8e76a3SSteven Rostedt 		event->len =
8377a8e76a3SSteven Rostedt 			(RB_LEN_TIME_STAMP + (RB_ALIGNMENT-1))
8387a8e76a3SSteven Rostedt 			>> RB_ALIGNMENT_SHIFT;
8397a8e76a3SSteven Rostedt 		break;
8407a8e76a3SSteven Rostedt 
8417a8e76a3SSteven Rostedt 	case RINGBUF_TYPE_DATA:
8427a8e76a3SSteven Rostedt 		length -= RB_EVNT_HDR_SIZE;
8437a8e76a3SSteven Rostedt 		if (length > RB_MAX_SMALL_DATA) {
8447a8e76a3SSteven Rostedt 			event->len = 0;
8457a8e76a3SSteven Rostedt 			event->array[0] = length;
8467a8e76a3SSteven Rostedt 		} else
8477a8e76a3SSteven Rostedt 			event->len =
8487a8e76a3SSteven Rostedt 				(length + (RB_ALIGNMENT-1))
8497a8e76a3SSteven Rostedt 				>> RB_ALIGNMENT_SHIFT;
8507a8e76a3SSteven Rostedt 		break;
8517a8e76a3SSteven Rostedt 	default:
8527a8e76a3SSteven Rostedt 		BUG();
8537a8e76a3SSteven Rostedt 	}
8547a8e76a3SSteven Rostedt }
8557a8e76a3SSteven Rostedt 
8567a8e76a3SSteven Rostedt static inline unsigned rb_calculate_event_length(unsigned length)
8577a8e76a3SSteven Rostedt {
8587a8e76a3SSteven Rostedt 	struct ring_buffer_event event; /* Used only for sizeof array */
8597a8e76a3SSteven Rostedt 
8607a8e76a3SSteven Rostedt 	/* zero length can cause confusions */
8617a8e76a3SSteven Rostedt 	if (!length)
8627a8e76a3SSteven Rostedt 		length = 1;
8637a8e76a3SSteven Rostedt 
8647a8e76a3SSteven Rostedt 	if (length > RB_MAX_SMALL_DATA)
8657a8e76a3SSteven Rostedt 		length += sizeof(event.array[0]);
8667a8e76a3SSteven Rostedt 
8677a8e76a3SSteven Rostedt 	length += RB_EVNT_HDR_SIZE;
8687a8e76a3SSteven Rostedt 	length = ALIGN(length, RB_ALIGNMENT);
8697a8e76a3SSteven Rostedt 
8707a8e76a3SSteven Rostedt 	return length;
8717a8e76a3SSteven Rostedt }
8727a8e76a3SSteven Rostedt 
8737a8e76a3SSteven Rostedt static struct ring_buffer_event *
8747a8e76a3SSteven Rostedt __rb_reserve_next(struct ring_buffer_per_cpu *cpu_buffer,
8757a8e76a3SSteven Rostedt 		  unsigned type, unsigned long length, u64 *ts)
8767a8e76a3SSteven Rostedt {
877d769041fSSteven Rostedt 	struct buffer_page *tail_page, *head_page, *reader_page;
878bf41a158SSteven Rostedt 	unsigned long tail, write;
8797a8e76a3SSteven Rostedt 	struct ring_buffer *buffer = cpu_buffer->buffer;
8807a8e76a3SSteven Rostedt 	struct ring_buffer_event *event;
881bf41a158SSteven Rostedt 	unsigned long flags;
8827a8e76a3SSteven Rostedt 
8837a8e76a3SSteven Rostedt 	tail_page = cpu_buffer->tail_page;
884bf41a158SSteven Rostedt 	write = local_add_return(length, &tail_page->write);
885bf41a158SSteven Rostedt 	tail = write - length;
8867a8e76a3SSteven Rostedt 
887bf41a158SSteven Rostedt 	/* See if we shot pass the end of this buffer page */
888bf41a158SSteven Rostedt 	if (write > BUF_PAGE_SIZE) {
8897a8e76a3SSteven Rostedt 		struct buffer_page *next_page = tail_page;
8907a8e76a3SSteven Rostedt 
8913e03fb7fSSteven Rostedt 		local_irq_save(flags);
8923e03fb7fSSteven Rostedt 		__raw_spin_lock(&cpu_buffer->lock);
893bf41a158SSteven Rostedt 
8947a8e76a3SSteven Rostedt 		rb_inc_page(cpu_buffer, &next_page);
8957a8e76a3SSteven Rostedt 
896d769041fSSteven Rostedt 		head_page = cpu_buffer->head_page;
897d769041fSSteven Rostedt 		reader_page = cpu_buffer->reader_page;
898d769041fSSteven Rostedt 
899d769041fSSteven Rostedt 		/* we grabbed the lock before incrementing */
900*3e89c7bbSSteven Rostedt 		if (RB_WARN_ON(cpu_buffer, next_page == reader_page))
901*3e89c7bbSSteven Rostedt 			goto out_unlock;
902bf41a158SSteven Rostedt 
903bf41a158SSteven Rostedt 		/*
904bf41a158SSteven Rostedt 		 * If for some reason, we had an interrupt storm that made
905bf41a158SSteven Rostedt 		 * it all the way around the buffer, bail, and warn
906bf41a158SSteven Rostedt 		 * about it.
907bf41a158SSteven Rostedt 		 */
908bf41a158SSteven Rostedt 		if (unlikely(next_page == cpu_buffer->commit_page)) {
909bf41a158SSteven Rostedt 			WARN_ON_ONCE(1);
910bf41a158SSteven Rostedt 			goto out_unlock;
911bf41a158SSteven Rostedt 		}
912d769041fSSteven Rostedt 
9137a8e76a3SSteven Rostedt 		if (next_page == head_page) {
914d769041fSSteven Rostedt 			if (!(buffer->flags & RB_FL_OVERWRITE)) {
915bf41a158SSteven Rostedt 				/* reset write */
916bf41a158SSteven Rostedt 				if (tail <= BUF_PAGE_SIZE)
917bf41a158SSteven Rostedt 					local_set(&tail_page->write, tail);
918bf41a158SSteven Rostedt 				goto out_unlock;
919d769041fSSteven Rostedt 			}
9207a8e76a3SSteven Rostedt 
921bf41a158SSteven Rostedt 			/* tail_page has not moved yet? */
922bf41a158SSteven Rostedt 			if (tail_page == cpu_buffer->tail_page) {
9237a8e76a3SSteven Rostedt 				/* count overflows */
9247a8e76a3SSteven Rostedt 				rb_update_overflow(cpu_buffer);
9257a8e76a3SSteven Rostedt 
9267a8e76a3SSteven Rostedt 				rb_inc_page(cpu_buffer, &head_page);
9277a8e76a3SSteven Rostedt 				cpu_buffer->head_page = head_page;
928bf41a158SSteven Rostedt 				cpu_buffer->head_page->read = 0;
929bf41a158SSteven Rostedt 			}
9307a8e76a3SSteven Rostedt 		}
9317a8e76a3SSteven Rostedt 
932bf41a158SSteven Rostedt 		/*
933bf41a158SSteven Rostedt 		 * If the tail page is still the same as what we think
934bf41a158SSteven Rostedt 		 * it is, then it is up to us to update the tail
935bf41a158SSteven Rostedt 		 * pointer.
936bf41a158SSteven Rostedt 		 */
937bf41a158SSteven Rostedt 		if (tail_page == cpu_buffer->tail_page) {
938bf41a158SSteven Rostedt 			local_set(&next_page->write, 0);
939bf41a158SSteven Rostedt 			local_set(&next_page->commit, 0);
940bf41a158SSteven Rostedt 			cpu_buffer->tail_page = next_page;
941bf41a158SSteven Rostedt 
942bf41a158SSteven Rostedt 			/* reread the time stamp */
943bf41a158SSteven Rostedt 			*ts = ring_buffer_time_stamp(cpu_buffer->cpu);
944bf41a158SSteven Rostedt 			cpu_buffer->tail_page->time_stamp = *ts;
945bf41a158SSteven Rostedt 		}
946bf41a158SSteven Rostedt 
947bf41a158SSteven Rostedt 		/*
948bf41a158SSteven Rostedt 		 * The actual tail page has moved forward.
949bf41a158SSteven Rostedt 		 */
950bf41a158SSteven Rostedt 		if (tail < BUF_PAGE_SIZE) {
951bf41a158SSteven Rostedt 			/* Mark the rest of the page with padding */
9526f807acdSSteven Rostedt 			event = __rb_page_index(tail_page, tail);
9537a8e76a3SSteven Rostedt 			event->type = RINGBUF_TYPE_PADDING;
9547a8e76a3SSteven Rostedt 		}
9557a8e76a3SSteven Rostedt 
956bf41a158SSteven Rostedt 		if (tail <= BUF_PAGE_SIZE)
957bf41a158SSteven Rostedt 			/* Set the write back to the previous setting */
958bf41a158SSteven Rostedt 			local_set(&tail_page->write, tail);
959bf41a158SSteven Rostedt 
960bf41a158SSteven Rostedt 		/*
961bf41a158SSteven Rostedt 		 * If this was a commit entry that failed,
962bf41a158SSteven Rostedt 		 * increment that too
963bf41a158SSteven Rostedt 		 */
964bf41a158SSteven Rostedt 		if (tail_page == cpu_buffer->commit_page &&
965bf41a158SSteven Rostedt 		    tail == rb_commit_index(cpu_buffer)) {
966bf41a158SSteven Rostedt 			rb_set_commit_to_write(cpu_buffer);
9677a8e76a3SSteven Rostedt 		}
9687a8e76a3SSteven Rostedt 
9693e03fb7fSSteven Rostedt 		__raw_spin_unlock(&cpu_buffer->lock);
9703e03fb7fSSteven Rostedt 		local_irq_restore(flags);
971bf41a158SSteven Rostedt 
972bf41a158SSteven Rostedt 		/* fail and let the caller try again */
973bf41a158SSteven Rostedt 		return ERR_PTR(-EAGAIN);
974bf41a158SSteven Rostedt 	}
975bf41a158SSteven Rostedt 
976bf41a158SSteven Rostedt 	/* We reserved something on the buffer */
977bf41a158SSteven Rostedt 
978*3e89c7bbSSteven Rostedt 	if (RB_WARN_ON(cpu_buffer, write > BUF_PAGE_SIZE))
979*3e89c7bbSSteven Rostedt 		return NULL;
9807a8e76a3SSteven Rostedt 
9816f807acdSSteven Rostedt 	event = __rb_page_index(tail_page, tail);
9827a8e76a3SSteven Rostedt 	rb_update_event(event, type, length);
9837a8e76a3SSteven Rostedt 
984bf41a158SSteven Rostedt 	/*
985bf41a158SSteven Rostedt 	 * If this is a commit and the tail is zero, then update
986bf41a158SSteven Rostedt 	 * this page's time stamp.
987bf41a158SSteven Rostedt 	 */
988bf41a158SSteven Rostedt 	if (!tail && rb_is_commit(cpu_buffer, event))
989bf41a158SSteven Rostedt 		cpu_buffer->commit_page->time_stamp = *ts;
990bf41a158SSteven Rostedt 
9917a8e76a3SSteven Rostedt 	return event;
992bf41a158SSteven Rostedt 
993bf41a158SSteven Rostedt  out_unlock:
9943e03fb7fSSteven Rostedt 	__raw_spin_unlock(&cpu_buffer->lock);
9953e03fb7fSSteven Rostedt 	local_irq_restore(flags);
996bf41a158SSteven Rostedt 	return NULL;
9977a8e76a3SSteven Rostedt }
9987a8e76a3SSteven Rostedt 
9997a8e76a3SSteven Rostedt static int
10007a8e76a3SSteven Rostedt rb_add_time_stamp(struct ring_buffer_per_cpu *cpu_buffer,
10017a8e76a3SSteven Rostedt 		  u64 *ts, u64 *delta)
10027a8e76a3SSteven Rostedt {
10037a8e76a3SSteven Rostedt 	struct ring_buffer_event *event;
10047a8e76a3SSteven Rostedt 	static int once;
1005bf41a158SSteven Rostedt 	int ret;
10067a8e76a3SSteven Rostedt 
10077a8e76a3SSteven Rostedt 	if (unlikely(*delta > (1ULL << 59) && !once++)) {
10087a8e76a3SSteven Rostedt 		printk(KERN_WARNING "Delta way too big! %llu"
10097a8e76a3SSteven Rostedt 		       " ts=%llu write stamp = %llu\n",
1010e2862c94SStephen Rothwell 		       (unsigned long long)*delta,
1011e2862c94SStephen Rothwell 		       (unsigned long long)*ts,
1012e2862c94SStephen Rothwell 		       (unsigned long long)cpu_buffer->write_stamp);
10137a8e76a3SSteven Rostedt 		WARN_ON(1);
10147a8e76a3SSteven Rostedt 	}
10157a8e76a3SSteven Rostedt 
10167a8e76a3SSteven Rostedt 	/*
10177a8e76a3SSteven Rostedt 	 * The delta is too big, we to add a
10187a8e76a3SSteven Rostedt 	 * new timestamp.
10197a8e76a3SSteven Rostedt 	 */
10207a8e76a3SSteven Rostedt 	event = __rb_reserve_next(cpu_buffer,
10217a8e76a3SSteven Rostedt 				  RINGBUF_TYPE_TIME_EXTEND,
10227a8e76a3SSteven Rostedt 				  RB_LEN_TIME_EXTEND,
10237a8e76a3SSteven Rostedt 				  ts);
10247a8e76a3SSteven Rostedt 	if (!event)
1025bf41a158SSteven Rostedt 		return -EBUSY;
10267a8e76a3SSteven Rostedt 
1027bf41a158SSteven Rostedt 	if (PTR_ERR(event) == -EAGAIN)
1028bf41a158SSteven Rostedt 		return -EAGAIN;
1029bf41a158SSteven Rostedt 
1030bf41a158SSteven Rostedt 	/* Only a commited time event can update the write stamp */
1031bf41a158SSteven Rostedt 	if (rb_is_commit(cpu_buffer, event)) {
1032bf41a158SSteven Rostedt 		/*
1033bf41a158SSteven Rostedt 		 * If this is the first on the page, then we need to
1034bf41a158SSteven Rostedt 		 * update the page itself, and just put in a zero.
1035bf41a158SSteven Rostedt 		 */
1036bf41a158SSteven Rostedt 		if (rb_event_index(event)) {
10377a8e76a3SSteven Rostedt 			event->time_delta = *delta & TS_MASK;
10387a8e76a3SSteven Rostedt 			event->array[0] = *delta >> TS_SHIFT;
1039bf41a158SSteven Rostedt 		} else {
1040bf41a158SSteven Rostedt 			cpu_buffer->commit_page->time_stamp = *ts;
1041bf41a158SSteven Rostedt 			event->time_delta = 0;
1042bf41a158SSteven Rostedt 			event->array[0] = 0;
1043bf41a158SSteven Rostedt 		}
10447a8e76a3SSteven Rostedt 		cpu_buffer->write_stamp = *ts;
1045bf41a158SSteven Rostedt 		/* let the caller know this was the commit */
1046bf41a158SSteven Rostedt 		ret = 1;
1047bf41a158SSteven Rostedt 	} else {
1048bf41a158SSteven Rostedt 		/* Darn, this is just wasted space */
1049bf41a158SSteven Rostedt 		event->time_delta = 0;
1050bf41a158SSteven Rostedt 		event->array[0] = 0;
1051bf41a158SSteven Rostedt 		ret = 0;
10527a8e76a3SSteven Rostedt 	}
10537a8e76a3SSteven Rostedt 
1054bf41a158SSteven Rostedt 	*delta = 0;
1055bf41a158SSteven Rostedt 
1056bf41a158SSteven Rostedt 	return ret;
10577a8e76a3SSteven Rostedt }
10587a8e76a3SSteven Rostedt 
10597a8e76a3SSteven Rostedt static struct ring_buffer_event *
10607a8e76a3SSteven Rostedt rb_reserve_next_event(struct ring_buffer_per_cpu *cpu_buffer,
10617a8e76a3SSteven Rostedt 		      unsigned type, unsigned long length)
10627a8e76a3SSteven Rostedt {
10637a8e76a3SSteven Rostedt 	struct ring_buffer_event *event;
10647a8e76a3SSteven Rostedt 	u64 ts, delta;
1065bf41a158SSteven Rostedt 	int commit = 0;
1066818e3dd3SSteven Rostedt 	int nr_loops = 0;
10677a8e76a3SSteven Rostedt 
1068bf41a158SSteven Rostedt  again:
1069818e3dd3SSteven Rostedt 	/*
1070818e3dd3SSteven Rostedt 	 * We allow for interrupts to reenter here and do a trace.
1071818e3dd3SSteven Rostedt 	 * If one does, it will cause this original code to loop
1072818e3dd3SSteven Rostedt 	 * back here. Even with heavy interrupts happening, this
1073818e3dd3SSteven Rostedt 	 * should only happen a few times in a row. If this happens
1074818e3dd3SSteven Rostedt 	 * 1000 times in a row, there must be either an interrupt
1075818e3dd3SSteven Rostedt 	 * storm or we have something buggy.
1076818e3dd3SSteven Rostedt 	 * Bail!
1077818e3dd3SSteven Rostedt 	 */
1078*3e89c7bbSSteven Rostedt 	if (RB_WARN_ON(cpu_buffer, ++nr_loops > 1000))
1079818e3dd3SSteven Rostedt 		return NULL;
1080818e3dd3SSteven Rostedt 
10817a8e76a3SSteven Rostedt 	ts = ring_buffer_time_stamp(cpu_buffer->cpu);
10827a8e76a3SSteven Rostedt 
1083bf41a158SSteven Rostedt 	/*
1084bf41a158SSteven Rostedt 	 * Only the first commit can update the timestamp.
1085bf41a158SSteven Rostedt 	 * Yes there is a race here. If an interrupt comes in
1086bf41a158SSteven Rostedt 	 * just after the conditional and it traces too, then it
1087bf41a158SSteven Rostedt 	 * will also check the deltas. More than one timestamp may
1088bf41a158SSteven Rostedt 	 * also be made. But only the entry that did the actual
1089bf41a158SSteven Rostedt 	 * commit will be something other than zero.
1090bf41a158SSteven Rostedt 	 */
1091bf41a158SSteven Rostedt 	if (cpu_buffer->tail_page == cpu_buffer->commit_page &&
1092bf41a158SSteven Rostedt 	    rb_page_write(cpu_buffer->tail_page) ==
1093bf41a158SSteven Rostedt 	    rb_commit_index(cpu_buffer)) {
1094bf41a158SSteven Rostedt 
10957a8e76a3SSteven Rostedt 		delta = ts - cpu_buffer->write_stamp;
10967a8e76a3SSteven Rostedt 
1097bf41a158SSteven Rostedt 		/* make sure this delta is calculated here */
1098bf41a158SSteven Rostedt 		barrier();
10997a8e76a3SSteven Rostedt 
1100bf41a158SSteven Rostedt 		/* Did the write stamp get updated already? */
1101bf41a158SSteven Rostedt 		if (unlikely(ts < cpu_buffer->write_stamp))
11024143c5cbSSteven Rostedt 			delta = 0;
1103bf41a158SSteven Rostedt 
1104bf41a158SSteven Rostedt 		if (test_time_stamp(delta)) {
1105bf41a158SSteven Rostedt 
1106bf41a158SSteven Rostedt 			commit = rb_add_time_stamp(cpu_buffer, &ts, &delta);
1107bf41a158SSteven Rostedt 
1108bf41a158SSteven Rostedt 			if (commit == -EBUSY)
11097a8e76a3SSteven Rostedt 				return NULL;
1110bf41a158SSteven Rostedt 
1111bf41a158SSteven Rostedt 			if (commit == -EAGAIN)
1112bf41a158SSteven Rostedt 				goto again;
1113bf41a158SSteven Rostedt 
1114bf41a158SSteven Rostedt 			RB_WARN_ON(cpu_buffer, commit < 0);
11157a8e76a3SSteven Rostedt 		}
1116bf41a158SSteven Rostedt 	} else
1117bf41a158SSteven Rostedt 		/* Non commits have zero deltas */
11187a8e76a3SSteven Rostedt 		delta = 0;
11197a8e76a3SSteven Rostedt 
11207a8e76a3SSteven Rostedt 	event = __rb_reserve_next(cpu_buffer, type, length, &ts);
1121bf41a158SSteven Rostedt 	if (PTR_ERR(event) == -EAGAIN)
1122bf41a158SSteven Rostedt 		goto again;
11237a8e76a3SSteven Rostedt 
1124bf41a158SSteven Rostedt 	if (!event) {
1125bf41a158SSteven Rostedt 		if (unlikely(commit))
1126bf41a158SSteven Rostedt 			/*
1127bf41a158SSteven Rostedt 			 * Ouch! We needed a timestamp and it was commited. But
1128bf41a158SSteven Rostedt 			 * we didn't get our event reserved.
1129bf41a158SSteven Rostedt 			 */
1130bf41a158SSteven Rostedt 			rb_set_commit_to_write(cpu_buffer);
1131bf41a158SSteven Rostedt 		return NULL;
1132bf41a158SSteven Rostedt 	}
1133bf41a158SSteven Rostedt 
1134bf41a158SSteven Rostedt 	/*
1135bf41a158SSteven Rostedt 	 * If the timestamp was commited, make the commit our entry
1136bf41a158SSteven Rostedt 	 * now so that we will update it when needed.
1137bf41a158SSteven Rostedt 	 */
1138bf41a158SSteven Rostedt 	if (commit)
1139bf41a158SSteven Rostedt 		rb_set_commit_event(cpu_buffer, event);
1140bf41a158SSteven Rostedt 	else if (!rb_is_commit(cpu_buffer, event))
11417a8e76a3SSteven Rostedt 		delta = 0;
11427a8e76a3SSteven Rostedt 
11437a8e76a3SSteven Rostedt 	event->time_delta = delta;
11447a8e76a3SSteven Rostedt 
11457a8e76a3SSteven Rostedt 	return event;
11467a8e76a3SSteven Rostedt }
11477a8e76a3SSteven Rostedt 
1148bf41a158SSteven Rostedt static DEFINE_PER_CPU(int, rb_need_resched);
1149bf41a158SSteven Rostedt 
11507a8e76a3SSteven Rostedt /**
11517a8e76a3SSteven Rostedt  * ring_buffer_lock_reserve - reserve a part of the buffer
11527a8e76a3SSteven Rostedt  * @buffer: the ring buffer to reserve from
11537a8e76a3SSteven Rostedt  * @length: the length of the data to reserve (excluding event header)
11547a8e76a3SSteven Rostedt  * @flags: a pointer to save the interrupt flags
11557a8e76a3SSteven Rostedt  *
11567a8e76a3SSteven Rostedt  * Returns a reseverd event on the ring buffer to copy directly to.
11577a8e76a3SSteven Rostedt  * The user of this interface will need to get the body to write into
11587a8e76a3SSteven Rostedt  * and can use the ring_buffer_event_data() interface.
11597a8e76a3SSteven Rostedt  *
11607a8e76a3SSteven Rostedt  * The length is the length of the data needed, not the event length
11617a8e76a3SSteven Rostedt  * which also includes the event header.
11627a8e76a3SSteven Rostedt  *
11637a8e76a3SSteven Rostedt  * Must be paired with ring_buffer_unlock_commit, unless NULL is returned.
11647a8e76a3SSteven Rostedt  * If NULL is returned, then nothing has been allocated or locked.
11657a8e76a3SSteven Rostedt  */
11667a8e76a3SSteven Rostedt struct ring_buffer_event *
11677a8e76a3SSteven Rostedt ring_buffer_lock_reserve(struct ring_buffer *buffer,
11687a8e76a3SSteven Rostedt 			 unsigned long length,
11697a8e76a3SSteven Rostedt 			 unsigned long *flags)
11707a8e76a3SSteven Rostedt {
11717a8e76a3SSteven Rostedt 	struct ring_buffer_per_cpu *cpu_buffer;
11727a8e76a3SSteven Rostedt 	struct ring_buffer_event *event;
1173bf41a158SSteven Rostedt 	int cpu, resched;
11747a8e76a3SSteven Rostedt 
1175a3583244SSteven Rostedt 	if (ring_buffers_off)
1176a3583244SSteven Rostedt 		return NULL;
1177a3583244SSteven Rostedt 
11787a8e76a3SSteven Rostedt 	if (atomic_read(&buffer->record_disabled))
11797a8e76a3SSteven Rostedt 		return NULL;
11807a8e76a3SSteven Rostedt 
1181bf41a158SSteven Rostedt 	/* If we are tracing schedule, we don't want to recurse */
1182182e9f5fSSteven Rostedt 	resched = ftrace_preempt_disable();
1183bf41a158SSteven Rostedt 
11847a8e76a3SSteven Rostedt 	cpu = raw_smp_processor_id();
11857a8e76a3SSteven Rostedt 
11867a8e76a3SSteven Rostedt 	if (!cpu_isset(cpu, buffer->cpumask))
1187d769041fSSteven Rostedt 		goto out;
11887a8e76a3SSteven Rostedt 
11897a8e76a3SSteven Rostedt 	cpu_buffer = buffer->buffers[cpu];
11907a8e76a3SSteven Rostedt 
11917a8e76a3SSteven Rostedt 	if (atomic_read(&cpu_buffer->record_disabled))
1192d769041fSSteven Rostedt 		goto out;
11937a8e76a3SSteven Rostedt 
11947a8e76a3SSteven Rostedt 	length = rb_calculate_event_length(length);
11957a8e76a3SSteven Rostedt 	if (length > BUF_PAGE_SIZE)
1196bf41a158SSteven Rostedt 		goto out;
11977a8e76a3SSteven Rostedt 
11987a8e76a3SSteven Rostedt 	event = rb_reserve_next_event(cpu_buffer, RINGBUF_TYPE_DATA, length);
11997a8e76a3SSteven Rostedt 	if (!event)
1200d769041fSSteven Rostedt 		goto out;
12017a8e76a3SSteven Rostedt 
1202bf41a158SSteven Rostedt 	/*
1203bf41a158SSteven Rostedt 	 * Need to store resched state on this cpu.
1204bf41a158SSteven Rostedt 	 * Only the first needs to.
1205bf41a158SSteven Rostedt 	 */
1206bf41a158SSteven Rostedt 
1207bf41a158SSteven Rostedt 	if (preempt_count() == 1)
1208bf41a158SSteven Rostedt 		per_cpu(rb_need_resched, cpu) = resched;
1209bf41a158SSteven Rostedt 
12107a8e76a3SSteven Rostedt 	return event;
12117a8e76a3SSteven Rostedt 
1212d769041fSSteven Rostedt  out:
1213182e9f5fSSteven Rostedt 	ftrace_preempt_enable(resched);
12147a8e76a3SSteven Rostedt 	return NULL;
12157a8e76a3SSteven Rostedt }
12167a8e76a3SSteven Rostedt 
12177a8e76a3SSteven Rostedt static void rb_commit(struct ring_buffer_per_cpu *cpu_buffer,
12187a8e76a3SSteven Rostedt 		      struct ring_buffer_event *event)
12197a8e76a3SSteven Rostedt {
12207a8e76a3SSteven Rostedt 	cpu_buffer->entries++;
1221bf41a158SSteven Rostedt 
1222bf41a158SSteven Rostedt 	/* Only process further if we own the commit */
1223bf41a158SSteven Rostedt 	if (!rb_is_commit(cpu_buffer, event))
1224bf41a158SSteven Rostedt 		return;
1225bf41a158SSteven Rostedt 
1226bf41a158SSteven Rostedt 	cpu_buffer->write_stamp += event->time_delta;
1227bf41a158SSteven Rostedt 
1228bf41a158SSteven Rostedt 	rb_set_commit_to_write(cpu_buffer);
12297a8e76a3SSteven Rostedt }
12307a8e76a3SSteven Rostedt 
12317a8e76a3SSteven Rostedt /**
12327a8e76a3SSteven Rostedt  * ring_buffer_unlock_commit - commit a reserved
12337a8e76a3SSteven Rostedt  * @buffer: The buffer to commit to
12347a8e76a3SSteven Rostedt  * @event: The event pointer to commit.
12357a8e76a3SSteven Rostedt  * @flags: the interrupt flags received from ring_buffer_lock_reserve.
12367a8e76a3SSteven Rostedt  *
12377a8e76a3SSteven Rostedt  * This commits the data to the ring buffer, and releases any locks held.
12387a8e76a3SSteven Rostedt  *
12397a8e76a3SSteven Rostedt  * Must be paired with ring_buffer_lock_reserve.
12407a8e76a3SSteven Rostedt  */
12417a8e76a3SSteven Rostedt int ring_buffer_unlock_commit(struct ring_buffer *buffer,
12427a8e76a3SSteven Rostedt 			      struct ring_buffer_event *event,
12437a8e76a3SSteven Rostedt 			      unsigned long flags)
12447a8e76a3SSteven Rostedt {
12457a8e76a3SSteven Rostedt 	struct ring_buffer_per_cpu *cpu_buffer;
12467a8e76a3SSteven Rostedt 	int cpu = raw_smp_processor_id();
12477a8e76a3SSteven Rostedt 
12487a8e76a3SSteven Rostedt 	cpu_buffer = buffer->buffers[cpu];
12497a8e76a3SSteven Rostedt 
12507a8e76a3SSteven Rostedt 	rb_commit(cpu_buffer, event);
12517a8e76a3SSteven Rostedt 
1252bf41a158SSteven Rostedt 	/*
1253bf41a158SSteven Rostedt 	 * Only the last preempt count needs to restore preemption.
1254bf41a158SSteven Rostedt 	 */
1255182e9f5fSSteven Rostedt 	if (preempt_count() == 1)
1256182e9f5fSSteven Rostedt 		ftrace_preempt_enable(per_cpu(rb_need_resched, cpu));
1257bf41a158SSteven Rostedt 	else
1258bf41a158SSteven Rostedt 		preempt_enable_no_resched_notrace();
12597a8e76a3SSteven Rostedt 
12607a8e76a3SSteven Rostedt 	return 0;
12617a8e76a3SSteven Rostedt }
12627a8e76a3SSteven Rostedt 
12637a8e76a3SSteven Rostedt /**
12647a8e76a3SSteven Rostedt  * ring_buffer_write - write data to the buffer without reserving
12657a8e76a3SSteven Rostedt  * @buffer: The ring buffer to write to.
12667a8e76a3SSteven Rostedt  * @length: The length of the data being written (excluding the event header)
12677a8e76a3SSteven Rostedt  * @data: The data to write to the buffer.
12687a8e76a3SSteven Rostedt  *
12697a8e76a3SSteven Rostedt  * This is like ring_buffer_lock_reserve and ring_buffer_unlock_commit as
12707a8e76a3SSteven Rostedt  * one function. If you already have the data to write to the buffer, it
12717a8e76a3SSteven Rostedt  * may be easier to simply call this function.
12727a8e76a3SSteven Rostedt  *
12737a8e76a3SSteven Rostedt  * Note, like ring_buffer_lock_reserve, the length is the length of the data
12747a8e76a3SSteven Rostedt  * and not the length of the event which would hold the header.
12757a8e76a3SSteven Rostedt  */
12767a8e76a3SSteven Rostedt int ring_buffer_write(struct ring_buffer *buffer,
12777a8e76a3SSteven Rostedt 			unsigned long length,
12787a8e76a3SSteven Rostedt 			void *data)
12797a8e76a3SSteven Rostedt {
12807a8e76a3SSteven Rostedt 	struct ring_buffer_per_cpu *cpu_buffer;
12817a8e76a3SSteven Rostedt 	struct ring_buffer_event *event;
1282bf41a158SSteven Rostedt 	unsigned long event_length;
12837a8e76a3SSteven Rostedt 	void *body;
12847a8e76a3SSteven Rostedt 	int ret = -EBUSY;
1285bf41a158SSteven Rostedt 	int cpu, resched;
12867a8e76a3SSteven Rostedt 
1287a3583244SSteven Rostedt 	if (ring_buffers_off)
1288a3583244SSteven Rostedt 		return -EBUSY;
1289a3583244SSteven Rostedt 
12907a8e76a3SSteven Rostedt 	if (atomic_read(&buffer->record_disabled))
12917a8e76a3SSteven Rostedt 		return -EBUSY;
12927a8e76a3SSteven Rostedt 
1293182e9f5fSSteven Rostedt 	resched = ftrace_preempt_disable();
1294bf41a158SSteven Rostedt 
12957a8e76a3SSteven Rostedt 	cpu = raw_smp_processor_id();
12967a8e76a3SSteven Rostedt 
12977a8e76a3SSteven Rostedt 	if (!cpu_isset(cpu, buffer->cpumask))
1298d769041fSSteven Rostedt 		goto out;
12997a8e76a3SSteven Rostedt 
13007a8e76a3SSteven Rostedt 	cpu_buffer = buffer->buffers[cpu];
13017a8e76a3SSteven Rostedt 
13027a8e76a3SSteven Rostedt 	if (atomic_read(&cpu_buffer->record_disabled))
13037a8e76a3SSteven Rostedt 		goto out;
13047a8e76a3SSteven Rostedt 
13057a8e76a3SSteven Rostedt 	event_length = rb_calculate_event_length(length);
13067a8e76a3SSteven Rostedt 	event = rb_reserve_next_event(cpu_buffer,
13077a8e76a3SSteven Rostedt 				      RINGBUF_TYPE_DATA, event_length);
13087a8e76a3SSteven Rostedt 	if (!event)
13097a8e76a3SSteven Rostedt 		goto out;
13107a8e76a3SSteven Rostedt 
13117a8e76a3SSteven Rostedt 	body = rb_event_data(event);
13127a8e76a3SSteven Rostedt 
13137a8e76a3SSteven Rostedt 	memcpy(body, data, length);
13147a8e76a3SSteven Rostedt 
13157a8e76a3SSteven Rostedt 	rb_commit(cpu_buffer, event);
13167a8e76a3SSteven Rostedt 
13177a8e76a3SSteven Rostedt 	ret = 0;
13187a8e76a3SSteven Rostedt  out:
1319182e9f5fSSteven Rostedt 	ftrace_preempt_enable(resched);
13207a8e76a3SSteven Rostedt 
13217a8e76a3SSteven Rostedt 	return ret;
13227a8e76a3SSteven Rostedt }
13237a8e76a3SSteven Rostedt 
1324bf41a158SSteven Rostedt static inline int rb_per_cpu_empty(struct ring_buffer_per_cpu *cpu_buffer)
1325bf41a158SSteven Rostedt {
1326bf41a158SSteven Rostedt 	struct buffer_page *reader = cpu_buffer->reader_page;
1327bf41a158SSteven Rostedt 	struct buffer_page *head = cpu_buffer->head_page;
1328bf41a158SSteven Rostedt 	struct buffer_page *commit = cpu_buffer->commit_page;
1329bf41a158SSteven Rostedt 
1330bf41a158SSteven Rostedt 	return reader->read == rb_page_commit(reader) &&
1331bf41a158SSteven Rostedt 		(commit == reader ||
1332bf41a158SSteven Rostedt 		 (commit == head &&
1333bf41a158SSteven Rostedt 		  head->read == rb_page_commit(commit)));
1334bf41a158SSteven Rostedt }
1335bf41a158SSteven Rostedt 
13367a8e76a3SSteven Rostedt /**
13377a8e76a3SSteven Rostedt  * ring_buffer_record_disable - stop all writes into the buffer
13387a8e76a3SSteven Rostedt  * @buffer: The ring buffer to stop writes to.
13397a8e76a3SSteven Rostedt  *
13407a8e76a3SSteven Rostedt  * This prevents all writes to the buffer. Any attempt to write
13417a8e76a3SSteven Rostedt  * to the buffer after this will fail and return NULL.
13427a8e76a3SSteven Rostedt  *
13437a8e76a3SSteven Rostedt  * The caller should call synchronize_sched() after this.
13447a8e76a3SSteven Rostedt  */
13457a8e76a3SSteven Rostedt void ring_buffer_record_disable(struct ring_buffer *buffer)
13467a8e76a3SSteven Rostedt {
13477a8e76a3SSteven Rostedt 	atomic_inc(&buffer->record_disabled);
13487a8e76a3SSteven Rostedt }
13497a8e76a3SSteven Rostedt 
13507a8e76a3SSteven Rostedt /**
13517a8e76a3SSteven Rostedt  * ring_buffer_record_enable - enable writes to the buffer
13527a8e76a3SSteven Rostedt  * @buffer: The ring buffer to enable writes
13537a8e76a3SSteven Rostedt  *
13547a8e76a3SSteven Rostedt  * Note, multiple disables will need the same number of enables
13557a8e76a3SSteven Rostedt  * to truely enable the writing (much like preempt_disable).
13567a8e76a3SSteven Rostedt  */
13577a8e76a3SSteven Rostedt void ring_buffer_record_enable(struct ring_buffer *buffer)
13587a8e76a3SSteven Rostedt {
13597a8e76a3SSteven Rostedt 	atomic_dec(&buffer->record_disabled);
13607a8e76a3SSteven Rostedt }
13617a8e76a3SSteven Rostedt 
13627a8e76a3SSteven Rostedt /**
13637a8e76a3SSteven Rostedt  * ring_buffer_record_disable_cpu - stop all writes into the cpu_buffer
13647a8e76a3SSteven Rostedt  * @buffer: The ring buffer to stop writes to.
13657a8e76a3SSteven Rostedt  * @cpu: The CPU buffer to stop
13667a8e76a3SSteven Rostedt  *
13677a8e76a3SSteven Rostedt  * This prevents all writes to the buffer. Any attempt to write
13687a8e76a3SSteven Rostedt  * to the buffer after this will fail and return NULL.
13697a8e76a3SSteven Rostedt  *
13707a8e76a3SSteven Rostedt  * The caller should call synchronize_sched() after this.
13717a8e76a3SSteven Rostedt  */
13727a8e76a3SSteven Rostedt void ring_buffer_record_disable_cpu(struct ring_buffer *buffer, int cpu)
13737a8e76a3SSteven Rostedt {
13747a8e76a3SSteven Rostedt 	struct ring_buffer_per_cpu *cpu_buffer;
13757a8e76a3SSteven Rostedt 
13767a8e76a3SSteven Rostedt 	if (!cpu_isset(cpu, buffer->cpumask))
13777a8e76a3SSteven Rostedt 		return;
13787a8e76a3SSteven Rostedt 
13797a8e76a3SSteven Rostedt 	cpu_buffer = buffer->buffers[cpu];
13807a8e76a3SSteven Rostedt 	atomic_inc(&cpu_buffer->record_disabled);
13817a8e76a3SSteven Rostedt }
13827a8e76a3SSteven Rostedt 
13837a8e76a3SSteven Rostedt /**
13847a8e76a3SSteven Rostedt  * ring_buffer_record_enable_cpu - enable writes to the buffer
13857a8e76a3SSteven Rostedt  * @buffer: The ring buffer to enable writes
13867a8e76a3SSteven Rostedt  * @cpu: The CPU to enable.
13877a8e76a3SSteven Rostedt  *
13887a8e76a3SSteven Rostedt  * Note, multiple disables will need the same number of enables
13897a8e76a3SSteven Rostedt  * to truely enable the writing (much like preempt_disable).
13907a8e76a3SSteven Rostedt  */
13917a8e76a3SSteven Rostedt void ring_buffer_record_enable_cpu(struct ring_buffer *buffer, int cpu)
13927a8e76a3SSteven Rostedt {
13937a8e76a3SSteven Rostedt 	struct ring_buffer_per_cpu *cpu_buffer;
13947a8e76a3SSteven Rostedt 
13957a8e76a3SSteven Rostedt 	if (!cpu_isset(cpu, buffer->cpumask))
13967a8e76a3SSteven Rostedt 		return;
13977a8e76a3SSteven Rostedt 
13987a8e76a3SSteven Rostedt 	cpu_buffer = buffer->buffers[cpu];
13997a8e76a3SSteven Rostedt 	atomic_dec(&cpu_buffer->record_disabled);
14007a8e76a3SSteven Rostedt }
14017a8e76a3SSteven Rostedt 
14027a8e76a3SSteven Rostedt /**
14037a8e76a3SSteven Rostedt  * ring_buffer_entries_cpu - get the number of entries in a cpu buffer
14047a8e76a3SSteven Rostedt  * @buffer: The ring buffer
14057a8e76a3SSteven Rostedt  * @cpu: The per CPU buffer to get the entries from.
14067a8e76a3SSteven Rostedt  */
14077a8e76a3SSteven Rostedt unsigned long ring_buffer_entries_cpu(struct ring_buffer *buffer, int cpu)
14087a8e76a3SSteven Rostedt {
14097a8e76a3SSteven Rostedt 	struct ring_buffer_per_cpu *cpu_buffer;
14107a8e76a3SSteven Rostedt 
14117a8e76a3SSteven Rostedt 	if (!cpu_isset(cpu, buffer->cpumask))
14127a8e76a3SSteven Rostedt 		return 0;
14137a8e76a3SSteven Rostedt 
14147a8e76a3SSteven Rostedt 	cpu_buffer = buffer->buffers[cpu];
14157a8e76a3SSteven Rostedt 	return cpu_buffer->entries;
14167a8e76a3SSteven Rostedt }
14177a8e76a3SSteven Rostedt 
14187a8e76a3SSteven Rostedt /**
14197a8e76a3SSteven Rostedt  * ring_buffer_overrun_cpu - get the number of overruns in a cpu_buffer
14207a8e76a3SSteven Rostedt  * @buffer: The ring buffer
14217a8e76a3SSteven Rostedt  * @cpu: The per CPU buffer to get the number of overruns from
14227a8e76a3SSteven Rostedt  */
14237a8e76a3SSteven Rostedt unsigned long ring_buffer_overrun_cpu(struct ring_buffer *buffer, int cpu)
14247a8e76a3SSteven Rostedt {
14257a8e76a3SSteven Rostedt 	struct ring_buffer_per_cpu *cpu_buffer;
14267a8e76a3SSteven Rostedt 
14277a8e76a3SSteven Rostedt 	if (!cpu_isset(cpu, buffer->cpumask))
14287a8e76a3SSteven Rostedt 		return 0;
14297a8e76a3SSteven Rostedt 
14307a8e76a3SSteven Rostedt 	cpu_buffer = buffer->buffers[cpu];
14317a8e76a3SSteven Rostedt 	return cpu_buffer->overrun;
14327a8e76a3SSteven Rostedt }
14337a8e76a3SSteven Rostedt 
14347a8e76a3SSteven Rostedt /**
14357a8e76a3SSteven Rostedt  * ring_buffer_entries - get the number of entries in a buffer
14367a8e76a3SSteven Rostedt  * @buffer: The ring buffer
14377a8e76a3SSteven Rostedt  *
14387a8e76a3SSteven Rostedt  * Returns the total number of entries in the ring buffer
14397a8e76a3SSteven Rostedt  * (all CPU entries)
14407a8e76a3SSteven Rostedt  */
14417a8e76a3SSteven Rostedt unsigned long ring_buffer_entries(struct ring_buffer *buffer)
14427a8e76a3SSteven Rostedt {
14437a8e76a3SSteven Rostedt 	struct ring_buffer_per_cpu *cpu_buffer;
14447a8e76a3SSteven Rostedt 	unsigned long entries = 0;
14457a8e76a3SSteven Rostedt 	int cpu;
14467a8e76a3SSteven Rostedt 
14477a8e76a3SSteven Rostedt 	/* if you care about this being correct, lock the buffer */
14487a8e76a3SSteven Rostedt 	for_each_buffer_cpu(buffer, cpu) {
14497a8e76a3SSteven Rostedt 		cpu_buffer = buffer->buffers[cpu];
14507a8e76a3SSteven Rostedt 		entries += cpu_buffer->entries;
14517a8e76a3SSteven Rostedt 	}
14527a8e76a3SSteven Rostedt 
14537a8e76a3SSteven Rostedt 	return entries;
14547a8e76a3SSteven Rostedt }
14557a8e76a3SSteven Rostedt 
14567a8e76a3SSteven Rostedt /**
14577a8e76a3SSteven Rostedt  * ring_buffer_overrun_cpu - get the number of overruns in buffer
14587a8e76a3SSteven Rostedt  * @buffer: The ring buffer
14597a8e76a3SSteven Rostedt  *
14607a8e76a3SSteven Rostedt  * Returns the total number of overruns in the ring buffer
14617a8e76a3SSteven Rostedt  * (all CPU entries)
14627a8e76a3SSteven Rostedt  */
14637a8e76a3SSteven Rostedt unsigned long ring_buffer_overruns(struct ring_buffer *buffer)
14647a8e76a3SSteven Rostedt {
14657a8e76a3SSteven Rostedt 	struct ring_buffer_per_cpu *cpu_buffer;
14667a8e76a3SSteven Rostedt 	unsigned long overruns = 0;
14677a8e76a3SSteven Rostedt 	int cpu;
14687a8e76a3SSteven Rostedt 
14697a8e76a3SSteven Rostedt 	/* if you care about this being correct, lock the buffer */
14707a8e76a3SSteven Rostedt 	for_each_buffer_cpu(buffer, cpu) {
14717a8e76a3SSteven Rostedt 		cpu_buffer = buffer->buffers[cpu];
14727a8e76a3SSteven Rostedt 		overruns += cpu_buffer->overrun;
14737a8e76a3SSteven Rostedt 	}
14747a8e76a3SSteven Rostedt 
14757a8e76a3SSteven Rostedt 	return overruns;
14767a8e76a3SSteven Rostedt }
14777a8e76a3SSteven Rostedt 
14787a8e76a3SSteven Rostedt /**
14797a8e76a3SSteven Rostedt  * ring_buffer_iter_reset - reset an iterator
14807a8e76a3SSteven Rostedt  * @iter: The iterator to reset
14817a8e76a3SSteven Rostedt  *
14827a8e76a3SSteven Rostedt  * Resets the iterator, so that it will start from the beginning
14837a8e76a3SSteven Rostedt  * again.
14847a8e76a3SSteven Rostedt  */
14857a8e76a3SSteven Rostedt void ring_buffer_iter_reset(struct ring_buffer_iter *iter)
14867a8e76a3SSteven Rostedt {
14877a8e76a3SSteven Rostedt 	struct ring_buffer_per_cpu *cpu_buffer = iter->cpu_buffer;
1488f83c9d0fSSteven Rostedt 	unsigned long flags;
1489f83c9d0fSSteven Rostedt 
1490f83c9d0fSSteven Rostedt 	spin_lock_irqsave(&cpu_buffer->reader_lock, flags);
14917a8e76a3SSteven Rostedt 
1492d769041fSSteven Rostedt 	/* Iterator usage is expected to have record disabled */
1493d769041fSSteven Rostedt 	if (list_empty(&cpu_buffer->reader_page->list)) {
14947a8e76a3SSteven Rostedt 		iter->head_page = cpu_buffer->head_page;
14956f807acdSSteven Rostedt 		iter->head = cpu_buffer->head_page->read;
1496d769041fSSteven Rostedt 	} else {
1497d769041fSSteven Rostedt 		iter->head_page = cpu_buffer->reader_page;
14986f807acdSSteven Rostedt 		iter->head = cpu_buffer->reader_page->read;
1499d769041fSSteven Rostedt 	}
1500d769041fSSteven Rostedt 	if (iter->head)
1501d769041fSSteven Rostedt 		iter->read_stamp = cpu_buffer->read_stamp;
1502d769041fSSteven Rostedt 	else
1503d769041fSSteven Rostedt 		iter->read_stamp = iter->head_page->time_stamp;
1504f83c9d0fSSteven Rostedt 
1505f83c9d0fSSteven Rostedt 	spin_unlock_irqrestore(&cpu_buffer->reader_lock, flags);
15067a8e76a3SSteven Rostedt }
15077a8e76a3SSteven Rostedt 
15087a8e76a3SSteven Rostedt /**
15097a8e76a3SSteven Rostedt  * ring_buffer_iter_empty - check if an iterator has no more to read
15107a8e76a3SSteven Rostedt  * @iter: The iterator to check
15117a8e76a3SSteven Rostedt  */
15127a8e76a3SSteven Rostedt int ring_buffer_iter_empty(struct ring_buffer_iter *iter)
15137a8e76a3SSteven Rostedt {
15147a8e76a3SSteven Rostedt 	struct ring_buffer_per_cpu *cpu_buffer;
15157a8e76a3SSteven Rostedt 
15167a8e76a3SSteven Rostedt 	cpu_buffer = iter->cpu_buffer;
15177a8e76a3SSteven Rostedt 
1518bf41a158SSteven Rostedt 	return iter->head_page == cpu_buffer->commit_page &&
1519bf41a158SSteven Rostedt 		iter->head == rb_commit_index(cpu_buffer);
15207a8e76a3SSteven Rostedt }
15217a8e76a3SSteven Rostedt 
15227a8e76a3SSteven Rostedt static void
15237a8e76a3SSteven Rostedt rb_update_read_stamp(struct ring_buffer_per_cpu *cpu_buffer,
15247a8e76a3SSteven Rostedt 		     struct ring_buffer_event *event)
15257a8e76a3SSteven Rostedt {
15267a8e76a3SSteven Rostedt 	u64 delta;
15277a8e76a3SSteven Rostedt 
15287a8e76a3SSteven Rostedt 	switch (event->type) {
15297a8e76a3SSteven Rostedt 	case RINGBUF_TYPE_PADDING:
15307a8e76a3SSteven Rostedt 		return;
15317a8e76a3SSteven Rostedt 
15327a8e76a3SSteven Rostedt 	case RINGBUF_TYPE_TIME_EXTEND:
15337a8e76a3SSteven Rostedt 		delta = event->array[0];
15347a8e76a3SSteven Rostedt 		delta <<= TS_SHIFT;
15357a8e76a3SSteven Rostedt 		delta += event->time_delta;
15367a8e76a3SSteven Rostedt 		cpu_buffer->read_stamp += delta;
15377a8e76a3SSteven Rostedt 		return;
15387a8e76a3SSteven Rostedt 
15397a8e76a3SSteven Rostedt 	case RINGBUF_TYPE_TIME_STAMP:
15407a8e76a3SSteven Rostedt 		/* FIXME: not implemented */
15417a8e76a3SSteven Rostedt 		return;
15427a8e76a3SSteven Rostedt 
15437a8e76a3SSteven Rostedt 	case RINGBUF_TYPE_DATA:
15447a8e76a3SSteven Rostedt 		cpu_buffer->read_stamp += event->time_delta;
15457a8e76a3SSteven Rostedt 		return;
15467a8e76a3SSteven Rostedt 
15477a8e76a3SSteven Rostedt 	default:
15487a8e76a3SSteven Rostedt 		BUG();
15497a8e76a3SSteven Rostedt 	}
15507a8e76a3SSteven Rostedt 	return;
15517a8e76a3SSteven Rostedt }
15527a8e76a3SSteven Rostedt 
15537a8e76a3SSteven Rostedt static void
15547a8e76a3SSteven Rostedt rb_update_iter_read_stamp(struct ring_buffer_iter *iter,
15557a8e76a3SSteven Rostedt 			  struct ring_buffer_event *event)
15567a8e76a3SSteven Rostedt {
15577a8e76a3SSteven Rostedt 	u64 delta;
15587a8e76a3SSteven Rostedt 
15597a8e76a3SSteven Rostedt 	switch (event->type) {
15607a8e76a3SSteven Rostedt 	case RINGBUF_TYPE_PADDING:
15617a8e76a3SSteven Rostedt 		return;
15627a8e76a3SSteven Rostedt 
15637a8e76a3SSteven Rostedt 	case RINGBUF_TYPE_TIME_EXTEND:
15647a8e76a3SSteven Rostedt 		delta = event->array[0];
15657a8e76a3SSteven Rostedt 		delta <<= TS_SHIFT;
15667a8e76a3SSteven Rostedt 		delta += event->time_delta;
15677a8e76a3SSteven Rostedt 		iter->read_stamp += delta;
15687a8e76a3SSteven Rostedt 		return;
15697a8e76a3SSteven Rostedt 
15707a8e76a3SSteven Rostedt 	case RINGBUF_TYPE_TIME_STAMP:
15717a8e76a3SSteven Rostedt 		/* FIXME: not implemented */
15727a8e76a3SSteven Rostedt 		return;
15737a8e76a3SSteven Rostedt 
15747a8e76a3SSteven Rostedt 	case RINGBUF_TYPE_DATA:
15757a8e76a3SSteven Rostedt 		iter->read_stamp += event->time_delta;
15767a8e76a3SSteven Rostedt 		return;
15777a8e76a3SSteven Rostedt 
15787a8e76a3SSteven Rostedt 	default:
15797a8e76a3SSteven Rostedt 		BUG();
15807a8e76a3SSteven Rostedt 	}
15817a8e76a3SSteven Rostedt 	return;
15827a8e76a3SSteven Rostedt }
15837a8e76a3SSteven Rostedt 
1584d769041fSSteven Rostedt static struct buffer_page *
1585d769041fSSteven Rostedt rb_get_reader_page(struct ring_buffer_per_cpu *cpu_buffer)
15867a8e76a3SSteven Rostedt {
1587d769041fSSteven Rostedt 	struct buffer_page *reader = NULL;
1588d769041fSSteven Rostedt 	unsigned long flags;
1589818e3dd3SSteven Rostedt 	int nr_loops = 0;
1590d769041fSSteven Rostedt 
15913e03fb7fSSteven Rostedt 	local_irq_save(flags);
15923e03fb7fSSteven Rostedt 	__raw_spin_lock(&cpu_buffer->lock);
1593d769041fSSteven Rostedt 
1594d769041fSSteven Rostedt  again:
1595818e3dd3SSteven Rostedt 	/*
1596818e3dd3SSteven Rostedt 	 * This should normally only loop twice. But because the
1597818e3dd3SSteven Rostedt 	 * start of the reader inserts an empty page, it causes
1598818e3dd3SSteven Rostedt 	 * a case where we will loop three times. There should be no
1599818e3dd3SSteven Rostedt 	 * reason to loop four times (that I know of).
1600818e3dd3SSteven Rostedt 	 */
1601*3e89c7bbSSteven Rostedt 	if (RB_WARN_ON(cpu_buffer, ++nr_loops > 3)) {
1602818e3dd3SSteven Rostedt 		reader = NULL;
1603818e3dd3SSteven Rostedt 		goto out;
1604818e3dd3SSteven Rostedt 	}
1605818e3dd3SSteven Rostedt 
1606d769041fSSteven Rostedt 	reader = cpu_buffer->reader_page;
1607d769041fSSteven Rostedt 
1608d769041fSSteven Rostedt 	/* If there's more to read, return this page */
1609bf41a158SSteven Rostedt 	if (cpu_buffer->reader_page->read < rb_page_size(reader))
1610d769041fSSteven Rostedt 		goto out;
1611d769041fSSteven Rostedt 
1612d769041fSSteven Rostedt 	/* Never should we have an index greater than the size */
1613*3e89c7bbSSteven Rostedt 	if (RB_WARN_ON(cpu_buffer,
1614*3e89c7bbSSteven Rostedt 		       cpu_buffer->reader_page->read > rb_page_size(reader)))
1615*3e89c7bbSSteven Rostedt 		goto out;
1616d769041fSSteven Rostedt 
1617d769041fSSteven Rostedt 	/* check if we caught up to the tail */
1618d769041fSSteven Rostedt 	reader = NULL;
1619bf41a158SSteven Rostedt 	if (cpu_buffer->commit_page == cpu_buffer->reader_page)
1620d769041fSSteven Rostedt 		goto out;
16217a8e76a3SSteven Rostedt 
16227a8e76a3SSteven Rostedt 	/*
1623d769041fSSteven Rostedt 	 * Splice the empty reader page into the list around the head.
1624d769041fSSteven Rostedt 	 * Reset the reader page to size zero.
16257a8e76a3SSteven Rostedt 	 */
1626d769041fSSteven Rostedt 
1627d769041fSSteven Rostedt 	reader = cpu_buffer->head_page;
1628d769041fSSteven Rostedt 	cpu_buffer->reader_page->list.next = reader->list.next;
1629d769041fSSteven Rostedt 	cpu_buffer->reader_page->list.prev = reader->list.prev;
1630bf41a158SSteven Rostedt 
1631bf41a158SSteven Rostedt 	local_set(&cpu_buffer->reader_page->write, 0);
1632bf41a158SSteven Rostedt 	local_set(&cpu_buffer->reader_page->commit, 0);
1633d769041fSSteven Rostedt 
1634d769041fSSteven Rostedt 	/* Make the reader page now replace the head */
1635d769041fSSteven Rostedt 	reader->list.prev->next = &cpu_buffer->reader_page->list;
1636d769041fSSteven Rostedt 	reader->list.next->prev = &cpu_buffer->reader_page->list;
1637d769041fSSteven Rostedt 
1638d769041fSSteven Rostedt 	/*
1639d769041fSSteven Rostedt 	 * If the tail is on the reader, then we must set the head
1640d769041fSSteven Rostedt 	 * to the inserted page, otherwise we set it one before.
1641d769041fSSteven Rostedt 	 */
1642d769041fSSteven Rostedt 	cpu_buffer->head_page = cpu_buffer->reader_page;
1643d769041fSSteven Rostedt 
1644bf41a158SSteven Rostedt 	if (cpu_buffer->commit_page != reader)
16457a8e76a3SSteven Rostedt 		rb_inc_page(cpu_buffer, &cpu_buffer->head_page);
1646d769041fSSteven Rostedt 
1647d769041fSSteven Rostedt 	/* Finally update the reader page to the new head */
1648d769041fSSteven Rostedt 	cpu_buffer->reader_page = reader;
1649d769041fSSteven Rostedt 	rb_reset_reader_page(cpu_buffer);
1650d769041fSSteven Rostedt 
1651d769041fSSteven Rostedt 	goto again;
1652d769041fSSteven Rostedt 
1653d769041fSSteven Rostedt  out:
16543e03fb7fSSteven Rostedt 	__raw_spin_unlock(&cpu_buffer->lock);
16553e03fb7fSSteven Rostedt 	local_irq_restore(flags);
1656d769041fSSteven Rostedt 
1657d769041fSSteven Rostedt 	return reader;
16587a8e76a3SSteven Rostedt }
16597a8e76a3SSteven Rostedt 
1660d769041fSSteven Rostedt static void rb_advance_reader(struct ring_buffer_per_cpu *cpu_buffer)
1661d769041fSSteven Rostedt {
1662d769041fSSteven Rostedt 	struct ring_buffer_event *event;
1663d769041fSSteven Rostedt 	struct buffer_page *reader;
1664d769041fSSteven Rostedt 	unsigned length;
1665d769041fSSteven Rostedt 
1666d769041fSSteven Rostedt 	reader = rb_get_reader_page(cpu_buffer);
1667d769041fSSteven Rostedt 
1668d769041fSSteven Rostedt 	/* This function should not be called when buffer is empty */
1669*3e89c7bbSSteven Rostedt 	if (RB_WARN_ON(cpu_buffer, !reader))
1670*3e89c7bbSSteven Rostedt 		return;
1671d769041fSSteven Rostedt 
1672d769041fSSteven Rostedt 	event = rb_reader_event(cpu_buffer);
16737a8e76a3SSteven Rostedt 
16747a8e76a3SSteven Rostedt 	if (event->type == RINGBUF_TYPE_DATA)
16757a8e76a3SSteven Rostedt 		cpu_buffer->entries--;
16767a8e76a3SSteven Rostedt 
16777a8e76a3SSteven Rostedt 	rb_update_read_stamp(cpu_buffer, event);
16787a8e76a3SSteven Rostedt 
1679d769041fSSteven Rostedt 	length = rb_event_length(event);
16806f807acdSSteven Rostedt 	cpu_buffer->reader_page->read += length;
16817a8e76a3SSteven Rostedt }
16827a8e76a3SSteven Rostedt 
16837a8e76a3SSteven Rostedt static void rb_advance_iter(struct ring_buffer_iter *iter)
16847a8e76a3SSteven Rostedt {
16857a8e76a3SSteven Rostedt 	struct ring_buffer *buffer;
16867a8e76a3SSteven Rostedt 	struct ring_buffer_per_cpu *cpu_buffer;
16877a8e76a3SSteven Rostedt 	struct ring_buffer_event *event;
16887a8e76a3SSteven Rostedt 	unsigned length;
16897a8e76a3SSteven Rostedt 
16907a8e76a3SSteven Rostedt 	cpu_buffer = iter->cpu_buffer;
16917a8e76a3SSteven Rostedt 	buffer = cpu_buffer->buffer;
16927a8e76a3SSteven Rostedt 
16937a8e76a3SSteven Rostedt 	/*
16947a8e76a3SSteven Rostedt 	 * Check if we are at the end of the buffer.
16957a8e76a3SSteven Rostedt 	 */
1696bf41a158SSteven Rostedt 	if (iter->head >= rb_page_size(iter->head_page)) {
1697*3e89c7bbSSteven Rostedt 		if (RB_WARN_ON(buffer,
1698*3e89c7bbSSteven Rostedt 			       iter->head_page == cpu_buffer->commit_page))
1699*3e89c7bbSSteven Rostedt 			return;
1700d769041fSSteven Rostedt 		rb_inc_iter(iter);
17017a8e76a3SSteven Rostedt 		return;
17027a8e76a3SSteven Rostedt 	}
17037a8e76a3SSteven Rostedt 
17047a8e76a3SSteven Rostedt 	event = rb_iter_head_event(iter);
17057a8e76a3SSteven Rostedt 
17067a8e76a3SSteven Rostedt 	length = rb_event_length(event);
17077a8e76a3SSteven Rostedt 
17087a8e76a3SSteven Rostedt 	/*
17097a8e76a3SSteven Rostedt 	 * This should not be called to advance the header if we are
17107a8e76a3SSteven Rostedt 	 * at the tail of the buffer.
17117a8e76a3SSteven Rostedt 	 */
1712*3e89c7bbSSteven Rostedt 	if (RB_WARN_ON(cpu_buffer,
1713f536aafcSSteven Rostedt 		       (iter->head_page == cpu_buffer->commit_page) &&
1714*3e89c7bbSSteven Rostedt 		       (iter->head + length > rb_commit_index(cpu_buffer))))
1715*3e89c7bbSSteven Rostedt 		return;
17167a8e76a3SSteven Rostedt 
17177a8e76a3SSteven Rostedt 	rb_update_iter_read_stamp(iter, event);
17187a8e76a3SSteven Rostedt 
17197a8e76a3SSteven Rostedt 	iter->head += length;
17207a8e76a3SSteven Rostedt 
17217a8e76a3SSteven Rostedt 	/* check for end of page padding */
1722bf41a158SSteven Rostedt 	if ((iter->head >= rb_page_size(iter->head_page)) &&
1723bf41a158SSteven Rostedt 	    (iter->head_page != cpu_buffer->commit_page))
17247a8e76a3SSteven Rostedt 		rb_advance_iter(iter);
17257a8e76a3SSteven Rostedt }
17267a8e76a3SSteven Rostedt 
1727f83c9d0fSSteven Rostedt static struct ring_buffer_event *
1728f83c9d0fSSteven Rostedt rb_buffer_peek(struct ring_buffer *buffer, int cpu, u64 *ts)
17297a8e76a3SSteven Rostedt {
17307a8e76a3SSteven Rostedt 	struct ring_buffer_per_cpu *cpu_buffer;
17317a8e76a3SSteven Rostedt 	struct ring_buffer_event *event;
1732d769041fSSteven Rostedt 	struct buffer_page *reader;
1733818e3dd3SSteven Rostedt 	int nr_loops = 0;
17347a8e76a3SSteven Rostedt 
17357a8e76a3SSteven Rostedt 	if (!cpu_isset(cpu, buffer->cpumask))
17367a8e76a3SSteven Rostedt 		return NULL;
17377a8e76a3SSteven Rostedt 
17387a8e76a3SSteven Rostedt 	cpu_buffer = buffer->buffers[cpu];
17397a8e76a3SSteven Rostedt 
17407a8e76a3SSteven Rostedt  again:
1741818e3dd3SSteven Rostedt 	/*
1742818e3dd3SSteven Rostedt 	 * We repeat when a timestamp is encountered. It is possible
1743818e3dd3SSteven Rostedt 	 * to get multiple timestamps from an interrupt entering just
1744818e3dd3SSteven Rostedt 	 * as one timestamp is about to be written. The max times
1745818e3dd3SSteven Rostedt 	 * that this can happen is the number of nested interrupts we
1746818e3dd3SSteven Rostedt 	 * can have.  Nesting 10 deep of interrupts is clearly
1747818e3dd3SSteven Rostedt 	 * an anomaly.
1748818e3dd3SSteven Rostedt 	 */
1749*3e89c7bbSSteven Rostedt 	if (RB_WARN_ON(cpu_buffer, ++nr_loops > 10))
1750818e3dd3SSteven Rostedt 		return NULL;
1751818e3dd3SSteven Rostedt 
1752d769041fSSteven Rostedt 	reader = rb_get_reader_page(cpu_buffer);
1753d769041fSSteven Rostedt 	if (!reader)
17547a8e76a3SSteven Rostedt 		return NULL;
17557a8e76a3SSteven Rostedt 
1756d769041fSSteven Rostedt 	event = rb_reader_event(cpu_buffer);
17577a8e76a3SSteven Rostedt 
17587a8e76a3SSteven Rostedt 	switch (event->type) {
17597a8e76a3SSteven Rostedt 	case RINGBUF_TYPE_PADDING:
1760bf41a158SSteven Rostedt 		RB_WARN_ON(cpu_buffer, 1);
1761d769041fSSteven Rostedt 		rb_advance_reader(cpu_buffer);
1762d769041fSSteven Rostedt 		return NULL;
17637a8e76a3SSteven Rostedt 
17647a8e76a3SSteven Rostedt 	case RINGBUF_TYPE_TIME_EXTEND:
17657a8e76a3SSteven Rostedt 		/* Internal data, OK to advance */
1766d769041fSSteven Rostedt 		rb_advance_reader(cpu_buffer);
17677a8e76a3SSteven Rostedt 		goto again;
17687a8e76a3SSteven Rostedt 
17697a8e76a3SSteven Rostedt 	case RINGBUF_TYPE_TIME_STAMP:
17707a8e76a3SSteven Rostedt 		/* FIXME: not implemented */
1771d769041fSSteven Rostedt 		rb_advance_reader(cpu_buffer);
17727a8e76a3SSteven Rostedt 		goto again;
17737a8e76a3SSteven Rostedt 
17747a8e76a3SSteven Rostedt 	case RINGBUF_TYPE_DATA:
17757a8e76a3SSteven Rostedt 		if (ts) {
17767a8e76a3SSteven Rostedt 			*ts = cpu_buffer->read_stamp + event->time_delta;
17777a8e76a3SSteven Rostedt 			ring_buffer_normalize_time_stamp(cpu_buffer->cpu, ts);
17787a8e76a3SSteven Rostedt 		}
17797a8e76a3SSteven Rostedt 		return event;
17807a8e76a3SSteven Rostedt 
17817a8e76a3SSteven Rostedt 	default:
17827a8e76a3SSteven Rostedt 		BUG();
17837a8e76a3SSteven Rostedt 	}
17847a8e76a3SSteven Rostedt 
17857a8e76a3SSteven Rostedt 	return NULL;
17867a8e76a3SSteven Rostedt }
17877a8e76a3SSteven Rostedt 
1788f83c9d0fSSteven Rostedt static struct ring_buffer_event *
1789f83c9d0fSSteven Rostedt rb_iter_peek(struct ring_buffer_iter *iter, u64 *ts)
17907a8e76a3SSteven Rostedt {
17917a8e76a3SSteven Rostedt 	struct ring_buffer *buffer;
17927a8e76a3SSteven Rostedt 	struct ring_buffer_per_cpu *cpu_buffer;
17937a8e76a3SSteven Rostedt 	struct ring_buffer_event *event;
1794818e3dd3SSteven Rostedt 	int nr_loops = 0;
17957a8e76a3SSteven Rostedt 
17967a8e76a3SSteven Rostedt 	if (ring_buffer_iter_empty(iter))
17977a8e76a3SSteven Rostedt 		return NULL;
17987a8e76a3SSteven Rostedt 
17997a8e76a3SSteven Rostedt 	cpu_buffer = iter->cpu_buffer;
18007a8e76a3SSteven Rostedt 	buffer = cpu_buffer->buffer;
18017a8e76a3SSteven Rostedt 
18027a8e76a3SSteven Rostedt  again:
1803818e3dd3SSteven Rostedt 	/*
1804818e3dd3SSteven Rostedt 	 * We repeat when a timestamp is encountered. It is possible
1805818e3dd3SSteven Rostedt 	 * to get multiple timestamps from an interrupt entering just
1806818e3dd3SSteven Rostedt 	 * as one timestamp is about to be written. The max times
1807818e3dd3SSteven Rostedt 	 * that this can happen is the number of nested interrupts we
1808818e3dd3SSteven Rostedt 	 * can have. Nesting 10 deep of interrupts is clearly
1809818e3dd3SSteven Rostedt 	 * an anomaly.
1810818e3dd3SSteven Rostedt 	 */
1811*3e89c7bbSSteven Rostedt 	if (RB_WARN_ON(cpu_buffer, ++nr_loops > 10))
1812818e3dd3SSteven Rostedt 		return NULL;
1813818e3dd3SSteven Rostedt 
18147a8e76a3SSteven Rostedt 	if (rb_per_cpu_empty(cpu_buffer))
18157a8e76a3SSteven Rostedt 		return NULL;
18167a8e76a3SSteven Rostedt 
18177a8e76a3SSteven Rostedt 	event = rb_iter_head_event(iter);
18187a8e76a3SSteven Rostedt 
18197a8e76a3SSteven Rostedt 	switch (event->type) {
18207a8e76a3SSteven Rostedt 	case RINGBUF_TYPE_PADDING:
1821d769041fSSteven Rostedt 		rb_inc_iter(iter);
18227a8e76a3SSteven Rostedt 		goto again;
18237a8e76a3SSteven Rostedt 
18247a8e76a3SSteven Rostedt 	case RINGBUF_TYPE_TIME_EXTEND:
18257a8e76a3SSteven Rostedt 		/* Internal data, OK to advance */
18267a8e76a3SSteven Rostedt 		rb_advance_iter(iter);
18277a8e76a3SSteven Rostedt 		goto again;
18287a8e76a3SSteven Rostedt 
18297a8e76a3SSteven Rostedt 	case RINGBUF_TYPE_TIME_STAMP:
18307a8e76a3SSteven Rostedt 		/* FIXME: not implemented */
18317a8e76a3SSteven Rostedt 		rb_advance_iter(iter);
18327a8e76a3SSteven Rostedt 		goto again;
18337a8e76a3SSteven Rostedt 
18347a8e76a3SSteven Rostedt 	case RINGBUF_TYPE_DATA:
18357a8e76a3SSteven Rostedt 		if (ts) {
18367a8e76a3SSteven Rostedt 			*ts = iter->read_stamp + event->time_delta;
18377a8e76a3SSteven Rostedt 			ring_buffer_normalize_time_stamp(cpu_buffer->cpu, ts);
18387a8e76a3SSteven Rostedt 		}
18397a8e76a3SSteven Rostedt 		return event;
18407a8e76a3SSteven Rostedt 
18417a8e76a3SSteven Rostedt 	default:
18427a8e76a3SSteven Rostedt 		BUG();
18437a8e76a3SSteven Rostedt 	}
18447a8e76a3SSteven Rostedt 
18457a8e76a3SSteven Rostedt 	return NULL;
18467a8e76a3SSteven Rostedt }
18477a8e76a3SSteven Rostedt 
18487a8e76a3SSteven Rostedt /**
1849f83c9d0fSSteven Rostedt  * ring_buffer_peek - peek at the next event to be read
1850f83c9d0fSSteven Rostedt  * @buffer: The ring buffer to read
1851f83c9d0fSSteven Rostedt  * @cpu: The cpu to peak at
1852f83c9d0fSSteven Rostedt  * @ts: The timestamp counter of this event.
1853f83c9d0fSSteven Rostedt  *
1854f83c9d0fSSteven Rostedt  * This will return the event that will be read next, but does
1855f83c9d0fSSteven Rostedt  * not consume the data.
1856f83c9d0fSSteven Rostedt  */
1857f83c9d0fSSteven Rostedt struct ring_buffer_event *
1858f83c9d0fSSteven Rostedt ring_buffer_peek(struct ring_buffer *buffer, int cpu, u64 *ts)
1859f83c9d0fSSteven Rostedt {
1860f83c9d0fSSteven Rostedt 	struct ring_buffer_per_cpu *cpu_buffer = buffer->buffers[cpu];
1861f83c9d0fSSteven Rostedt 	struct ring_buffer_event *event;
1862f83c9d0fSSteven Rostedt 	unsigned long flags;
1863f83c9d0fSSteven Rostedt 
1864f83c9d0fSSteven Rostedt 	spin_lock_irqsave(&cpu_buffer->reader_lock, flags);
1865f83c9d0fSSteven Rostedt 	event = rb_buffer_peek(buffer, cpu, ts);
1866f83c9d0fSSteven Rostedt 	spin_unlock_irqrestore(&cpu_buffer->reader_lock, flags);
1867f83c9d0fSSteven Rostedt 
1868f83c9d0fSSteven Rostedt 	return event;
1869f83c9d0fSSteven Rostedt }
1870f83c9d0fSSteven Rostedt 
1871f83c9d0fSSteven Rostedt /**
1872f83c9d0fSSteven Rostedt  * ring_buffer_iter_peek - peek at the next event to be read
1873f83c9d0fSSteven Rostedt  * @iter: The ring buffer iterator
1874f83c9d0fSSteven Rostedt  * @ts: The timestamp counter of this event.
1875f83c9d0fSSteven Rostedt  *
1876f83c9d0fSSteven Rostedt  * This will return the event that will be read next, but does
1877f83c9d0fSSteven Rostedt  * not increment the iterator.
1878f83c9d0fSSteven Rostedt  */
1879f83c9d0fSSteven Rostedt struct ring_buffer_event *
1880f83c9d0fSSteven Rostedt ring_buffer_iter_peek(struct ring_buffer_iter *iter, u64 *ts)
1881f83c9d0fSSteven Rostedt {
1882f83c9d0fSSteven Rostedt 	struct ring_buffer_per_cpu *cpu_buffer = iter->cpu_buffer;
1883f83c9d0fSSteven Rostedt 	struct ring_buffer_event *event;
1884f83c9d0fSSteven Rostedt 	unsigned long flags;
1885f83c9d0fSSteven Rostedt 
1886f83c9d0fSSteven Rostedt 	spin_lock_irqsave(&cpu_buffer->reader_lock, flags);
1887f83c9d0fSSteven Rostedt 	event = rb_iter_peek(iter, ts);
1888f83c9d0fSSteven Rostedt 	spin_unlock_irqrestore(&cpu_buffer->reader_lock, flags);
1889f83c9d0fSSteven Rostedt 
1890f83c9d0fSSteven Rostedt 	return event;
1891f83c9d0fSSteven Rostedt }
1892f83c9d0fSSteven Rostedt 
1893f83c9d0fSSteven Rostedt /**
18947a8e76a3SSteven Rostedt  * ring_buffer_consume - return an event and consume it
18957a8e76a3SSteven Rostedt  * @buffer: The ring buffer to get the next event from
18967a8e76a3SSteven Rostedt  *
18977a8e76a3SSteven Rostedt  * Returns the next event in the ring buffer, and that event is consumed.
18987a8e76a3SSteven Rostedt  * Meaning, that sequential reads will keep returning a different event,
18997a8e76a3SSteven Rostedt  * and eventually empty the ring buffer if the producer is slower.
19007a8e76a3SSteven Rostedt  */
19017a8e76a3SSteven Rostedt struct ring_buffer_event *
19027a8e76a3SSteven Rostedt ring_buffer_consume(struct ring_buffer *buffer, int cpu, u64 *ts)
19037a8e76a3SSteven Rostedt {
1904f83c9d0fSSteven Rostedt 	struct ring_buffer_per_cpu *cpu_buffer = buffer->buffers[cpu];
19057a8e76a3SSteven Rostedt 	struct ring_buffer_event *event;
1906f83c9d0fSSteven Rostedt 	unsigned long flags;
19077a8e76a3SSteven Rostedt 
19087a8e76a3SSteven Rostedt 	if (!cpu_isset(cpu, buffer->cpumask))
19097a8e76a3SSteven Rostedt 		return NULL;
19107a8e76a3SSteven Rostedt 
1911f83c9d0fSSteven Rostedt 	spin_lock_irqsave(&cpu_buffer->reader_lock, flags);
19127a8e76a3SSteven Rostedt 
1913f83c9d0fSSteven Rostedt 	event = rb_buffer_peek(buffer, cpu, ts);
1914f83c9d0fSSteven Rostedt 	if (!event)
1915f83c9d0fSSteven Rostedt 		goto out;
1916f83c9d0fSSteven Rostedt 
1917d769041fSSteven Rostedt 	rb_advance_reader(cpu_buffer);
19187a8e76a3SSteven Rostedt 
1919f83c9d0fSSteven Rostedt  out:
1920f83c9d0fSSteven Rostedt 	spin_unlock_irqrestore(&cpu_buffer->reader_lock, flags);
1921f83c9d0fSSteven Rostedt 
19227a8e76a3SSteven Rostedt 	return event;
19237a8e76a3SSteven Rostedt }
19247a8e76a3SSteven Rostedt 
19257a8e76a3SSteven Rostedt /**
19267a8e76a3SSteven Rostedt  * ring_buffer_read_start - start a non consuming read of the buffer
19277a8e76a3SSteven Rostedt  * @buffer: The ring buffer to read from
19287a8e76a3SSteven Rostedt  * @cpu: The cpu buffer to iterate over
19297a8e76a3SSteven Rostedt  *
19307a8e76a3SSteven Rostedt  * This starts up an iteration through the buffer. It also disables
19317a8e76a3SSteven Rostedt  * the recording to the buffer until the reading is finished.
19327a8e76a3SSteven Rostedt  * This prevents the reading from being corrupted. This is not
19337a8e76a3SSteven Rostedt  * a consuming read, so a producer is not expected.
19347a8e76a3SSteven Rostedt  *
19357a8e76a3SSteven Rostedt  * Must be paired with ring_buffer_finish.
19367a8e76a3SSteven Rostedt  */
19377a8e76a3SSteven Rostedt struct ring_buffer_iter *
19387a8e76a3SSteven Rostedt ring_buffer_read_start(struct ring_buffer *buffer, int cpu)
19397a8e76a3SSteven Rostedt {
19407a8e76a3SSteven Rostedt 	struct ring_buffer_per_cpu *cpu_buffer;
19417a8e76a3SSteven Rostedt 	struct ring_buffer_iter *iter;
1942d769041fSSteven Rostedt 	unsigned long flags;
19437a8e76a3SSteven Rostedt 
19447a8e76a3SSteven Rostedt 	if (!cpu_isset(cpu, buffer->cpumask))
19457a8e76a3SSteven Rostedt 		return NULL;
19467a8e76a3SSteven Rostedt 
19477a8e76a3SSteven Rostedt 	iter = kmalloc(sizeof(*iter), GFP_KERNEL);
19487a8e76a3SSteven Rostedt 	if (!iter)
19497a8e76a3SSteven Rostedt 		return NULL;
19507a8e76a3SSteven Rostedt 
19517a8e76a3SSteven Rostedt 	cpu_buffer = buffer->buffers[cpu];
19527a8e76a3SSteven Rostedt 
19537a8e76a3SSteven Rostedt 	iter->cpu_buffer = cpu_buffer;
19547a8e76a3SSteven Rostedt 
19557a8e76a3SSteven Rostedt 	atomic_inc(&cpu_buffer->record_disabled);
19567a8e76a3SSteven Rostedt 	synchronize_sched();
19577a8e76a3SSteven Rostedt 
1958f83c9d0fSSteven Rostedt 	spin_lock_irqsave(&cpu_buffer->reader_lock, flags);
19593e03fb7fSSteven Rostedt 	__raw_spin_lock(&cpu_buffer->lock);
1960d769041fSSteven Rostedt 	ring_buffer_iter_reset(iter);
19613e03fb7fSSteven Rostedt 	__raw_spin_unlock(&cpu_buffer->lock);
1962f83c9d0fSSteven Rostedt 	spin_unlock_irqrestore(&cpu_buffer->reader_lock, flags);
19637a8e76a3SSteven Rostedt 
19647a8e76a3SSteven Rostedt 	return iter;
19657a8e76a3SSteven Rostedt }
19667a8e76a3SSteven Rostedt 
19677a8e76a3SSteven Rostedt /**
19687a8e76a3SSteven Rostedt  * ring_buffer_finish - finish reading the iterator of the buffer
19697a8e76a3SSteven Rostedt  * @iter: The iterator retrieved by ring_buffer_start
19707a8e76a3SSteven Rostedt  *
19717a8e76a3SSteven Rostedt  * This re-enables the recording to the buffer, and frees the
19727a8e76a3SSteven Rostedt  * iterator.
19737a8e76a3SSteven Rostedt  */
19747a8e76a3SSteven Rostedt void
19757a8e76a3SSteven Rostedt ring_buffer_read_finish(struct ring_buffer_iter *iter)
19767a8e76a3SSteven Rostedt {
19777a8e76a3SSteven Rostedt 	struct ring_buffer_per_cpu *cpu_buffer = iter->cpu_buffer;
19787a8e76a3SSteven Rostedt 
19797a8e76a3SSteven Rostedt 	atomic_dec(&cpu_buffer->record_disabled);
19807a8e76a3SSteven Rostedt 	kfree(iter);
19817a8e76a3SSteven Rostedt }
19827a8e76a3SSteven Rostedt 
19837a8e76a3SSteven Rostedt /**
19847a8e76a3SSteven Rostedt  * ring_buffer_read - read the next item in the ring buffer by the iterator
19857a8e76a3SSteven Rostedt  * @iter: The ring buffer iterator
19867a8e76a3SSteven Rostedt  * @ts: The time stamp of the event read.
19877a8e76a3SSteven Rostedt  *
19887a8e76a3SSteven Rostedt  * This reads the next event in the ring buffer and increments the iterator.
19897a8e76a3SSteven Rostedt  */
19907a8e76a3SSteven Rostedt struct ring_buffer_event *
19917a8e76a3SSteven Rostedt ring_buffer_read(struct ring_buffer_iter *iter, u64 *ts)
19927a8e76a3SSteven Rostedt {
19937a8e76a3SSteven Rostedt 	struct ring_buffer_event *event;
1994f83c9d0fSSteven Rostedt 	struct ring_buffer_per_cpu *cpu_buffer = iter->cpu_buffer;
1995f83c9d0fSSteven Rostedt 	unsigned long flags;
19967a8e76a3SSteven Rostedt 
1997f83c9d0fSSteven Rostedt 	spin_lock_irqsave(&cpu_buffer->reader_lock, flags);
1998f83c9d0fSSteven Rostedt 	event = rb_iter_peek(iter, ts);
19997a8e76a3SSteven Rostedt 	if (!event)
2000f83c9d0fSSteven Rostedt 		goto out;
20017a8e76a3SSteven Rostedt 
20027a8e76a3SSteven Rostedt 	rb_advance_iter(iter);
2003f83c9d0fSSteven Rostedt  out:
2004f83c9d0fSSteven Rostedt 	spin_unlock_irqrestore(&cpu_buffer->reader_lock, flags);
20057a8e76a3SSteven Rostedt 
20067a8e76a3SSteven Rostedt 	return event;
20077a8e76a3SSteven Rostedt }
20087a8e76a3SSteven Rostedt 
20097a8e76a3SSteven Rostedt /**
20107a8e76a3SSteven Rostedt  * ring_buffer_size - return the size of the ring buffer (in bytes)
20117a8e76a3SSteven Rostedt  * @buffer: The ring buffer.
20127a8e76a3SSteven Rostedt  */
20137a8e76a3SSteven Rostedt unsigned long ring_buffer_size(struct ring_buffer *buffer)
20147a8e76a3SSteven Rostedt {
20157a8e76a3SSteven Rostedt 	return BUF_PAGE_SIZE * buffer->pages;
20167a8e76a3SSteven Rostedt }
20177a8e76a3SSteven Rostedt 
20187a8e76a3SSteven Rostedt static void
20197a8e76a3SSteven Rostedt rb_reset_cpu(struct ring_buffer_per_cpu *cpu_buffer)
20207a8e76a3SSteven Rostedt {
20217a8e76a3SSteven Rostedt 	cpu_buffer->head_page
20227a8e76a3SSteven Rostedt 		= list_entry(cpu_buffer->pages.next, struct buffer_page, list);
2023bf41a158SSteven Rostedt 	local_set(&cpu_buffer->head_page->write, 0);
2024bf41a158SSteven Rostedt 	local_set(&cpu_buffer->head_page->commit, 0);
20257a8e76a3SSteven Rostedt 
20266f807acdSSteven Rostedt 	cpu_buffer->head_page->read = 0;
2027bf41a158SSteven Rostedt 
2028bf41a158SSteven Rostedt 	cpu_buffer->tail_page = cpu_buffer->head_page;
2029bf41a158SSteven Rostedt 	cpu_buffer->commit_page = cpu_buffer->head_page;
2030bf41a158SSteven Rostedt 
2031bf41a158SSteven Rostedt 	INIT_LIST_HEAD(&cpu_buffer->reader_page->list);
2032bf41a158SSteven Rostedt 	local_set(&cpu_buffer->reader_page->write, 0);
2033bf41a158SSteven Rostedt 	local_set(&cpu_buffer->reader_page->commit, 0);
20346f807acdSSteven Rostedt 	cpu_buffer->reader_page->read = 0;
2035d769041fSSteven Rostedt 
20367a8e76a3SSteven Rostedt 	cpu_buffer->overrun = 0;
20377a8e76a3SSteven Rostedt 	cpu_buffer->entries = 0;
20387a8e76a3SSteven Rostedt }
20397a8e76a3SSteven Rostedt 
20407a8e76a3SSteven Rostedt /**
20417a8e76a3SSteven Rostedt  * ring_buffer_reset_cpu - reset a ring buffer per CPU buffer
20427a8e76a3SSteven Rostedt  * @buffer: The ring buffer to reset a per cpu buffer of
20437a8e76a3SSteven Rostedt  * @cpu: The CPU buffer to be reset
20447a8e76a3SSteven Rostedt  */
20457a8e76a3SSteven Rostedt void ring_buffer_reset_cpu(struct ring_buffer *buffer, int cpu)
20467a8e76a3SSteven Rostedt {
20477a8e76a3SSteven Rostedt 	struct ring_buffer_per_cpu *cpu_buffer = buffer->buffers[cpu];
20487a8e76a3SSteven Rostedt 	unsigned long flags;
20497a8e76a3SSteven Rostedt 
20507a8e76a3SSteven Rostedt 	if (!cpu_isset(cpu, buffer->cpumask))
20517a8e76a3SSteven Rostedt 		return;
20527a8e76a3SSteven Rostedt 
2053f83c9d0fSSteven Rostedt 	spin_lock_irqsave(&cpu_buffer->reader_lock, flags);
2054f83c9d0fSSteven Rostedt 
20553e03fb7fSSteven Rostedt 	__raw_spin_lock(&cpu_buffer->lock);
20567a8e76a3SSteven Rostedt 
20577a8e76a3SSteven Rostedt 	rb_reset_cpu(cpu_buffer);
20587a8e76a3SSteven Rostedt 
20593e03fb7fSSteven Rostedt 	__raw_spin_unlock(&cpu_buffer->lock);
2060f83c9d0fSSteven Rostedt 
2061f83c9d0fSSteven Rostedt 	spin_unlock_irqrestore(&cpu_buffer->reader_lock, flags);
20627a8e76a3SSteven Rostedt }
20637a8e76a3SSteven Rostedt 
20647a8e76a3SSteven Rostedt /**
20657a8e76a3SSteven Rostedt  * ring_buffer_reset - reset a ring buffer
20667a8e76a3SSteven Rostedt  * @buffer: The ring buffer to reset all cpu buffers
20677a8e76a3SSteven Rostedt  */
20687a8e76a3SSteven Rostedt void ring_buffer_reset(struct ring_buffer *buffer)
20697a8e76a3SSteven Rostedt {
20707a8e76a3SSteven Rostedt 	int cpu;
20717a8e76a3SSteven Rostedt 
20727a8e76a3SSteven Rostedt 	for_each_buffer_cpu(buffer, cpu)
2073d769041fSSteven Rostedt 		ring_buffer_reset_cpu(buffer, cpu);
20747a8e76a3SSteven Rostedt }
20757a8e76a3SSteven Rostedt 
20767a8e76a3SSteven Rostedt /**
20777a8e76a3SSteven Rostedt  * rind_buffer_empty - is the ring buffer empty?
20787a8e76a3SSteven Rostedt  * @buffer: The ring buffer to test
20797a8e76a3SSteven Rostedt  */
20807a8e76a3SSteven Rostedt int ring_buffer_empty(struct ring_buffer *buffer)
20817a8e76a3SSteven Rostedt {
20827a8e76a3SSteven Rostedt 	struct ring_buffer_per_cpu *cpu_buffer;
20837a8e76a3SSteven Rostedt 	int cpu;
20847a8e76a3SSteven Rostedt 
20857a8e76a3SSteven Rostedt 	/* yes this is racy, but if you don't like the race, lock the buffer */
20867a8e76a3SSteven Rostedt 	for_each_buffer_cpu(buffer, cpu) {
20877a8e76a3SSteven Rostedt 		cpu_buffer = buffer->buffers[cpu];
20887a8e76a3SSteven Rostedt 		if (!rb_per_cpu_empty(cpu_buffer))
20897a8e76a3SSteven Rostedt 			return 0;
20907a8e76a3SSteven Rostedt 	}
20917a8e76a3SSteven Rostedt 	return 1;
20927a8e76a3SSteven Rostedt }
20937a8e76a3SSteven Rostedt 
20947a8e76a3SSteven Rostedt /**
20957a8e76a3SSteven Rostedt  * ring_buffer_empty_cpu - is a cpu buffer of a ring buffer empty?
20967a8e76a3SSteven Rostedt  * @buffer: The ring buffer
20977a8e76a3SSteven Rostedt  * @cpu: The CPU buffer to test
20987a8e76a3SSteven Rostedt  */
20997a8e76a3SSteven Rostedt int ring_buffer_empty_cpu(struct ring_buffer *buffer, int cpu)
21007a8e76a3SSteven Rostedt {
21017a8e76a3SSteven Rostedt 	struct ring_buffer_per_cpu *cpu_buffer;
21027a8e76a3SSteven Rostedt 
21037a8e76a3SSteven Rostedt 	if (!cpu_isset(cpu, buffer->cpumask))
21047a8e76a3SSteven Rostedt 		return 1;
21057a8e76a3SSteven Rostedt 
21067a8e76a3SSteven Rostedt 	cpu_buffer = buffer->buffers[cpu];
21077a8e76a3SSteven Rostedt 	return rb_per_cpu_empty(cpu_buffer);
21087a8e76a3SSteven Rostedt }
21097a8e76a3SSteven Rostedt 
21107a8e76a3SSteven Rostedt /**
21117a8e76a3SSteven Rostedt  * ring_buffer_swap_cpu - swap a CPU buffer between two ring buffers
21127a8e76a3SSteven Rostedt  * @buffer_a: One buffer to swap with
21137a8e76a3SSteven Rostedt  * @buffer_b: The other buffer to swap with
21147a8e76a3SSteven Rostedt  *
21157a8e76a3SSteven Rostedt  * This function is useful for tracers that want to take a "snapshot"
21167a8e76a3SSteven Rostedt  * of a CPU buffer and has another back up buffer lying around.
21177a8e76a3SSteven Rostedt  * it is expected that the tracer handles the cpu buffer not being
21187a8e76a3SSteven Rostedt  * used at the moment.
21197a8e76a3SSteven Rostedt  */
21207a8e76a3SSteven Rostedt int ring_buffer_swap_cpu(struct ring_buffer *buffer_a,
21217a8e76a3SSteven Rostedt 			 struct ring_buffer *buffer_b, int cpu)
21227a8e76a3SSteven Rostedt {
21237a8e76a3SSteven Rostedt 	struct ring_buffer_per_cpu *cpu_buffer_a;
21247a8e76a3SSteven Rostedt 	struct ring_buffer_per_cpu *cpu_buffer_b;
21257a8e76a3SSteven Rostedt 
21267a8e76a3SSteven Rostedt 	if (!cpu_isset(cpu, buffer_a->cpumask) ||
21277a8e76a3SSteven Rostedt 	    !cpu_isset(cpu, buffer_b->cpumask))
21287a8e76a3SSteven Rostedt 		return -EINVAL;
21297a8e76a3SSteven Rostedt 
21307a8e76a3SSteven Rostedt 	/* At least make sure the two buffers are somewhat the same */
21317a8e76a3SSteven Rostedt 	if (buffer_a->size != buffer_b->size ||
21327a8e76a3SSteven Rostedt 	    buffer_a->pages != buffer_b->pages)
21337a8e76a3SSteven Rostedt 		return -EINVAL;
21347a8e76a3SSteven Rostedt 
21357a8e76a3SSteven Rostedt 	cpu_buffer_a = buffer_a->buffers[cpu];
21367a8e76a3SSteven Rostedt 	cpu_buffer_b = buffer_b->buffers[cpu];
21377a8e76a3SSteven Rostedt 
21387a8e76a3SSteven Rostedt 	/*
21397a8e76a3SSteven Rostedt 	 * We can't do a synchronize_sched here because this
21407a8e76a3SSteven Rostedt 	 * function can be called in atomic context.
21417a8e76a3SSteven Rostedt 	 * Normally this will be called from the same CPU as cpu.
21427a8e76a3SSteven Rostedt 	 * If not it's up to the caller to protect this.
21437a8e76a3SSteven Rostedt 	 */
21447a8e76a3SSteven Rostedt 	atomic_inc(&cpu_buffer_a->record_disabled);
21457a8e76a3SSteven Rostedt 	atomic_inc(&cpu_buffer_b->record_disabled);
21467a8e76a3SSteven Rostedt 
21477a8e76a3SSteven Rostedt 	buffer_a->buffers[cpu] = cpu_buffer_b;
21487a8e76a3SSteven Rostedt 	buffer_b->buffers[cpu] = cpu_buffer_a;
21497a8e76a3SSteven Rostedt 
21507a8e76a3SSteven Rostedt 	cpu_buffer_b->buffer = buffer_a;
21517a8e76a3SSteven Rostedt 	cpu_buffer_a->buffer = buffer_b;
21527a8e76a3SSteven Rostedt 
21537a8e76a3SSteven Rostedt 	atomic_dec(&cpu_buffer_a->record_disabled);
21547a8e76a3SSteven Rostedt 	atomic_dec(&cpu_buffer_b->record_disabled);
21557a8e76a3SSteven Rostedt 
21567a8e76a3SSteven Rostedt 	return 0;
21577a8e76a3SSteven Rostedt }
21587a8e76a3SSteven Rostedt 
2159a3583244SSteven Rostedt static ssize_t
2160a3583244SSteven Rostedt rb_simple_read(struct file *filp, char __user *ubuf,
2161a3583244SSteven Rostedt 	       size_t cnt, loff_t *ppos)
2162a3583244SSteven Rostedt {
2163a3583244SSteven Rostedt 	int *p = filp->private_data;
2164a3583244SSteven Rostedt 	char buf[64];
2165a3583244SSteven Rostedt 	int r;
2166a3583244SSteven Rostedt 
2167a3583244SSteven Rostedt 	/* !ring_buffers_off == tracing_on */
2168a3583244SSteven Rostedt 	r = sprintf(buf, "%d\n", !*p);
2169a3583244SSteven Rostedt 
2170a3583244SSteven Rostedt 	return simple_read_from_buffer(ubuf, cnt, ppos, buf, r);
2171a3583244SSteven Rostedt }
2172a3583244SSteven Rostedt 
2173a3583244SSteven Rostedt static ssize_t
2174a3583244SSteven Rostedt rb_simple_write(struct file *filp, const char __user *ubuf,
2175a3583244SSteven Rostedt 		size_t cnt, loff_t *ppos)
2176a3583244SSteven Rostedt {
2177a3583244SSteven Rostedt 	int *p = filp->private_data;
2178a3583244SSteven Rostedt 	char buf[64];
2179a3583244SSteven Rostedt 	long val;
2180a3583244SSteven Rostedt 	int ret;
2181a3583244SSteven Rostedt 
2182a3583244SSteven Rostedt 	if (cnt >= sizeof(buf))
2183a3583244SSteven Rostedt 		return -EINVAL;
2184a3583244SSteven Rostedt 
2185a3583244SSteven Rostedt 	if (copy_from_user(&buf, ubuf, cnt))
2186a3583244SSteven Rostedt 		return -EFAULT;
2187a3583244SSteven Rostedt 
2188a3583244SSteven Rostedt 	buf[cnt] = 0;
2189a3583244SSteven Rostedt 
2190a3583244SSteven Rostedt 	ret = strict_strtoul(buf, 10, &val);
2191a3583244SSteven Rostedt 	if (ret < 0)
2192a3583244SSteven Rostedt 		return ret;
2193a3583244SSteven Rostedt 
2194a3583244SSteven Rostedt 	/* !ring_buffers_off == tracing_on */
2195a3583244SSteven Rostedt 	*p = !val;
2196a3583244SSteven Rostedt 
2197a3583244SSteven Rostedt 	(*ppos)++;
2198a3583244SSteven Rostedt 
2199a3583244SSteven Rostedt 	return cnt;
2200a3583244SSteven Rostedt }
2201a3583244SSteven Rostedt 
2202a3583244SSteven Rostedt static struct file_operations rb_simple_fops = {
2203a3583244SSteven Rostedt 	.open		= tracing_open_generic,
2204a3583244SSteven Rostedt 	.read		= rb_simple_read,
2205a3583244SSteven Rostedt 	.write		= rb_simple_write,
2206a3583244SSteven Rostedt };
2207a3583244SSteven Rostedt 
2208a3583244SSteven Rostedt 
2209a3583244SSteven Rostedt static __init int rb_init_debugfs(void)
2210a3583244SSteven Rostedt {
2211a3583244SSteven Rostedt 	struct dentry *d_tracer;
2212a3583244SSteven Rostedt 	struct dentry *entry;
2213a3583244SSteven Rostedt 
2214a3583244SSteven Rostedt 	d_tracer = tracing_init_dentry();
2215a3583244SSteven Rostedt 
2216a3583244SSteven Rostedt 	entry = debugfs_create_file("tracing_on", 0644, d_tracer,
2217a3583244SSteven Rostedt 				    &ring_buffers_off, &rb_simple_fops);
2218a3583244SSteven Rostedt 	if (!entry)
2219a3583244SSteven Rostedt 		pr_warning("Could not create debugfs 'tracing_on' entry\n");
2220a3583244SSteven Rostedt 
2221a3583244SSteven Rostedt 	return 0;
2222a3583244SSteven Rostedt }
2223a3583244SSteven Rostedt 
2224a3583244SSteven Rostedt fs_initcall(rb_init_debugfs);
2225