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