perf counters: clean up 'raw' type API
authorThomas Gleixner <tglx@linutronix.de>
Mon, 8 Dec 2008 18:26:59 +0000 (19:26 +0100)
committerIngo Molnar <mingo@elte.hu>
Thu, 11 Dec 2008 14:45:46 +0000 (15:45 +0100)
Impact: cleanup

Introduce a separate hw_event type.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
include/linux/perf_counter.h
include/linux/syscalls.h
kernel/perf_counter.c

index 5031b56..daedd7d 100644 (file)
@@ -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
  */
index 6cce728..3ecd73d 100644 (file)
@@ -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
index 20508f0..96c333a 100644 (file)
@@ -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;