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>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Corey Ashford <cjashfor@linux.vnet.ibm.com>
Orig-LKML-Reference: <20090402091319.323309784@chello.nl>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
Peter Zijlstra 2009-04-02 11:12:01 +02:00 committed by Ingo Molnar
parent 8a057d8491
commit c457810ab4
2 changed files with 11 additions and 2 deletions

View File

@ -145,7 +145,7 @@ struct perf_counter_hw_event {
__reserved_1 : 53;
__u32 extra_config_len;
__u32 __reserved_4;
__u32 wakeup_events; /* wakeup every n events */
__u64 __reserved_2;
__u64 __reserved_3;
@ -321,6 +321,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];
};

View File

@ -1760,7 +1760,15 @@ static void perf_output_copy(struct perf_output_handle *handle,
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();
}