summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Gleixner <tglx@linutronix.de>2008-12-08 19:26:59 +0100
committerIngo Molnar <mingo@elte.hu>2008-12-11 15:45:46 +0100
commiteab656ae04b9d3b83265e3db01c0d2c46b748ef7 (patch)
treea8e12bd5a2da6032234dbb20ad2c75766b96c270
parent4ac13294e44664bb7edf4daf52edb71e7c6bbe84 (diff)
perf counters: clean up 'raw' type API
Impact: cleanup Introduce a separate hw_event type. Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Signed-off-by: Ingo Molnar <mingo@elte.hu>
-rw-r--r--include/linux/perf_counter.h7
-rw-r--r--include/linux/syscalls.h8
-rw-r--r--kernel/perf_counter.c15
3 files changed, 18 insertions, 12 deletions
diff --git a/include/linux/perf_counter.h b/include/linux/perf_counter.h
index 5031b5614f25..daedd7d87c2a 100644
--- a/include/linux/perf_counter.h
+++ b/include/linux/perf_counter.h
@@ -38,6 +38,7 @@ enum hw_event_types {
* If this bit is set in the type, then trigger NMI sampling:
*/
PERF_COUNT_NMI = (1 << 30),
+ PERF_COUNT_RAW = (1 << 31),
};
/*
@@ -49,6 +50,12 @@ enum perf_record_type {
PERF_RECORD_GROUP,
};
+struct perf_counter_event {
+ u32 hw_event_type;
+ u32 hw_event_period;
+ u64 hw_raw_ctrl;
+};
+
/**
* struct hw_perf_counter - performance counter hardware details
*/
diff --git a/include/linux/syscalls.h b/include/linux/syscalls.h
index 6cce728a6263..3ecd73d03daa 100644
--- a/include/linux/syscalls.h
+++ b/include/linux/syscalls.h
@@ -54,6 +54,7 @@ struct compat_stat;
struct compat_timeval;
struct robust_list_head;
struct getcpu_cache;
+struct perf_counter_event;
#include <linux/types.h>
#include <linux/aio_abi.h>
@@ -625,9 +626,6 @@ asmlinkage long sys_fallocate(int fd, int mode, loff_t offset, loff_t len);
int kernel_execve(const char *filename, char *const argv[], char *const envp[]);
asmlinkage int
-sys_perf_counter_open(u32 hw_event_type,
- u32 hw_event_period,
- u32 record_type,
- pid_t pid,
- int cpu);
+sys_perf_counter_open(struct perf_counter_event __user *uevent, u32 record_type,
+ pid_t pid, int cpu, int masterfd);
#endif
diff --git a/kernel/perf_counter.c b/kernel/perf_counter.c
index 20508f053658..96c333a5b0fc 100644
--- a/kernel/perf_counter.c
+++ b/kernel/perf_counter.c
@@ -734,26 +734,27 @@ perf_counter_alloc(u32 hw_event_period, int cpu, u32 record_type)
* @pid: target pid
*/
asmlinkage int
-sys_perf_counter_open(u32 hw_event_type,
- u32 hw_event_period,
- u32 record_type,
- pid_t pid,
- int cpu)
+sys_perf_counter_open(struct perf_counter_event __user *uevent, u32 record_type,
+ pid_t pid, int cpu, int masterfd)
{
struct perf_counter_context *ctx;
+ struct perf_counter_event event;
struct perf_counter *counter;
int ret;
+ if (copy_from_user(&event, uevent, sizeof(event)) != 0)
+ return -EFAULT;
+
ctx = find_get_context(pid, cpu);
if (IS_ERR(ctx))
return PTR_ERR(ctx);
ret = -ENOMEM;
- counter = perf_counter_alloc(hw_event_period, cpu, record_type);
+ counter = perf_counter_alloc(event.hw_event_period, cpu, record_type);
if (!counter)
goto err_put_context;
- ret = hw_perf_counter_init(counter, hw_event_type);
+ ret = hw_perf_counter_init(counter, event.hw_event_type);
if (ret)
goto err_free_put_context;