aboutsummaryrefslogtreecommitdiffstats
path: root/kernel
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2013-05-05 14:37:16 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2013-05-05 14:37:16 -0400
commit64049d1973c1735f543eb7a55653e291e108b0cb (patch)
tree1b13645ee288a561feccafd9fa84951220f5f651 /kernel
parentf8ce1faf55955de62e0a12e330c6d9a526071f65 (diff)
parent7cc23cd6c0c7d7f4bee057607e7ce01568925717 (diff)
Merge branch 'perf-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull perf fixes from Ingo Molnar: "Misc fixes plus a small hw-enablement patch for Intel IB model 58 uncore events" * 'perf-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: perf/x86/intel/lbr: Demand proper privileges for PERF_SAMPLE_BRANCH_KERNEL perf/x86/intel/lbr: Fix LBR filter perf/x86: Blacklist all MEM_*_RETIRED events for Ivy Bridge perf: Fix vmalloc ring buffer pages handling perf/x86/intel: Fix unintended variable name reuse perf/x86/intel: Add support for IvyBridge model 58 Uncore perf/x86/intel: Fix typo in perf_event_intel_uncore.c x86: Eliminate irq_mis_count counted in arch_irq_stat
Diffstat (limited to 'kernel')
-rw-r--r--kernel/events/ring_buffer.c14
1 files changed, 10 insertions, 4 deletions
diff --git a/kernel/events/ring_buffer.c b/kernel/events/ring_buffer.c
index 97fddb09762b..cd55144270b5 100644
--- a/kernel/events/ring_buffer.c
+++ b/kernel/events/ring_buffer.c
@@ -326,11 +326,16 @@ void rb_free(struct ring_buffer *rb)
326} 326}
327 327
328#else 328#else
329static int data_page_nr(struct ring_buffer *rb)
330{
331 return rb->nr_pages << page_order(rb);
332}
329 333
330struct page * 334struct page *
331perf_mmap_to_page(struct ring_buffer *rb, unsigned long pgoff) 335perf_mmap_to_page(struct ring_buffer *rb, unsigned long pgoff)
332{ 336{
333 if (pgoff > (1UL << page_order(rb))) 337 /* The '>' counts in the user page. */
338 if (pgoff > data_page_nr(rb))
334 return NULL; 339 return NULL;
335 340
336 return vmalloc_to_page((void *)rb->user_page + pgoff * PAGE_SIZE); 341 return vmalloc_to_page((void *)rb->user_page + pgoff * PAGE_SIZE);
@@ -350,10 +355,11 @@ static void rb_free_work(struct work_struct *work)
350 int i, nr; 355 int i, nr;
351 356
352 rb = container_of(work, struct ring_buffer, work); 357 rb = container_of(work, struct ring_buffer, work);
353 nr = 1 << page_order(rb); 358 nr = data_page_nr(rb);
354 359
355 base = rb->user_page; 360 base = rb->user_page;
356 for (i = 0; i < nr + 1; i++) 361 /* The '<=' counts in the user page. */
362 for (i = 0; i <= nr; i++)
357 perf_mmap_unmark_page(base + (i * PAGE_SIZE)); 363 perf_mmap_unmark_page(base + (i * PAGE_SIZE));
358 364
359 vfree(base); 365 vfree(base);
@@ -387,7 +393,7 @@ struct ring_buffer *rb_alloc(int nr_pages, long watermark, int cpu, int flags)
387 rb->user_page = all_buf; 393 rb->user_page = all_buf;
388 rb->data_pages[0] = all_buf + PAGE_SIZE; 394 rb->data_pages[0] = all_buf + PAGE_SIZE;
389 rb->page_order = ilog2(nr_pages); 395 rb->page_order = ilog2(nr_pages);
390 rb->nr_pages = 1; 396 rb->nr_pages = !!nr_pages;
391 397
392 ring_buffer_init(rb, watermark, flags); 398 ring_buffer_init(rb, watermark, flags);
393 399