lkml.org 
[lkml]   [2009]   [Apr]   [2]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
Date
From
Subject[PATCH 3/6] perf_counter: per event wakeups
By request, provide a way to request a wakeup every 'n' events instead
of every page of output.

Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
---
include/linux/perf_counter.h | 3 ++-
kernel/perf_counter.c | 10 +++++++++-
2 files changed, 11 insertions(+), 2 deletions(-)
Index: linux-2.6/include/linux/perf_counter.h
===================================================================
--- linux-2.6.orig/include/linux/perf_counter.h
+++ linux-2.6/include/linux/perf_counter.h
@@ -146,7 +146,7 @@ struct perf_counter_hw_event {
__reserved_1 : 52;

__u32 extra_config_len;
- __u32 __reserved_4;
+ __u32 wakeup_events; /* wakeup every n events */

/*
* Singleshot signal information.
@@ -327,6 +327,7 @@ struct perf_mmap_data {
int nr_pages;
atomic_t wakeup;
atomic_t head;
+ atomic_t events;
struct perf_counter_mmap_page *user_page;
void *data_pages[0];
};
Index: linux-2.6/kernel/perf_counter.c
===================================================================
--- linux-2.6.orig/kernel/perf_counter.c
+++ linux-2.6/kernel/perf_counter.c
@@ -1760,7 +1760,15 @@ static void perf_output_copy(struct perf

static void perf_output_end(struct perf_output_handle *handle)
{
- if (handle->wakeup)
+ int wakeup_events = handle->counter->hw_event.wakeup_events;
+
+ if (wakeup_events) {
+ int events = atomic_inc_return(&handle->data->events);
+ if (events >= wakeup_events) {
+ atomic_sub(wakeup_events, &handle->data->events);
+ __perf_output_wakeup(handle);
+ }
+ } else if (handle->wakeup)
__perf_output_wakeup(handle);
rcu_read_unlock();
}
--



\
 
 \ /
  Last update: 2009-04-02 11:17    [W:0.193 / U:0.512 seconds]
©2003-2014 Jasper Spaans. Advertise on this site