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