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