summaryrefslogtreecommitdiff
path: root/include/linux/perf_counter.h
diff options
context:
space:
mode:
authorIngo Molnar <mingo@elte.hu>2008-12-11 12:46:46 +0100
committerIngo Molnar <mingo@elte.hu>2008-12-11 15:45:51 +0100
commit621a01eac89b5e2f81a4cf576568b31f40a02724 (patch)
tree79a7f2a8d49017077f40cfac4e78ee255cf2f43e /include/linux/perf_counter.h
parentccff286d85098ba5438e22aa2ea807fc1e18cf2f (diff)
downloadlwn-621a01eac89b5e2f81a4cf576568b31f40a02724.tar.gz
lwn-621a01eac89b5e2f81a4cf576568b31f40a02724.zip
perf counters: hw driver API
Impact: restructure code, introduce hw_ops driver abstraction Introduce this abstraction to handle counter details: struct hw_perf_counter_ops { void (*hw_perf_counter_enable) (struct perf_counter *counter); void (*hw_perf_counter_disable) (struct perf_counter *counter); void (*hw_perf_counter_read) (struct perf_counter *counter); }; This will be useful to support assymetric hw details, and it will also be useful to implement "software counters". (Counters that count kernel managed sw events such as pagefaults, context-switches, wall-clock time or task-local time.) Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'include/linux/perf_counter.h')
-rw-r--r--include/linux/perf_counter.h15
1 files changed, 15 insertions, 0 deletions
diff --git a/include/linux/perf_counter.h b/include/linux/perf_counter.h
index 7af7d8965460..27385641ecb6 100644
--- a/include/linux/perf_counter.h
+++ b/include/linux/perf_counter.h
@@ -113,6 +113,17 @@ struct perf_data {
u8 data[PERF_DATA_BUFLEN];
};
+struct perf_counter;
+
+/**
+ * struct hw_perf_counter_ops - performance counter hw ops
+ */
+struct hw_perf_counter_ops {
+ void (*hw_perf_counter_enable) (struct perf_counter *counter);
+ void (*hw_perf_counter_disable) (struct perf_counter *counter);
+ void (*hw_perf_counter_read) (struct perf_counter *counter);
+};
+
/**
* struct perf_counter - performance counter kernel representation:
*/
@@ -120,6 +131,7 @@ struct perf_counter {
struct list_head list_entry;
struct list_head sibling_list;
struct perf_counter *group_leader;
+ struct hw_perf_counter_ops *hw_ops;
int active;
#if BITS_PER_LONG == 64
@@ -185,6 +197,9 @@ struct perf_cpu_context {
extern int perf_max_counters;
#ifdef CONFIG_PERF_COUNTERS
+extern struct hw_perf_counter_ops *
+hw_perf_counter_init(struct perf_counter *counter);
+
extern void perf_counter_task_sched_in(struct task_struct *task, int cpu);
extern void perf_counter_task_sched_out(struct task_struct *task, int cpu);
extern void perf_counter_task_tick(struct task_struct *task, int cpu);