aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/perf_event.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/perf_event.c')
-rw-r--r--kernel/perf_event.c465
1 files changed, 239 insertions, 226 deletions
diff --git a/kernel/perf_event.c b/kernel/perf_event.c
index 31d6afe92594..403d1804b198 100644
--- a/kernel/perf_event.c
+++ b/kernel/perf_event.c
@@ -214,7 +214,7 @@ static void perf_unpin_context(struct perf_event_context *ctx)
214 214
215static inline u64 perf_clock(void) 215static inline u64 perf_clock(void)
216{ 216{
217 return cpu_clock(raw_smp_processor_id()); 217 return local_clock();
218} 218}
219 219
220/* 220/*
@@ -675,7 +675,6 @@ group_sched_in(struct perf_event *group_event,
675 struct perf_event *event, *partial_group = NULL; 675 struct perf_event *event, *partial_group = NULL;
676 const struct pmu *pmu = group_event->pmu; 676 const struct pmu *pmu = group_event->pmu;
677 bool txn = false; 677 bool txn = false;
678 int ret;
679 678
680 if (group_event->state == PERF_EVENT_STATE_OFF) 679 if (group_event->state == PERF_EVENT_STATE_OFF)
681 return 0; 680 return 0;
@@ -703,14 +702,8 @@ group_sched_in(struct perf_event *group_event,
703 } 702 }
704 } 703 }
705 704
706 if (!txn) 705 if (!txn || !pmu->commit_txn(pmu))
707 return 0;
708
709 ret = pmu->commit_txn(pmu);
710 if (!ret) {
711 pmu->cancel_txn(pmu);
712 return 0; 706 return 0;
713 }
714 707
715group_error: 708group_error:
716 /* 709 /*
@@ -1155,9 +1148,9 @@ static void __perf_event_sync_stat(struct perf_event *event,
1155 * In order to keep per-task stats reliable we need to flip the event 1148 * In order to keep per-task stats reliable we need to flip the event
1156 * values when we flip the contexts. 1149 * values when we flip the contexts.
1157 */ 1150 */
1158 value = atomic64_read(&next_event->count); 1151 value = local64_read(&next_event->count);
1159 value = atomic64_xchg(&event->count, value); 1152 value = local64_xchg(&event->count, value);
1160 atomic64_set(&next_event->count, value); 1153 local64_set(&next_event->count, value);
1161 1154
1162 swap(event->total_time_enabled, next_event->total_time_enabled); 1155 swap(event->total_time_enabled, next_event->total_time_enabled);
1163 swap(event->total_time_running, next_event->total_time_running); 1156 swap(event->total_time_running, next_event->total_time_running);
@@ -1507,6 +1500,9 @@ do { \
1507 divisor = nsec * frequency; 1500 divisor = nsec * frequency;
1508 } 1501 }
1509 1502
1503 if (!divisor)
1504 return dividend;
1505
1510 return div64_u64(dividend, divisor); 1506 return div64_u64(dividend, divisor);
1511} 1507}
1512 1508
@@ -1529,7 +1525,7 @@ static int perf_event_start(struct perf_event *event)
1529static void perf_adjust_period(struct perf_event *event, u64 nsec, u64 count) 1525static void perf_adjust_period(struct perf_event *event, u64 nsec, u64 count)
1530{ 1526{
1531 struct hw_perf_event *hwc = &event->hw; 1527 struct hw_perf_event *hwc = &event->hw;
1532 u64 period, sample_period; 1528 s64 period, sample_period;
1533 s64 delta; 1529 s64 delta;
1534 1530
1535 period = perf_calculate_period(event, nsec, count); 1531 period = perf_calculate_period(event, nsec, count);
@@ -1544,10 +1540,10 @@ static void perf_adjust_period(struct perf_event *event, u64 nsec, u64 count)
1544 1540
1545 hwc->sample_period = sample_period; 1541 hwc->sample_period = sample_period;
1546 1542
1547 if (atomic64_read(&hwc->period_left) > 8*sample_period) { 1543 if (local64_read(&hwc->period_left) > 8*sample_period) {
1548 perf_disable(); 1544 perf_disable();
1549 perf_event_stop(event); 1545 perf_event_stop(event);
1550 atomic64_set(&hwc->period_left, 0); 1546 local64_set(&hwc->period_left, 0);
1551 perf_event_start(event); 1547 perf_event_start(event);
1552 perf_enable(); 1548 perf_enable();
1553 } 1549 }
@@ -1588,7 +1584,7 @@ static void perf_ctx_adjust_freq(struct perf_event_context *ctx)
1588 1584
1589 perf_disable(); 1585 perf_disable();
1590 event->pmu->read(event); 1586 event->pmu->read(event);
1591 now = atomic64_read(&event->count); 1587 now = local64_read(&event->count);
1592 delta = now - hwc->freq_count_stamp; 1588 delta = now - hwc->freq_count_stamp;
1593 hwc->freq_count_stamp = now; 1589 hwc->freq_count_stamp = now;
1594 1590
@@ -1740,6 +1736,11 @@ static void __perf_event_read(void *info)
1740 event->pmu->read(event); 1736 event->pmu->read(event);
1741} 1737}
1742 1738
1739static inline u64 perf_event_count(struct perf_event *event)
1740{
1741 return local64_read(&event->count) + atomic64_read(&event->child_count);
1742}
1743
1743static u64 perf_event_read(struct perf_event *event) 1744static u64 perf_event_read(struct perf_event *event)
1744{ 1745{
1745 /* 1746 /*
@@ -1759,7 +1760,7 @@ static u64 perf_event_read(struct perf_event *event)
1759 raw_spin_unlock_irqrestore(&ctx->lock, flags); 1760 raw_spin_unlock_irqrestore(&ctx->lock, flags);
1760 } 1761 }
1761 1762
1762 return atomic64_read(&event->count); 1763 return perf_event_count(event);
1763} 1764}
1764 1765
1765/* 1766/*
@@ -1880,7 +1881,7 @@ static void free_event_rcu(struct rcu_head *head)
1880} 1881}
1881 1882
1882static void perf_pending_sync(struct perf_event *event); 1883static void perf_pending_sync(struct perf_event *event);
1883static void perf_mmap_data_put(struct perf_mmap_data *data); 1884static void perf_buffer_put(struct perf_buffer *buffer);
1884 1885
1885static void free_event(struct perf_event *event) 1886static void free_event(struct perf_event *event)
1886{ 1887{
@@ -1888,7 +1889,7 @@ static void free_event(struct perf_event *event)
1888 1889
1889 if (!event->parent) { 1890 if (!event->parent) {
1890 atomic_dec(&nr_events); 1891 atomic_dec(&nr_events);
1891 if (event->attr.mmap) 1892 if (event->attr.mmap || event->attr.mmap_data)
1892 atomic_dec(&nr_mmap_events); 1893 atomic_dec(&nr_mmap_events);
1893 if (event->attr.comm) 1894 if (event->attr.comm)
1894 atomic_dec(&nr_comm_events); 1895 atomic_dec(&nr_comm_events);
@@ -1896,9 +1897,9 @@ static void free_event(struct perf_event *event)
1896 atomic_dec(&nr_task_events); 1897 atomic_dec(&nr_task_events);
1897 } 1898 }
1898 1899
1899 if (event->data) { 1900 if (event->buffer) {
1900 perf_mmap_data_put(event->data); 1901 perf_buffer_put(event->buffer);
1901 event->data = NULL; 1902 event->buffer = NULL;
1902 } 1903 }
1903 1904
1904 if (event->destroy) 1905 if (event->destroy)
@@ -2123,13 +2124,13 @@ perf_read(struct file *file, char __user *buf, size_t count, loff_t *ppos)
2123static unsigned int perf_poll(struct file *file, poll_table *wait) 2124static unsigned int perf_poll(struct file *file, poll_table *wait)
2124{ 2125{
2125 struct perf_event *event = file->private_data; 2126 struct perf_event *event = file->private_data;
2126 struct perf_mmap_data *data; 2127 struct perf_buffer *buffer;
2127 unsigned int events = POLL_HUP; 2128 unsigned int events = POLL_HUP;
2128 2129
2129 rcu_read_lock(); 2130 rcu_read_lock();
2130 data = rcu_dereference(event->data); 2131 buffer = rcu_dereference(event->buffer);
2131 if (data) 2132 if (buffer)
2132 events = atomic_xchg(&data->poll, 0); 2133 events = atomic_xchg(&buffer->poll, 0);
2133 rcu_read_unlock(); 2134 rcu_read_unlock();
2134 2135
2135 poll_wait(file, &event->waitq, wait); 2136 poll_wait(file, &event->waitq, wait);
@@ -2140,7 +2141,7 @@ static unsigned int perf_poll(struct file *file, poll_table *wait)
2140static void perf_event_reset(struct perf_event *event) 2141static void perf_event_reset(struct perf_event *event)
2141{ 2142{
2142 (void)perf_event_read(event); 2143 (void)perf_event_read(event);
2143 atomic64_set(&event->count, 0); 2144 local64_set(&event->count, 0);
2144 perf_event_update_userpage(event); 2145 perf_event_update_userpage(event);
2145} 2146}
2146 2147
@@ -2339,14 +2340,14 @@ static int perf_event_index(struct perf_event *event)
2339void perf_event_update_userpage(struct perf_event *event) 2340void perf_event_update_userpage(struct perf_event *event)
2340{ 2341{
2341 struct perf_event_mmap_page *userpg; 2342 struct perf_event_mmap_page *userpg;
2342 struct perf_mmap_data *data; 2343 struct perf_buffer *buffer;
2343 2344
2344 rcu_read_lock(); 2345 rcu_read_lock();
2345 data = rcu_dereference(event->data); 2346 buffer = rcu_dereference(event->buffer);
2346 if (!data) 2347 if (!buffer)
2347 goto unlock; 2348 goto unlock;
2348 2349
2349 userpg = data->user_page; 2350 userpg = buffer->user_page;
2350 2351
2351 /* 2352 /*
2352 * Disable preemption so as to not let the corresponding user-space 2353 * Disable preemption so as to not let the corresponding user-space
@@ -2356,9 +2357,9 @@ void perf_event_update_userpage(struct perf_event *event)
2356 ++userpg->lock; 2357 ++userpg->lock;
2357 barrier(); 2358 barrier();
2358 userpg->index = perf_event_index(event); 2359 userpg->index = perf_event_index(event);
2359 userpg->offset = atomic64_read(&event->count); 2360 userpg->offset = perf_event_count(event);
2360 if (event->state == PERF_EVENT_STATE_ACTIVE) 2361 if (event->state == PERF_EVENT_STATE_ACTIVE)
2361 userpg->offset -= atomic64_read(&event->hw.prev_count); 2362 userpg->offset -= local64_read(&event->hw.prev_count);
2362 2363
2363 userpg->time_enabled = event->total_time_enabled + 2364 userpg->time_enabled = event->total_time_enabled +
2364 atomic64_read(&event->child_total_time_enabled); 2365 atomic64_read(&event->child_total_time_enabled);
@@ -2373,6 +2374,25 @@ unlock:
2373 rcu_read_unlock(); 2374 rcu_read_unlock();
2374} 2375}
2375 2376
2377static unsigned long perf_data_size(struct perf_buffer *buffer);
2378
2379static void
2380perf_buffer_init(struct perf_buffer *buffer, long watermark, int flags)
2381{
2382 long max_size = perf_data_size(buffer);
2383
2384 if (watermark)
2385 buffer->watermark = min(max_size, watermark);
2386
2387 if (!buffer->watermark)
2388 buffer->watermark = max_size / 2;
2389
2390 if (flags & PERF_BUFFER_WRITABLE)
2391 buffer->writable = 1;
2392
2393 atomic_set(&buffer->refcount, 1);
2394}
2395
2376#ifndef CONFIG_PERF_USE_VMALLOC 2396#ifndef CONFIG_PERF_USE_VMALLOC
2377 2397
2378/* 2398/*
@@ -2380,15 +2400,15 @@ unlock:
2380 */ 2400 */
2381 2401
2382static struct page * 2402static struct page *
2383perf_mmap_to_page(struct perf_mmap_data *data, unsigned long pgoff) 2403perf_mmap_to_page(struct perf_buffer *buffer, unsigned long pgoff)
2384{ 2404{
2385 if (pgoff > data->nr_pages) 2405 if (pgoff > buffer->nr_pages)
2386 return NULL; 2406 return NULL;
2387 2407
2388 if (pgoff == 0) 2408 if (pgoff == 0)
2389 return virt_to_page(data->user_page); 2409 return virt_to_page(buffer->user_page);
2390 2410
2391 return virt_to_page(data->data_pages[pgoff - 1]); 2411 return virt_to_page(buffer->data_pages[pgoff - 1]);
2392} 2412}
2393 2413
2394static void *perf_mmap_alloc_page(int cpu) 2414static void *perf_mmap_alloc_page(int cpu)
@@ -2404,42 +2424,44 @@ static void *perf_mmap_alloc_page(int cpu)
2404 return page_address(page); 2424 return page_address(page);
2405} 2425}
2406 2426
2407static struct perf_mmap_data * 2427static struct perf_buffer *
2408perf_mmap_data_alloc(struct perf_event *event, int nr_pages) 2428perf_buffer_alloc(int nr_pages, long watermark, int cpu, int flags)
2409{ 2429{
2410 struct perf_mmap_data *data; 2430 struct perf_buffer *buffer;
2411 unsigned long size; 2431 unsigned long size;
2412 int i; 2432 int i;
2413 2433
2414 size = sizeof(struct perf_mmap_data); 2434 size = sizeof(struct perf_buffer);
2415 size += nr_pages * sizeof(void *); 2435 size += nr_pages * sizeof(void *);
2416 2436
2417 data = kzalloc(size, GFP_KERNEL); 2437 buffer = kzalloc(size, GFP_KERNEL);
2418 if (!data) 2438 if (!buffer)
2419 goto fail; 2439 goto fail;
2420 2440
2421 data->user_page = perf_mmap_alloc_page(event->cpu); 2441 buffer->user_page = perf_mmap_alloc_page(cpu);
2422 if (!data->user_page) 2442 if (!buffer->user_page)
2423 goto fail_user_page; 2443 goto fail_user_page;
2424 2444
2425 for (i = 0; i < nr_pages; i++) { 2445 for (i = 0; i < nr_pages; i++) {
2426 data->data_pages[i] = perf_mmap_alloc_page(event->cpu); 2446 buffer->data_pages[i] = perf_mmap_alloc_page(cpu);
2427 if (!data->data_pages[i]) 2447 if (!buffer->data_pages[i])
2428 goto fail_data_pages; 2448 goto fail_data_pages;
2429 } 2449 }
2430 2450
2431 data->nr_pages = nr_pages; 2451 buffer->nr_pages = nr_pages;
2452
2453 perf_buffer_init(buffer, watermark, flags);
2432 2454
2433 return data; 2455 return buffer;
2434 2456
2435fail_data_pages: 2457fail_data_pages:
2436 for (i--; i >= 0; i--) 2458 for (i--; i >= 0; i--)
2437 free_page((unsigned long)data->data_pages[i]); 2459 free_page((unsigned long)buffer->data_pages[i]);
2438 2460
2439 free_page((unsigned long)data->user_page); 2461 free_page((unsigned long)buffer->user_page);
2440 2462
2441fail_user_page: 2463fail_user_page:
2442 kfree(data); 2464 kfree(buffer);
2443 2465
2444fail: 2466fail:
2445 return NULL; 2467 return NULL;
@@ -2453,17 +2475,17 @@ static void perf_mmap_free_page(unsigned long addr)
2453 __free_page(page); 2475 __free_page(page);
2454} 2476}
2455 2477
2456static void perf_mmap_data_free(struct perf_mmap_data *data) 2478static void perf_buffer_free(struct perf_buffer *buffer)
2457{ 2479{
2458 int i; 2480 int i;
2459 2481
2460 perf_mmap_free_page((unsigned long)data->user_page); 2482 perf_mmap_free_page((unsigned long)buffer->user_page);
2461 for (i = 0; i < data->nr_pages; i++) 2483 for (i = 0; i < buffer->nr_pages; i++)
2462 perf_mmap_free_page((unsigned long)data->data_pages[i]); 2484 perf_mmap_free_page((unsigned long)buffer->data_pages[i]);
2463 kfree(data); 2485 kfree(buffer);
2464} 2486}
2465 2487
2466static inline int page_order(struct perf_mmap_data *data) 2488static inline int page_order(struct perf_buffer *buffer)
2467{ 2489{
2468 return 0; 2490 return 0;
2469} 2491}
@@ -2476,18 +2498,18 @@ static inline int page_order(struct perf_mmap_data *data)
2476 * Required for architectures that have d-cache aliasing issues. 2498 * Required for architectures that have d-cache aliasing issues.
2477 */ 2499 */
2478 2500
2479static inline int page_order(struct perf_mmap_data *data) 2501static inline int page_order(struct perf_buffer *buffer)
2480{ 2502{
2481 return data->page_order; 2503 return buffer->page_order;
2482} 2504}
2483 2505
2484static struct page * 2506static struct page *
2485perf_mmap_to_page(struct perf_mmap_data *data, unsigned long pgoff) 2507perf_mmap_to_page(struct perf_buffer *buffer, unsigned long pgoff)
2486{ 2508{
2487 if (pgoff > (1UL << page_order(data))) 2509 if (pgoff > (1UL << page_order(buffer)))
2488 return NULL; 2510 return NULL;
2489 2511
2490 return vmalloc_to_page((void *)data->user_page + pgoff * PAGE_SIZE); 2512 return vmalloc_to_page((void *)buffer->user_page + pgoff * PAGE_SIZE);
2491} 2513}
2492 2514
2493static void perf_mmap_unmark_page(void *addr) 2515static void perf_mmap_unmark_page(void *addr)
@@ -2497,57 +2519,59 @@ static void perf_mmap_unmark_page(void *addr)
2497 page->mapping = NULL; 2519 page->mapping = NULL;
2498} 2520}
2499 2521
2500static void perf_mmap_data_free_work(struct work_struct *work) 2522static void perf_buffer_free_work(struct work_struct *work)
2501{ 2523{
2502 struct perf_mmap_data *data; 2524 struct perf_buffer *buffer;
2503 void *base; 2525 void *base;
2504 int i, nr; 2526 int i, nr;
2505 2527
2506 data = container_of(work, struct perf_mmap_data, work); 2528 buffer = container_of(work, struct perf_buffer, work);
2507 nr = 1 << page_order(data); 2529 nr = 1 << page_order(buffer);
2508 2530
2509 base = data->user_page; 2531 base = buffer->user_page;
2510 for (i = 0; i < nr + 1; i++) 2532 for (i = 0; i < nr + 1; i++)
2511 perf_mmap_unmark_page(base + (i * PAGE_SIZE)); 2533 perf_mmap_unmark_page(base + (i * PAGE_SIZE));
2512 2534
2513 vfree(base); 2535 vfree(base);
2514 kfree(data); 2536 kfree(buffer);
2515} 2537}
2516 2538
2517static void perf_mmap_data_free(struct perf_mmap_data *data) 2539static void perf_buffer_free(struct perf_buffer *buffer)
2518{ 2540{
2519 schedule_work(&data->work); 2541 schedule_work(&buffer->work);
2520} 2542}
2521 2543
2522static struct perf_mmap_data * 2544static struct perf_buffer *
2523perf_mmap_data_alloc(struct perf_event *event, int nr_pages) 2545perf_buffer_alloc(int nr_pages, long watermark, int cpu, int flags)
2524{ 2546{
2525 struct perf_mmap_data *data; 2547 struct perf_buffer *buffer;
2526 unsigned long size; 2548 unsigned long size;
2527 void *all_buf; 2549 void *all_buf;
2528 2550
2529 size = sizeof(struct perf_mmap_data); 2551 size = sizeof(struct perf_buffer);
2530 size += sizeof(void *); 2552 size += sizeof(void *);
2531 2553
2532 data = kzalloc(size, GFP_KERNEL); 2554 buffer = kzalloc(size, GFP_KERNEL);
2533 if (!data) 2555 if (!buffer)
2534 goto fail; 2556 goto fail;
2535 2557
2536 INIT_WORK(&data->work, perf_mmap_data_free_work); 2558 INIT_WORK(&buffer->work, perf_buffer_free_work);
2537 2559
2538 all_buf = vmalloc_user((nr_pages + 1) * PAGE_SIZE); 2560 all_buf = vmalloc_user((nr_pages + 1) * PAGE_SIZE);
2539 if (!all_buf) 2561 if (!all_buf)
2540 goto fail_all_buf; 2562 goto fail_all_buf;
2541 2563
2542 data->user_page = all_buf; 2564 buffer->user_page = all_buf;
2543 data->data_pages[0] = all_buf + PAGE_SIZE; 2565 buffer->data_pages[0] = all_buf + PAGE_SIZE;
2544 data->page_order = ilog2(nr_pages); 2566 buffer->page_order = ilog2(nr_pages);
2545 data->nr_pages = 1; 2567 buffer->nr_pages = 1;
2568
2569 perf_buffer_init(buffer, watermark, flags);
2546 2570
2547 return data; 2571 return buffer;
2548 2572
2549fail_all_buf: 2573fail_all_buf:
2550 kfree(data); 2574 kfree(buffer);
2551 2575
2552fail: 2576fail:
2553 return NULL; 2577 return NULL;
@@ -2555,15 +2579,15 @@ fail:
2555 2579
2556#endif 2580#endif
2557 2581
2558static unsigned long perf_data_size(struct perf_mmap_data *data) 2582static unsigned long perf_data_size(struct perf_buffer *buffer)
2559{ 2583{
2560 return data->nr_pages << (PAGE_SHIFT + page_order(data)); 2584 return buffer->nr_pages << (PAGE_SHIFT + page_order(buffer));
2561} 2585}
2562 2586
2563static int perf_mmap_fault(struct vm_area_struct *vma, struct vm_fault *vmf) 2587static int perf_mmap_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
2564{ 2588{
2565 struct perf_event *event = vma->vm_file->private_data; 2589 struct perf_event *event = vma->vm_file->private_data;
2566 struct perf_mmap_data *data; 2590 struct perf_buffer *buffer;
2567 int ret = VM_FAULT_SIGBUS; 2591 int ret = VM_FAULT_SIGBUS;
2568 2592
2569 if (vmf->flags & FAULT_FLAG_MKWRITE) { 2593 if (vmf->flags & FAULT_FLAG_MKWRITE) {
@@ -2573,14 +2597,14 @@ static int perf_mmap_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
2573 } 2597 }
2574 2598
2575 rcu_read_lock(); 2599 rcu_read_lock();
2576 data = rcu_dereference(event->data); 2600 buffer = rcu_dereference(event->buffer);
2577 if (!data) 2601 if (!buffer)
2578 goto unlock; 2602 goto unlock;
2579 2603
2580 if (vmf->pgoff && (vmf->flags & FAULT_FLAG_WRITE)) 2604 if (vmf->pgoff && (vmf->flags & FAULT_FLAG_WRITE))
2581 goto unlock; 2605 goto unlock;
2582 2606
2583 vmf->page = perf_mmap_to_page(data, vmf->pgoff); 2607 vmf->page = perf_mmap_to_page(buffer, vmf->pgoff);
2584 if (!vmf->page) 2608 if (!vmf->page)
2585 goto unlock; 2609 goto unlock;
2586 2610
@@ -2595,52 +2619,35 @@ unlock:
2595 return ret; 2619 return ret;
2596} 2620}
2597 2621
2598static void 2622static void perf_buffer_free_rcu(struct rcu_head *rcu_head)
2599perf_mmap_data_init(struct perf_event *event, struct perf_mmap_data *data)
2600{ 2623{
2601 long max_size = perf_data_size(data); 2624 struct perf_buffer *buffer;
2602 2625
2603 if (event->attr.watermark) { 2626 buffer = container_of(rcu_head, struct perf_buffer, rcu_head);
2604 data->watermark = min_t(long, max_size, 2627 perf_buffer_free(buffer);
2605 event->attr.wakeup_watermark);
2606 }
2607
2608 if (!data->watermark)
2609 data->watermark = max_size / 2;
2610
2611 atomic_set(&data->refcount, 1);
2612 rcu_assign_pointer(event->data, data);
2613}
2614
2615static void perf_mmap_data_free_rcu(struct rcu_head *rcu_head)
2616{
2617 struct perf_mmap_data *data;
2618
2619 data = container_of(rcu_head, struct perf_mmap_data, rcu_head);
2620 perf_mmap_data_free(data);
2621} 2628}
2622 2629
2623static struct perf_mmap_data *perf_mmap_data_get(struct perf_event *event) 2630static struct perf_buffer *perf_buffer_get(struct perf_event *event)
2624{ 2631{
2625 struct perf_mmap_data *data; 2632 struct perf_buffer *buffer;
2626 2633
2627 rcu_read_lock(); 2634 rcu_read_lock();
2628 data = rcu_dereference(event->data); 2635 buffer = rcu_dereference(event->buffer);
2629 if (data) { 2636 if (buffer) {
2630 if (!atomic_inc_not_zero(&data->refcount)) 2637 if (!atomic_inc_not_zero(&buffer->refcount))
2631 data = NULL; 2638 buffer = NULL;
2632 } 2639 }
2633 rcu_read_unlock(); 2640 rcu_read_unlock();
2634 2641
2635 return data; 2642 return buffer;
2636} 2643}
2637 2644
2638static void perf_mmap_data_put(struct perf_mmap_data *data) 2645static void perf_buffer_put(struct perf_buffer *buffer)
2639{ 2646{
2640 if (!atomic_dec_and_test(&data->refcount)) 2647 if (!atomic_dec_and_test(&buffer->refcount))
2641 return; 2648 return;
2642 2649
2643 call_rcu(&data->rcu_head, perf_mmap_data_free_rcu); 2650 call_rcu(&buffer->rcu_head, perf_buffer_free_rcu);
2644} 2651}
2645 2652
2646static void perf_mmap_open(struct vm_area_struct *vma) 2653static void perf_mmap_open(struct vm_area_struct *vma)
@@ -2655,16 +2662,16 @@ static void perf_mmap_close(struct vm_area_struct *vma)
2655 struct perf_event *event = vma->vm_file->private_data; 2662 struct perf_event *event = vma->vm_file->private_data;
2656 2663
2657 if (atomic_dec_and_mutex_lock(&event->mmap_count, &event->mmap_mutex)) { 2664 if (atomic_dec_and_mutex_lock(&event->mmap_count, &event->mmap_mutex)) {
2658 unsigned long size = perf_data_size(event->data); 2665 unsigned long size = perf_data_size(event->buffer);
2659 struct user_struct *user = event->mmap_user; 2666 struct user_struct *user = event->mmap_user;
2660 struct perf_mmap_data *data = event->data; 2667 struct perf_buffer *buffer = event->buffer;
2661 2668
2662 atomic_long_sub((size >> PAGE_SHIFT) + 1, &user->locked_vm); 2669 atomic_long_sub((size >> PAGE_SHIFT) + 1, &user->locked_vm);
2663 vma->vm_mm->locked_vm -= event->mmap_locked; 2670 vma->vm_mm->locked_vm -= event->mmap_locked;
2664 rcu_assign_pointer(event->data, NULL); 2671 rcu_assign_pointer(event->buffer, NULL);
2665 mutex_unlock(&event->mmap_mutex); 2672 mutex_unlock(&event->mmap_mutex);
2666 2673
2667 perf_mmap_data_put(data); 2674 perf_buffer_put(buffer);
2668 free_uid(user); 2675 free_uid(user);
2669 } 2676 }
2670} 2677}
@@ -2682,11 +2689,11 @@ static int perf_mmap(struct file *file, struct vm_area_struct *vma)
2682 unsigned long user_locked, user_lock_limit; 2689 unsigned long user_locked, user_lock_limit;
2683 struct user_struct *user = current_user(); 2690 struct user_struct *user = current_user();
2684 unsigned long locked, lock_limit; 2691 unsigned long locked, lock_limit;
2685 struct perf_mmap_data *data; 2692 struct perf_buffer *buffer;
2686 unsigned long vma_size; 2693 unsigned long vma_size;
2687 unsigned long nr_pages; 2694 unsigned long nr_pages;
2688 long user_extra, extra; 2695 long user_extra, extra;
2689 int ret = 0; 2696 int ret = 0, flags = 0;
2690 2697
2691 /* 2698 /*
2692 * Don't allow mmap() of inherited per-task counters. This would 2699 * Don't allow mmap() of inherited per-task counters. This would
@@ -2703,7 +2710,7 @@ static int perf_mmap(struct file *file, struct vm_area_struct *vma)
2703 nr_pages = (vma_size / PAGE_SIZE) - 1; 2710 nr_pages = (vma_size / PAGE_SIZE) - 1;
2704 2711
2705 /* 2712 /*
2706 * If we have data pages ensure they're a power-of-two number, so we 2713 * If we have buffer pages ensure they're a power-of-two number, so we
2707 * can do bitmasks instead of modulo. 2714 * can do bitmasks instead of modulo.
2708 */ 2715 */
2709 if (nr_pages != 0 && !is_power_of_2(nr_pages)) 2716 if (nr_pages != 0 && !is_power_of_2(nr_pages))
@@ -2717,9 +2724,9 @@ static int perf_mmap(struct file *file, struct vm_area_struct *vma)
2717 2724
2718 WARN_ON_ONCE(event->ctx->parent_ctx); 2725 WARN_ON_ONCE(event->ctx->parent_ctx);
2719 mutex_lock(&event->mmap_mutex); 2726 mutex_lock(&event->mmap_mutex);
2720 if (event->data) { 2727 if (event->buffer) {
2721 if (event->data->nr_pages == nr_pages) 2728 if (event->buffer->nr_pages == nr_pages)
2722 atomic_inc(&event->data->refcount); 2729 atomic_inc(&event->buffer->refcount);
2723 else 2730 else
2724 ret = -EINVAL; 2731 ret = -EINVAL;
2725 goto unlock; 2732 goto unlock;
@@ -2749,17 +2756,18 @@ static int perf_mmap(struct file *file, struct vm_area_struct *vma)
2749 goto unlock; 2756 goto unlock;
2750 } 2757 }
2751 2758
2752 WARN_ON(event->data); 2759 WARN_ON(event->buffer);
2760
2761 if (vma->vm_flags & VM_WRITE)
2762 flags |= PERF_BUFFER_WRITABLE;
2753 2763
2754 data = perf_mmap_data_alloc(event, nr_pages); 2764 buffer = perf_buffer_alloc(nr_pages, event->attr.wakeup_watermark,
2755 if (!data) { 2765 event->cpu, flags);
2766 if (!buffer) {
2756 ret = -ENOMEM; 2767 ret = -ENOMEM;
2757 goto unlock; 2768 goto unlock;
2758 } 2769 }
2759 2770 rcu_assign_pointer(event->buffer, buffer);
2760 perf_mmap_data_init(event, data);
2761 if (vma->vm_flags & VM_WRITE)
2762 event->data->writable = 1;
2763 2771
2764 atomic_long_add(user_extra, &user->locked_vm); 2772 atomic_long_add(user_extra, &user->locked_vm);
2765 event->mmap_locked = extra; 2773 event->mmap_locked = extra;
@@ -2938,11 +2946,6 @@ __weak struct perf_callchain_entry *perf_callchain(struct pt_regs *regs)
2938 return NULL; 2946 return NULL;
2939} 2947}
2940 2948
2941__weak
2942void perf_arch_fetch_caller_regs(struct pt_regs *regs, unsigned long ip, int skip)
2943{
2944}
2945
2946 2949
2947/* 2950/*
2948 * We assume there is only KVM supporting the callbacks. 2951 * We assume there is only KVM supporting the callbacks.
@@ -2968,15 +2971,15 @@ EXPORT_SYMBOL_GPL(perf_unregister_guest_info_callbacks);
2968/* 2971/*
2969 * Output 2972 * Output
2970 */ 2973 */
2971static bool perf_output_space(struct perf_mmap_data *data, unsigned long tail, 2974static bool perf_output_space(struct perf_buffer *buffer, unsigned long tail,
2972 unsigned long offset, unsigned long head) 2975 unsigned long offset, unsigned long head)
2973{ 2976{
2974 unsigned long mask; 2977 unsigned long mask;
2975 2978
2976 if (!data->writable) 2979 if (!buffer->writable)
2977 return true; 2980 return true;
2978 2981
2979 mask = perf_data_size(data) - 1; 2982 mask = perf_data_size(buffer) - 1;
2980 2983
2981 offset = (offset - tail) & mask; 2984 offset = (offset - tail) & mask;
2982 head = (head - tail) & mask; 2985 head = (head - tail) & mask;
@@ -2989,7 +2992,7 @@ static bool perf_output_space(struct perf_mmap_data *data, unsigned long tail,
2989 2992
2990static void perf_output_wakeup(struct perf_output_handle *handle) 2993static void perf_output_wakeup(struct perf_output_handle *handle)
2991{ 2994{
2992 atomic_set(&handle->data->poll, POLL_IN); 2995 atomic_set(&handle->buffer->poll, POLL_IN);
2993 2996
2994 if (handle->nmi) { 2997 if (handle->nmi) {
2995 handle->event->pending_wakeup = 1; 2998 handle->event->pending_wakeup = 1;
@@ -3009,45 +3012,45 @@ static void perf_output_wakeup(struct perf_output_handle *handle)
3009 */ 3012 */
3010static void perf_output_get_handle(struct perf_output_handle *handle) 3013static void perf_output_get_handle(struct perf_output_handle *handle)
3011{ 3014{
3012 struct perf_mmap_data *data = handle->data; 3015 struct perf_buffer *buffer = handle->buffer;
3013 3016
3014 preempt_disable(); 3017 preempt_disable();
3015 local_inc(&data->nest); 3018 local_inc(&buffer->nest);
3016 handle->wakeup = local_read(&data->wakeup); 3019 handle->wakeup = local_read(&buffer->wakeup);
3017} 3020}
3018 3021
3019static void perf_output_put_handle(struct perf_output_handle *handle) 3022static void perf_output_put_handle(struct perf_output_handle *handle)
3020{ 3023{
3021 struct perf_mmap_data *data = handle->data; 3024 struct perf_buffer *buffer = handle->buffer;
3022 unsigned long head; 3025 unsigned long head;
3023 3026
3024again: 3027again:
3025 head = local_read(&data->head); 3028 head = local_read(&buffer->head);
3026 3029
3027 /* 3030 /*
3028 * IRQ/NMI can happen here, which means we can miss a head update. 3031 * IRQ/NMI can happen here, which means we can miss a head update.
3029 */ 3032 */
3030 3033
3031 if (!local_dec_and_test(&data->nest)) 3034 if (!local_dec_and_test(&buffer->nest))
3032 goto out; 3035 goto out;
3033 3036
3034 /* 3037 /*
3035 * Publish the known good head. Rely on the full barrier implied 3038 * Publish the known good head. Rely on the full barrier implied
3036 * by atomic_dec_and_test() order the data->head read and this 3039 * by atomic_dec_and_test() order the buffer->head read and this
3037 * write. 3040 * write.
3038 */ 3041 */
3039 data->user_page->data_head = head; 3042 buffer->user_page->data_head = head;
3040 3043
3041 /* 3044 /*
3042 * Now check if we missed an update, rely on the (compiler) 3045 * Now check if we missed an update, rely on the (compiler)
3043 * barrier in atomic_dec_and_test() to re-read data->head. 3046 * barrier in atomic_dec_and_test() to re-read buffer->head.
3044 */ 3047 */
3045 if (unlikely(head != local_read(&data->head))) { 3048 if (unlikely(head != local_read(&buffer->head))) {
3046 local_inc(&data->nest); 3049 local_inc(&buffer->nest);
3047 goto again; 3050 goto again;
3048 } 3051 }
3049 3052
3050 if (handle->wakeup != local_read(&data->wakeup)) 3053 if (handle->wakeup != local_read(&buffer->wakeup))
3051 perf_output_wakeup(handle); 3054 perf_output_wakeup(handle);
3052 3055
3053 out: 3056 out:
@@ -3067,12 +3070,12 @@ __always_inline void perf_output_copy(struct perf_output_handle *handle,
3067 buf += size; 3070 buf += size;
3068 handle->size -= size; 3071 handle->size -= size;
3069 if (!handle->size) { 3072 if (!handle->size) {
3070 struct perf_mmap_data *data = handle->data; 3073 struct perf_buffer *buffer = handle->buffer;
3071 3074
3072 handle->page++; 3075 handle->page++;
3073 handle->page &= data->nr_pages - 1; 3076 handle->page &= buffer->nr_pages - 1;
3074 handle->addr = data->data_pages[handle->page]; 3077 handle->addr = buffer->data_pages[handle->page];
3075 handle->size = PAGE_SIZE << page_order(data); 3078 handle->size = PAGE_SIZE << page_order(buffer);
3076 } 3079 }
3077 } while (len); 3080 } while (len);
3078} 3081}
@@ -3081,7 +3084,7 @@ int perf_output_begin(struct perf_output_handle *handle,
3081 struct perf_event *event, unsigned int size, 3084 struct perf_event *event, unsigned int size,
3082 int nmi, int sample) 3085 int nmi, int sample)
3083{ 3086{
3084 struct perf_mmap_data *data; 3087 struct perf_buffer *buffer;
3085 unsigned long tail, offset, head; 3088 unsigned long tail, offset, head;
3086 int have_lost; 3089 int have_lost;
3087 struct { 3090 struct {
@@ -3097,19 +3100,19 @@ int perf_output_begin(struct perf_output_handle *handle,
3097 if (event->parent) 3100 if (event->parent)
3098 event = event->parent; 3101 event = event->parent;
3099 3102
3100 data = rcu_dereference(event->data); 3103 buffer = rcu_dereference(event->buffer);
3101 if (!data) 3104 if (!buffer)
3102 goto out; 3105 goto out;
3103 3106
3104 handle->data = data; 3107 handle->buffer = buffer;
3105 handle->event = event; 3108 handle->event = event;
3106 handle->nmi = nmi; 3109 handle->nmi = nmi;
3107 handle->sample = sample; 3110 handle->sample = sample;
3108 3111
3109 if (!data->nr_pages) 3112 if (!buffer->nr_pages)
3110 goto out; 3113 goto out;
3111 3114
3112 have_lost = local_read(&data->lost); 3115 have_lost = local_read(&buffer->lost);
3113 if (have_lost) 3116 if (have_lost)
3114 size += sizeof(lost_event); 3117 size += sizeof(lost_event);
3115 3118
@@ -3121,30 +3124,30 @@ int perf_output_begin(struct perf_output_handle *handle,
3121 * tail pointer. So that all reads will be completed before the 3124 * tail pointer. So that all reads will be completed before the
3122 * write is issued. 3125 * write is issued.
3123 */ 3126 */
3124 tail = ACCESS_ONCE(data->user_page->data_tail); 3127 tail = ACCESS_ONCE(buffer->user_page->data_tail);
3125 smp_rmb(); 3128 smp_rmb();
3126 offset = head = local_read(&data->head); 3129 offset = head = local_read(&buffer->head);
3127 head += size; 3130 head += size;
3128 if (unlikely(!perf_output_space(data, tail, offset, head))) 3131 if (unlikely(!perf_output_space(buffer, tail, offset, head)))
3129 goto fail; 3132 goto fail;
3130 } while (local_cmpxchg(&data->head, offset, head) != offset); 3133 } while (local_cmpxchg(&buffer->head, offset, head) != offset);
3131 3134
3132 if (head - local_read(&data->wakeup) > data->watermark) 3135 if (head - local_read(&buffer->wakeup) > buffer->watermark)
3133 local_add(data->watermark, &data->wakeup); 3136 local_add(buffer->watermark, &buffer->wakeup);
3134 3137
3135 handle->page = offset >> (PAGE_SHIFT + page_order(data)); 3138 handle->page = offset >> (PAGE_SHIFT + page_order(buffer));
3136 handle->page &= data->nr_pages - 1; 3139 handle->page &= buffer->nr_pages - 1;
3137 handle->size = offset & ((PAGE_SIZE << page_order(data)) - 1); 3140 handle->size = offset & ((PAGE_SIZE << page_order(buffer)) - 1);
3138 handle->addr = data->data_pages[handle->page]; 3141 handle->addr = buffer->data_pages[handle->page];
3139 handle->addr += handle->size; 3142 handle->addr += handle->size;
3140 handle->size = (PAGE_SIZE << page_order(data)) - handle->size; 3143 handle->size = (PAGE_SIZE << page_order(buffer)) - handle->size;
3141 3144
3142 if (have_lost) { 3145 if (have_lost) {
3143 lost_event.header.type = PERF_RECORD_LOST; 3146 lost_event.header.type = PERF_RECORD_LOST;
3144 lost_event.header.misc = 0; 3147 lost_event.header.misc = 0;
3145 lost_event.header.size = sizeof(lost_event); 3148 lost_event.header.size = sizeof(lost_event);
3146 lost_event.id = event->id; 3149 lost_event.id = event->id;
3147 lost_event.lost = local_xchg(&data->lost, 0); 3150 lost_event.lost = local_xchg(&buffer->lost, 0);
3148 3151
3149 perf_output_put(handle, lost_event); 3152 perf_output_put(handle, lost_event);
3150 } 3153 }
@@ -3152,7 +3155,7 @@ int perf_output_begin(struct perf_output_handle *handle,
3152 return 0; 3155 return 0;
3153 3156
3154fail: 3157fail:
3155 local_inc(&data->lost); 3158 local_inc(&buffer->lost);
3156 perf_output_put_handle(handle); 3159 perf_output_put_handle(handle);
3157out: 3160out:
3158 rcu_read_unlock(); 3161 rcu_read_unlock();
@@ -3163,15 +3166,15 @@ out:
3163void perf_output_end(struct perf_output_handle *handle) 3166void perf_output_end(struct perf_output_handle *handle)
3164{ 3167{
3165 struct perf_event *event = handle->event; 3168 struct perf_event *event = handle->event;
3166 struct perf_mmap_data *data = handle->data; 3169 struct perf_buffer *buffer = handle->buffer;
3167 3170
3168 int wakeup_events = event->attr.wakeup_events; 3171 int wakeup_events = event->attr.wakeup_events;
3169 3172
3170 if (handle->sample && wakeup_events) { 3173 if (handle->sample && wakeup_events) {
3171 int events = local_inc_return(&data->events); 3174 int events = local_inc_return(&buffer->events);
3172 if (events >= wakeup_events) { 3175 if (events >= wakeup_events) {
3173 local_sub(wakeup_events, &data->events); 3176 local_sub(wakeup_events, &buffer->events);
3174 local_inc(&data->wakeup); 3177 local_inc(&buffer->wakeup);
3175 } 3178 }
3176 } 3179 }
3177 3180
@@ -3208,7 +3211,7 @@ static void perf_output_read_one(struct perf_output_handle *handle,
3208 u64 values[4]; 3211 u64 values[4];
3209 int n = 0; 3212 int n = 0;
3210 3213
3211 values[n++] = atomic64_read(&event->count); 3214 values[n++] = perf_event_count(event);
3212 if (read_format & PERF_FORMAT_TOTAL_TIME_ENABLED) { 3215 if (read_format & PERF_FORMAT_TOTAL_TIME_ENABLED) {
3213 values[n++] = event->total_time_enabled + 3216 values[n++] = event->total_time_enabled +
3214 atomic64_read(&event->child_total_time_enabled); 3217 atomic64_read(&event->child_total_time_enabled);
@@ -3245,7 +3248,7 @@ static void perf_output_read_group(struct perf_output_handle *handle,
3245 if (leader != event) 3248 if (leader != event)
3246 leader->pmu->read(leader); 3249 leader->pmu->read(leader);
3247 3250
3248 values[n++] = atomic64_read(&leader->count); 3251 values[n++] = perf_event_count(leader);
3249 if (read_format & PERF_FORMAT_ID) 3252 if (read_format & PERF_FORMAT_ID)
3250 values[n++] = primary_event_id(leader); 3253 values[n++] = primary_event_id(leader);
3251 3254
@@ -3257,7 +3260,7 @@ static void perf_output_read_group(struct perf_output_handle *handle,
3257 if (sub != event) 3260 if (sub != event)
3258 sub->pmu->read(sub); 3261 sub->pmu->read(sub);
3259 3262
3260 values[n++] = atomic64_read(&sub->count); 3263 values[n++] = perf_event_count(sub);
3261 if (read_format & PERF_FORMAT_ID) 3264 if (read_format & PERF_FORMAT_ID)
3262 values[n++] = primary_event_id(sub); 3265 values[n++] = primary_event_id(sub);
3263 3266
@@ -3488,7 +3491,7 @@ perf_event_read_event(struct perf_event *event,
3488/* 3491/*
3489 * task tracking -- fork/exit 3492 * task tracking -- fork/exit
3490 * 3493 *
3491 * enabled by: attr.comm | attr.mmap | attr.task 3494 * enabled by: attr.comm | attr.mmap | attr.mmap_data | attr.task
3492 */ 3495 */
3493 3496
3494struct perf_task_event { 3497struct perf_task_event {
@@ -3538,7 +3541,8 @@ static int perf_event_task_match(struct perf_event *event)
3538 if (event->cpu != -1 && event->cpu != smp_processor_id()) 3541 if (event->cpu != -1 && event->cpu != smp_processor_id())
3539 return 0; 3542 return 0;
3540 3543
3541 if (event->attr.comm || event->attr.mmap || event->attr.task) 3544 if (event->attr.comm || event->attr.mmap ||
3545 event->attr.mmap_data || event->attr.task)
3542 return 1; 3546 return 1;
3543 3547
3544 return 0; 3548 return 0;
@@ -3763,7 +3767,8 @@ static void perf_event_mmap_output(struct perf_event *event,
3763} 3767}
3764 3768
3765static int perf_event_mmap_match(struct perf_event *event, 3769static int perf_event_mmap_match(struct perf_event *event,
3766 struct perf_mmap_event *mmap_event) 3770 struct perf_mmap_event *mmap_event,
3771 int executable)
3767{ 3772{
3768 if (event->state < PERF_EVENT_STATE_INACTIVE) 3773 if (event->state < PERF_EVENT_STATE_INACTIVE)
3769 return 0; 3774 return 0;
@@ -3771,19 +3776,21 @@ static int perf_event_mmap_match(struct perf_event *event,
3771 if (event->cpu != -1 && event->cpu != smp_processor_id()) 3776 if (event->cpu != -1 && event->cpu != smp_processor_id())
3772 return 0; 3777 return 0;
3773 3778
3774 if (event->attr.mmap) 3779 if ((!executable && event->attr.mmap_data) ||
3780 (executable && event->attr.mmap))
3775 return 1; 3781 return 1;
3776 3782
3777 return 0; 3783 return 0;
3778} 3784}
3779 3785
3780static void perf_event_mmap_ctx(struct perf_event_context *ctx, 3786static void perf_event_mmap_ctx(struct perf_event_context *ctx,
3781 struct perf_mmap_event *mmap_event) 3787 struct perf_mmap_event *mmap_event,
3788 int executable)
3782{ 3789{
3783 struct perf_event *event; 3790 struct perf_event *event;
3784 3791
3785 list_for_each_entry_rcu(event, &ctx->event_list, event_entry) { 3792 list_for_each_entry_rcu(event, &ctx->event_list, event_entry) {
3786 if (perf_event_mmap_match(event, mmap_event)) 3793 if (perf_event_mmap_match(event, mmap_event, executable))
3787 perf_event_mmap_output(event, mmap_event); 3794 perf_event_mmap_output(event, mmap_event);
3788 } 3795 }
3789} 3796}
@@ -3827,6 +3834,14 @@ static void perf_event_mmap_event(struct perf_mmap_event *mmap_event)
3827 if (!vma->vm_mm) { 3834 if (!vma->vm_mm) {
3828 name = strncpy(tmp, "[vdso]", sizeof(tmp)); 3835 name = strncpy(tmp, "[vdso]", sizeof(tmp));
3829 goto got_name; 3836 goto got_name;
3837 } else if (vma->vm_start <= vma->vm_mm->start_brk &&
3838 vma->vm_end >= vma->vm_mm->brk) {
3839 name = strncpy(tmp, "[heap]", sizeof(tmp));
3840 goto got_name;
3841 } else if (vma->vm_start <= vma->vm_mm->start_stack &&
3842 vma->vm_end >= vma->vm_mm->start_stack) {
3843 name = strncpy(tmp, "[stack]", sizeof(tmp));
3844 goto got_name;
3830 } 3845 }
3831 3846
3832 name = strncpy(tmp, "//anon", sizeof(tmp)); 3847 name = strncpy(tmp, "//anon", sizeof(tmp));
@@ -3843,17 +3858,17 @@ got_name:
3843 3858
3844 rcu_read_lock(); 3859 rcu_read_lock();
3845 cpuctx = &get_cpu_var(perf_cpu_context); 3860 cpuctx = &get_cpu_var(perf_cpu_context);
3846 perf_event_mmap_ctx(&cpuctx->ctx, mmap_event); 3861 perf_event_mmap_ctx(&cpuctx->ctx, mmap_event, vma->vm_flags & VM_EXEC);
3847 ctx = rcu_dereference(current->perf_event_ctxp); 3862 ctx = rcu_dereference(current->perf_event_ctxp);
3848 if (ctx) 3863 if (ctx)
3849 perf_event_mmap_ctx(ctx, mmap_event); 3864 perf_event_mmap_ctx(ctx, mmap_event, vma->vm_flags & VM_EXEC);
3850 put_cpu_var(perf_cpu_context); 3865 put_cpu_var(perf_cpu_context);
3851 rcu_read_unlock(); 3866 rcu_read_unlock();
3852 3867
3853 kfree(buf); 3868 kfree(buf);
3854} 3869}
3855 3870
3856void __perf_event_mmap(struct vm_area_struct *vma) 3871void perf_event_mmap(struct vm_area_struct *vma)
3857{ 3872{
3858 struct perf_mmap_event mmap_event; 3873 struct perf_mmap_event mmap_event;
3859 3874
@@ -4015,14 +4030,14 @@ static u64 perf_swevent_set_period(struct perf_event *event)
4015 hwc->last_period = hwc->sample_period; 4030 hwc->last_period = hwc->sample_period;
4016 4031
4017again: 4032again:
4018 old = val = atomic64_read(&hwc->period_left); 4033 old = val = local64_read(&hwc->period_left);
4019 if (val < 0) 4034 if (val < 0)
4020 return 0; 4035 return 0;
4021 4036
4022 nr = div64_u64(period + val, period); 4037 nr = div64_u64(period + val, period);
4023 offset = nr * period; 4038 offset = nr * period;
4024 val -= offset; 4039 val -= offset;
4025 if (atomic64_cmpxchg(&hwc->period_left, old, val) != old) 4040 if (local64_cmpxchg(&hwc->period_left, old, val) != old)
4026 goto again; 4041 goto again;
4027 4042
4028 return nr; 4043 return nr;
@@ -4061,7 +4076,7 @@ static void perf_swevent_add(struct perf_event *event, u64 nr,
4061{ 4076{
4062 struct hw_perf_event *hwc = &event->hw; 4077 struct hw_perf_event *hwc = &event->hw;
4063 4078
4064 atomic64_add(nr, &event->count); 4079 local64_add(nr, &event->count);
4065 4080
4066 if (!regs) 4081 if (!regs)
4067 return; 4082 return;
@@ -4072,7 +4087,7 @@ static void perf_swevent_add(struct perf_event *event, u64 nr,
4072 if (nr == 1 && hwc->sample_period == 1 && !event->attr.freq) 4087 if (nr == 1 && hwc->sample_period == 1 && !event->attr.freq)
4073 return perf_swevent_overflow(event, 1, nmi, data, regs); 4088 return perf_swevent_overflow(event, 1, nmi, data, regs);
4074 4089
4075 if (atomic64_add_negative(nr, &hwc->period_left)) 4090 if (local64_add_negative(nr, &hwc->period_left))
4076 return; 4091 return;
4077 4092
4078 perf_swevent_overflow(event, 0, nmi, data, regs); 4093 perf_swevent_overflow(event, 0, nmi, data, regs);
@@ -4210,14 +4225,12 @@ int perf_swevent_get_recursion_context(void)
4210} 4225}
4211EXPORT_SYMBOL_GPL(perf_swevent_get_recursion_context); 4226EXPORT_SYMBOL_GPL(perf_swevent_get_recursion_context);
4212 4227
4213void perf_swevent_put_recursion_context(int rctx) 4228void inline perf_swevent_put_recursion_context(int rctx)
4214{ 4229{
4215 struct perf_cpu_context *cpuctx = &__get_cpu_var(perf_cpu_context); 4230 struct perf_cpu_context *cpuctx = &__get_cpu_var(perf_cpu_context);
4216 barrier(); 4231 barrier();
4217 cpuctx->recursion[rctx]--; 4232 cpuctx->recursion[rctx]--;
4218} 4233}
4219EXPORT_SYMBOL_GPL(perf_swevent_put_recursion_context);
4220
4221 4234
4222void __perf_sw_event(u32 event_id, u64 nr, int nmi, 4235void __perf_sw_event(u32 event_id, u64 nr, int nmi,
4223 struct pt_regs *regs, u64 addr) 4236 struct pt_regs *regs, u64 addr)
@@ -4365,8 +4378,8 @@ static void cpu_clock_perf_event_update(struct perf_event *event)
4365 u64 now; 4378 u64 now;
4366 4379
4367 now = cpu_clock(cpu); 4380 now = cpu_clock(cpu);
4368 prev = atomic64_xchg(&event->hw.prev_count, now); 4381 prev = local64_xchg(&event->hw.prev_count, now);
4369 atomic64_add(now - prev, &event->count); 4382 local64_add(now - prev, &event->count);
4370} 4383}
4371 4384
4372static int cpu_clock_perf_event_enable(struct perf_event *event) 4385static int cpu_clock_perf_event_enable(struct perf_event *event)
@@ -4374,7 +4387,7 @@ static int cpu_clock_perf_event_enable(struct perf_event *event)
4374 struct hw_perf_event *hwc = &event->hw; 4387 struct hw_perf_event *hwc = &event->hw;
4375 int cpu = raw_smp_processor_id(); 4388 int cpu = raw_smp_processor_id();
4376 4389
4377 atomic64_set(&hwc->prev_count, cpu_clock(cpu)); 4390 local64_set(&hwc->prev_count, cpu_clock(cpu));
4378 perf_swevent_start_hrtimer(event); 4391 perf_swevent_start_hrtimer(event);
4379 4392
4380 return 0; 4393 return 0;
@@ -4406,9 +4419,9 @@ static void task_clock_perf_event_update(struct perf_event *event, u64 now)
4406 u64 prev; 4419 u64 prev;
4407 s64 delta; 4420 s64 delta;
4408 4421
4409 prev = atomic64_xchg(&event->hw.prev_count, now); 4422 prev = local64_xchg(&event->hw.prev_count, now);
4410 delta = now - prev; 4423 delta = now - prev;
4411 atomic64_add(delta, &event->count); 4424 local64_add(delta, &event->count);
4412} 4425}
4413 4426
4414static int task_clock_perf_event_enable(struct perf_event *event) 4427static int task_clock_perf_event_enable(struct perf_event *event)
@@ -4418,7 +4431,7 @@ static int task_clock_perf_event_enable(struct perf_event *event)
4418 4431
4419 now = event->ctx->time; 4432 now = event->ctx->time;
4420 4433
4421 atomic64_set(&hwc->prev_count, now); 4434 local64_set(&hwc->prev_count, now);
4422 4435
4423 perf_swevent_start_hrtimer(event); 4436 perf_swevent_start_hrtimer(event);
4424 4437
@@ -4598,7 +4611,7 @@ static int perf_tp_event_match(struct perf_event *event,
4598} 4611}
4599 4612
4600void perf_tp_event(u64 addr, u64 count, void *record, int entry_size, 4613void perf_tp_event(u64 addr, u64 count, void *record, int entry_size,
4601 struct pt_regs *regs, struct hlist_head *head) 4614 struct pt_regs *regs, struct hlist_head *head, int rctx)
4602{ 4615{
4603 struct perf_sample_data data; 4616 struct perf_sample_data data;
4604 struct perf_event *event; 4617 struct perf_event *event;
@@ -4612,12 +4625,12 @@ void perf_tp_event(u64 addr, u64 count, void *record, int entry_size,
4612 perf_sample_data_init(&data, addr); 4625 perf_sample_data_init(&data, addr);
4613 data.raw = &raw; 4626 data.raw = &raw;
4614 4627
4615 rcu_read_lock();
4616 hlist_for_each_entry_rcu(event, node, head, hlist_entry) { 4628 hlist_for_each_entry_rcu(event, node, head, hlist_entry) {
4617 if (perf_tp_event_match(event, &data, regs)) 4629 if (perf_tp_event_match(event, &data, regs))
4618 perf_swevent_add(event, count, 1, &data, regs); 4630 perf_swevent_add(event, count, 1, &data, regs);
4619 } 4631 }
4620 rcu_read_unlock(); 4632
4633 perf_swevent_put_recursion_context(rctx);
4621} 4634}
4622EXPORT_SYMBOL_GPL(perf_tp_event); 4635EXPORT_SYMBOL_GPL(perf_tp_event);
4623 4636
@@ -4861,7 +4874,7 @@ perf_event_alloc(struct perf_event_attr *attr,
4861 hwc->sample_period = 1; 4874 hwc->sample_period = 1;
4862 hwc->last_period = hwc->sample_period; 4875 hwc->last_period = hwc->sample_period;
4863 4876
4864 atomic64_set(&hwc->period_left, hwc->sample_period); 4877 local64_set(&hwc->period_left, hwc->sample_period);
4865 4878
4866 /* 4879 /*
4867 * we currently do not support PERF_FORMAT_GROUP on inherited events 4880 * we currently do not support PERF_FORMAT_GROUP on inherited events
@@ -4910,7 +4923,7 @@ done:
4910 4923
4911 if (!event->parent) { 4924 if (!event->parent) {
4912 atomic_inc(&nr_events); 4925 atomic_inc(&nr_events);
4913 if (event->attr.mmap) 4926 if (event->attr.mmap || event->attr.mmap_data)
4914 atomic_inc(&nr_mmap_events); 4927 atomic_inc(&nr_mmap_events);
4915 if (event->attr.comm) 4928 if (event->attr.comm)
4916 atomic_inc(&nr_comm_events); 4929 atomic_inc(&nr_comm_events);
@@ -5004,7 +5017,7 @@ err_size:
5004static int 5017static int
5005perf_event_set_output(struct perf_event *event, struct perf_event *output_event) 5018perf_event_set_output(struct perf_event *event, struct perf_event *output_event)
5006{ 5019{
5007 struct perf_mmap_data *data = NULL, *old_data = NULL; 5020 struct perf_buffer *buffer = NULL, *old_buffer = NULL;
5008 int ret = -EINVAL; 5021 int ret = -EINVAL;
5009 5022
5010 if (!output_event) 5023 if (!output_event)
@@ -5034,19 +5047,19 @@ set:
5034 5047
5035 if (output_event) { 5048 if (output_event) {
5036 /* get the buffer we want to redirect to */ 5049 /* get the buffer we want to redirect to */
5037 data = perf_mmap_data_get(output_event); 5050 buffer = perf_buffer_get(output_event);
5038 if (!data) 5051 if (!buffer)
5039 goto unlock; 5052 goto unlock;
5040 } 5053 }
5041 5054
5042 old_data = event->data; 5055 old_buffer = event->buffer;
5043 rcu_assign_pointer(event->data, data); 5056 rcu_assign_pointer(event->buffer, buffer);
5044 ret = 0; 5057 ret = 0;
5045unlock: 5058unlock:
5046 mutex_unlock(&event->mmap_mutex); 5059 mutex_unlock(&event->mmap_mutex);
5047 5060
5048 if (old_data) 5061 if (old_buffer)
5049 perf_mmap_data_put(old_data); 5062 perf_buffer_put(old_buffer);
5050out: 5063out:
5051 return ret; 5064 return ret;
5052} 5065}
@@ -5295,7 +5308,7 @@ inherit_event(struct perf_event *parent_event,
5295 hwc->sample_period = sample_period; 5308 hwc->sample_period = sample_period;
5296 hwc->last_period = sample_period; 5309 hwc->last_period = sample_period;
5297 5310
5298 atomic64_set(&hwc->period_left, sample_period); 5311 local64_set(&hwc->period_left, sample_period);
5299 } 5312 }
5300 5313
5301 child_event->overflow_handler = parent_event->overflow_handler; 5314 child_event->overflow_handler = parent_event->overflow_handler;
@@ -5356,12 +5369,12 @@ static void sync_child_event(struct perf_event *child_event,
5356 if (child_event->attr.inherit_stat) 5369 if (child_event->attr.inherit_stat)
5357 perf_event_read_event(child_event, child); 5370 perf_event_read_event(child_event, child);
5358 5371
5359 child_val = atomic64_read(&child_event->count); 5372 child_val = perf_event_count(child_event);
5360 5373
5361 /* 5374 /*
5362 * Add back the child's count to the parent's count: 5375 * Add back the child's count to the parent's count:
5363 */ 5376 */
5364 atomic64_add(child_val, &parent_event->count); 5377 atomic64_add(child_val, &parent_event->child_count);
5365 atomic64_add(child_event->total_time_enabled, 5378 atomic64_add(child_event->total_time_enabled,
5366 &parent_event->child_total_time_enabled); 5379 &parent_event->child_total_time_enabled);
5367 atomic64_add(child_event->total_time_running, 5380 atomic64_add(child_event->total_time_running,