x86: use pr_info in perf_counter.c
[deliverable/linux.git] / include / linux / perf_counter.h
index cc3a75a239a9a275ed7ebf025d9dfcec92810247..186efaf49665044f8e4a0123ffff3a9a7405cc23 100644 (file)
 #ifndef _LINUX_PERF_COUNTER_H
 #define _LINUX_PERF_COUNTER_H
 
-#include <asm/atomic.h>
-
-#ifdef CONFIG_PERF_COUNTERS
-# include <asm/perf_counter.h>
-#endif
-
-#include <linux/list.h>
-#include <linux/mutex.h>
-#include <linux/rculist.h>
-#include <linux/rcupdate.h>
-#include <linux/spinlock.h>
-
-struct task_struct;
+#include <linux/types.h>
+#include <linux/ioctl.h>
 
 /*
  * User-space ABI bits:
@@ -77,23 +66,49 @@ enum perf_counter_record_type {
  * Hardware event to monitor via a performance monitoring counter:
  */
 struct perf_counter_hw_event {
-       s64                     type;
+       __s64                   type;
+
+       __u64                   irq_period;
+       __u32                   record_type;
 
-       u64                     irq_period;
-       u32                     record_type;
+       __u32                   disabled       :  1, /* off by default        */
+                               nmi            :  1, /* NMI sampling          */
+                               raw            :  1, /* raw event type        */
+                               inherit        :  1, /* children inherit it   */
+                               pinned         :  1, /* must always be on PMU */
+                               exclusive      :  1, /* only group on PMU     */
+                               exclude_user   :  1, /* don't count user      */
+                               exclude_kernel :  1, /* ditto kernel          */
+                               exclude_hv     :  1, /* ditto hypervisor      */
 
-       u32                     disabled     :  1, /* off by default      */
-                               nmi          :  1, /* NMI sampling        */
-                               raw          :  1, /* raw event type      */
-                               inherit      :  1, /* children inherit it */
-                               __reserved_1 : 28;
+                               __reserved_1 : 23;
 
-       u64                     __reserved_2;
+       __u64                   __reserved_2;
 };
 
 /*
- * Kernel-internal data types:
+ * Ioctls that can be done on a perf counter fd:
  */
+#define PERF_COUNTER_IOC_ENABLE                _IO('$', 0)
+#define PERF_COUNTER_IOC_DISABLE       _IO('$', 1)
+
+#ifdef __KERNEL__
+/*
+ * Kernel-internal data types and definitions:
+ */
+
+#ifdef CONFIG_PERF_COUNTERS
+# include <asm/perf_counter.h>
+#endif
+
+#include <linux/list.h>
+#include <linux/mutex.h>
+#include <linux/rculist.h>
+#include <linux/rcupdate.h>
+#include <linux/spinlock.h>
+#include <asm/atomic.h>
+
+struct task_struct;
 
 /**
  * struct hw_perf_counter - performance counter hardware details:
@@ -141,6 +156,7 @@ struct hw_perf_counter_ops {
  * enum perf_counter_active_state - the states of a counter
  */
 enum perf_counter_active_state {
+       PERF_COUNTER_STATE_ERROR        = -2,
        PERF_COUNTER_STATE_OFF          = -1,
        PERF_COUNTER_STATE_INACTIVE     =  0,
        PERF_COUNTER_STATE_ACTIVE       =  1,
@@ -159,6 +175,7 @@ struct perf_counter {
        const struct hw_perf_counter_ops *hw_ops;
 
        enum perf_counter_active_state  state;
+       enum perf_counter_active_state  prev_state;
        atomic64_t                      count;
 
        struct perf_counter_hw_event    hw_event;
@@ -169,8 +186,10 @@ struct perf_counter {
        struct file                     *filp;
 
        struct perf_counter             *parent;
+       struct list_head                child_list;
+
        /*
-        * Protect attach/detach:
+        * Protect attach/detach and child_list:
         */
        struct mutex                    mutex;
 
@@ -195,13 +214,21 @@ struct perf_counter {
 struct perf_counter_context {
 #ifdef CONFIG_PERF_COUNTERS
        /*
-        * Protect the list of counters:
+        * Protect the states of the counters in the list,
+        * nr_active, and the list:
         */
        spinlock_t              lock;
+       /*
+        * Protect the list of counters.  Locking either mutex or lock
+        * is sufficient to ensure the list doesn't change; to change
+        * the list you need to lock both the mutex and the spinlock.
+        */
+       struct mutex            mutex;
 
        struct list_head        counter_list;
        int                     nr_counters;
        int                     nr_active;
+       int                     is_active;
        struct task_struct      *task;
 #endif
 };
@@ -214,6 +241,7 @@ struct perf_cpu_context {
        struct perf_counter_context     *task_ctx;
        int                             active_oncpu;
        int                             max_pertask;
+       int                             exclusive;
 };
 
 /*
@@ -232,10 +260,22 @@ extern void perf_counter_init_task(struct task_struct *child);
 extern void perf_counter_exit_task(struct task_struct *child);
 extern void perf_counter_notify(struct pt_regs *regs);
 extern void perf_counter_print_debug(void);
+extern void perf_counter_unthrottle(void);
 extern u64 hw_perf_save_disable(void);
 extern void hw_perf_restore(u64 ctrl);
 extern int perf_counter_task_disable(void);
 extern int perf_counter_task_enable(void);
+extern int hw_perf_group_sched_in(struct perf_counter *group_leader,
+              struct perf_cpu_context *cpuctx,
+              struct perf_counter_context *ctx, int cpu);
+
+/*
+ * Return 1 for a software counter, 0 for a hardware counter
+ */
+static inline int is_software_counter(struct perf_counter *counter)
+{
+       return !counter->hw_event.raw && counter->hw_event.type < 0;
+}
 
 #else
 static inline void
@@ -248,10 +288,12 @@ static inline void perf_counter_init_task(struct task_struct *child)      { }
 static inline void perf_counter_exit_task(struct task_struct *child)   { }
 static inline void perf_counter_notify(struct pt_regs *regs)           { }
 static inline void perf_counter_print_debug(void)                      { }
+static inline void perf_counter_unthrottle(void)                       { }
 static inline void hw_perf_restore(u64 ctrl)                   { }
 static inline u64 hw_perf_save_disable(void)                 { return 0; }
 static inline int perf_counter_task_disable(void)      { return -EINVAL; }
 static inline int perf_counter_task_enable(void)       { return -EINVAL; }
 #endif
 
+#endif /* __KERNEL__ */
 #endif /* _LINUX_PERF_COUNTER_H */
This page took 0.027581 seconds and 5 git commands to generate.